-
도커 컨테이너 실행하기BackEnd/도커 2021. 3. 7. 14:25
컨테이너 실행하기(run) > 웹 앱 실행하기 > mysql 에 워드프레스 설치하기 > 자주 사용하는 명령어
도커 실행
도커 허브를 켜야 도커 클라이언트를 사용할 수 있다.
> cmd 에서 docker 명령을 하기 위해서는 로컬 pc 에 설치한 도커 허브를 시작해야한다.
docker 라는 명령어를 통해 client 에서 server 로 명령을 전달할 수 있다.
컨테이너 실행하기
docker run [option] 이미지명:태그 [command] [arg..]
* run 은 create + start 를 합친 명령어로, 명령어가 컨테이너를 생성, 실행함.
- create 할 때 파일스냅샷을 컨테이너 하드디스크에 적재
- start 할 때 run 명령어를 컨테이너 실행 명령어로 적재
이미지가 cache 저장소(var/lib/docker)나 Docker Hub에 존재하는 것을 pull 해오고,
가져온 이미지를 컨테이너의 하드디스크에 적재하고, 커널을 통해 파일시스템 등 리소스를 이용해 이미지를 실행한다.* [command] 에 입력을 한다면 시작 명령어를 무시하고 command 를 실행한다.
docker run --rm --it ubuntu:20.04 /bin/sh
run 명령어를 사용하면 사용할 이미지가 있는지 확인하고 없다면 다운로드(pull)한 후 컨테이너를 create 하고 start 한다.
컨테이너는 정상적으로 실행되지만 다른 작업에 대한 명령이 없기 때문에 컨테이너는 실행되자마자 종료된다.
컨테이너는 프로세스이기때문에 실행중인 프로세스가 없으면 컨테이너는 종료된다.
/sh 는 shell 을 의미한다.
# 은 ubuntu 의 shell 안에 들어왔음을 의미한다.
shell 안에 들어와 이전처럼 컨테이너가 바로 종료되지 않는다.
ls 는 내 파일목록이 아닌 ubuntu 컨테이너 내 파일목록이다.
--rm 옵션이 없는 경우 exit 을 통해 나오면
컨테이너 실행-중지-삭제 단계 중 중지상태가 되고 다시 컨테이너에 붙을 수 있다.
[ Options ]
-d detached mode(백그라운드 모드)
컨테이너 실행 후 바로 빠져나와 다른 작업을 실행할 수 있는 상태가 된다
docker run -d -p 5000:8080 이미지명-p 호스트와 컨테이너의 포트를 연결한다. -v 호스트와 컨테이너의 디렉토리를 연결
필요한 파일을 컨테이너로 넣어줄 수도 있고, 컨테이너 내 생성된 내용이 백업될 수 도 있다.
컨테이너 정지하면 데이터 날라가기 때문.-e 컨테이너 내에서 사용할 환경변수를 설정 --name 컨테이너 이름 설정
--name 컨테이너이름 이미지이름:버전--rm 프로세스 종료 시 컨테이너 자동 제거 -it i : interactive , t: terminal 터미널 입력을 할 수 있다.
docker exec -it mysql bash
> 실행되고 있는 컨테이너에 mysql 내로 접속해 원하는 작업을 할 수 있다.network 네트워크 연결 *-p 포트포워딩
도커컨테이너는 네트워크 구성 상 NAT(Network Address Translation) 내부망에서 동작하고 공인 IP 가 아닌
사설IP 를 사용해 기본적으로 컨테이너 외부(인터넷망 등)에서 내부로 접속이 불가능하다.
이를 극복하기 위해 NAT 환경에서 포트 포워딩이라는 기법을 사용한다.
NAT 가 동작하는 라우터/게이트웨이의 특정 포트 번호로 유입하는 트래픽을 NAT 내부에서 동작하는 시스템의 특정 포트로 전달해주는 기법이다.
예로 NAT 내부에서 TCP 2000포트로 접속되는 서버 프로그램이 동작하면 NAT 라우터/게이트웨이는 TCP 2000포트로 들어오는 모든 트래픽을 NAT 내부망 특정 IP 를 갖는 시스템의 TCP 2000으로 무조건 전달하게 설정할 수 있다.
도커 시스템 관점에서 NAT 구성을 살펴보면 도커를 구동하는 호스트 시스템이 라우터/게이트웨이,
도커 컨테이너는 NAT 망 내부 시스템이 된다.
-p 8080:80/tcp 호스트 8080으로 들어오는 트래픽은 도커 컨테이너 80번으로 전달된다.
overlay network
* -v 볼륨
-v ${pwd}:/usr/src/app volume 로컬디렉토리:도커경로
jar 파일을 copy 를 통해 컨테이너에 담아 사용하면 수정 사항 반영을 하려면 빌드와 재기동 단계를 다시 실행해야한다.
개발 시 이런 번거로움을 줄이기 위해 도커 컨테이너가 로컬 파일을 바라보게해 수정에 대해 즉각적으로 확인할 수
있도록 하는 것이 볼륨이다.
도커 컨테이너 내에 존재해 참조할 필요가 없는 파일을 볼륨으로 명시할 수도 있다.
경로를 도커 컨테이너 경로를 명시하면 로컬을 참조하지 않는다.
-v usr/src/app/node_modules
docker run -d -p 5000:9090 -v usr/src/app/node_modules -v ${pwd}:/usr/src/app 이미지아이디
웹어플리케이션 실행하기
docker run --rm --p 5678:5678 hashicorp/http-echo -text="hello world" hashicorp 라는 회사에서 만든 http-echo 라는 웹서버 를 띄우고, -p 5678 포트로 연결한다.
localhost:5678 에 접속하면 "hello world" 라는 메세지를 볼수 있다.
curl 명령어를 이용하면 브라우저처럼 http 로 접속해서 결과 받아온다.
curl localhost:5678 "hello world"
5679로 호스트 포트만 변경해서 다른 메세지를 정의해 실행하면
컨테이너의 5678 포트로 두 개의 웹 서버가 서로 격리되어 충돌하지 않는 웹서버로 실행이 된다.
mysql 에 워드프레스 블로그 실행하기
mysql 에 wordpress 를 저장할 수 있도록 wp 라는 이름의 데이터베이스 생성
create database wp CHARACTER set utf8; grant all privileges on wp.* to wp@'%' identified by 'wp'; flush privileges; quit
앞서 만든 mysql 을 실행한 상태에서 진행
docker run -d -p 8080:80 -e WORDPRESS_DB_HOST=host.docker.internal -e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress
>docker exec -it mysql mysql 로 mysql 접속해서 database 를 확인해보면 wp 가 새로 추가된 것을 볼 수 있다.
wp 로 들어가 table 을 조회하면 워드프레스 관련 테이블들이 생성되어 있는 것을 볼 수 있다.
user 를 검색해보면 아까 가입한 내 정보를 확인할 수도 있다.
자주 사용하는 도커 명령어
docker ps -a 모든 컨테이너 리스트
(-a 가 없으면 실행 중인 컨테이너만 나옴)docker images 모든 이미지 리스트 docker start [options] 컨테이너명 컨테이너 시작
-a 옵션 : attach 컨테이너에 붙어서 로그가 계속 나옴docker stop [options] 컨테이너명 실행 중인 컨테이너 중지 docker logs [options] 컨테이너 컨테이너 정상 동작 중인지 확인
-f 옵션 : 대기중인 상태로 추가적인 로그가 생기면 계속 보여줌docker rm [options] 컨테이너 컨테이너 삭제 docker pull [options] repository:tag 이미지를 직접 다운로드 docker exec [options] 컨테이너명 [command] 이미 실행 중인 컨테이너에 exec 로는 원하는 작업을 할 수 있다.
docker exec -it mysql bash
ocker exec mysql bashdocker system prune 중지된 컨테이너의 모든 자원을 삭제 docker rm `docker -a -q`
docker rm $(docker -a -q)중지된 모든 컨테이너를 삭제
`` 내에 명령어가 실행되며 나오는 컨테이너 번호를 rm 함*ps 상태를 볼 때 원하는 정보만 지정해서 볼 수도 있다.
$ docker ps --format "table {{.Image}}\t{{.Status}}\t{{.Ports}}" \(tab)는 화면에 표시할 때 tab 표시로 간격 주도록 한 것
1. ID : Container ID
2. Image : docker image
3. Command : container 실행시 사용한 command
4. Created : 컨테이너가 생성된 시간입니다.
5. Status : 컨테이너의 상태입니다. 실행중은 Up 종료는 Exited, 일시정지 Pause 등이 있습니다.
6. Ports : 컨테이너가 개방한 포트와 호스트에 연결한 포트입니다. 특별한 설정을 하지 않은 경우 출력되지 않습니다.
7. Names : container name
network create 명령어
mysql과 wordpress 서로 연결 시 , 각각의 이름이 있으면 연결하기 편한데,
만약 이름이 없으면 host internal 이라는 가상의 네트워크를 통해 연결하는데..
기존 코드 (1.도커 컨테이너 실행하기 내용) docker run -d -p 8888:80 -e WORDPRESS_DB_HOST=host.docker.internal -e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress
network 를 만들면 아래와 같이 연결할 수 있다.
docker network create app-network
docker network connect app-network mysql
워드프레스를 app-network 에 속하게 하고 mysql 을 이름으로 접근한다.
docker run -d -p 8888:80 --network=app-network -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress
반응형'BackEnd > 도커' 카테고리의 다른 글
도커 네트워크 관련 링크 (0) 2022.08.06 도커 이미지 빌드 Dockerfile (0) 2021.03.28 도커 컴포즈 (0) 2021.03.24