[Docker] 컨테이너 LifeCycle
1. 컨테이너 LifeCycle
2. 컨테이너 생성, 시작
1) 컨테이너 생성
이미지로부터 컨테이너를 생성한다. 컨테이너를 생성하게 되면 이미지에 포함될 Linux의 디렉토리와 파일(/etc,/bin 등)들의 스냅샷을 추출한다. 컨테이너 생성은 컨테이너를 시작하는것이 아닌, 기동시키기위한 상태를 준비하는 과정이다.
sudo docker container create [명령]
2) 컨테이너 생성 및 시작
이미지로부터 컨테이너를 생성하고 컨테이너 상에서 임의의 프로세스를 시작한다. Linux 프로세스 관리와 동일하게 NginX 등의 서버 프로세스를 백그라운드로 실행하거나 강제 종료하는 일이 가능하다. 포트 번호와 같은 네트워크 설정하여 외부에서 컨테이너의 프로세스에 엑세스할 수 있다.
sudo docker container run [옵션] [이미지명:태그명] [인수]
옵션 | 설명 |
--attach, -a | 표준 입력(STDIN), 표준 출력(STDOUT), 표준 오류 출력(STDERR)에 어태치한다. |
--cidfile | 컨테이너 ID를 파일로 출력한다. |
--detach, -d | 컨테이너를 생성하고 백그라운드에서 실행한다. |
--interactive, -i | 컨테이너의 표준 입력을 연다. |
--tty, -t | 단말기 디바이스를 사용한다. |
--user, -u | 사용자명을 지정한다. |
--restart=[no | on-failure | on-failure:횟수 | always | unless-stopped] | 명령의 실행 결과에 따라 재시작을 하는 옵션이다. |
--rm | 명령 실행 완료 후 컨테이너를 자동 삭제한다. |
// centos 이름의 이미지를 바탕으로 test라는 이름의 컨테이너를 생성하고 컨테이너 안에서 명령(/bin/cal)을 실행하여 결과를 콘솔에 출력
// '--name' 옵션이 생략될 경우 컨테이너 이름은 랜덤으로 자동 설정된다.
sudo docker container run -it --name "test1" centos /bin/cal
// centos 이름의 이미지를 바탕으로 컨테이너를 생성하고 localhost에 대해 ping 명령을 백그라운드로 실행 (결과는 식별자 ID)
sudo docker container run -d centos /bin/ping localhost
// 백그라운드로 실행된 내용을 확인
sudo docker container logs -t [컨테이너 식별자]
3) 컨테이너 네트워크 설정
sudo docker container run [네트워크 옵션] [이미지명:태그명] [인수]
옵션 | 설명 |
--add-host=[호스트명:IP주소] | 컨테이너의 /etc/hosts에 호스트명과 IP주소를 정의한다. |
--dns=[IP주소] | 컨테이너용 DNS 서버 IP 주소를 지정한다. |
--expose | 지정한 범위의 포트 번호를 할당한다. |
--mac-address=[MAC주소] | 컨테이너의 MAC 주소를 지정한다. |
--net=[bridge | none | container:<name | id> | hosst | NETWORK] | 컨테이너의 네트워크를 지정한다. |
--hostname, -h | 컨테이너 자신의 호스트명을 지정한다. |
--publish, -p[호스트의 포트 번호]:[컨테이너의 포트 번호] | 호스트와 컨테이너의 포트 매핑을 한다. |
--publish-all, -p | 호스트의 임의의 포트를 컨테이너에 할당한다. |
// nginx라는 이름의 이미지를 바탕으로 컨테이너를 실행하고, 호스트 포트(8080)를 컨테이너 포트(80)를 매핑하여 백그라운드에서 실행
sudo docker container run -d -p 8080:80 nginx
// 컨테이너의 DNS 서버 지정
sudo docker container run -d --dns 192.168.1.1 nginx
// 컨테이너의 MAC 주소 지정 및 확인
sudo docker container run -d --mac-address=[MAC주소] centos
sudo docker container inspect --format"{{ .Config.MacAddress }}" 2a5f
// 컨테이너의 /etc/hosts에 호스트명과 IP 주소 정의 및 확인
sudo docker container run -it --add-host test.com:192.168.1.1 centos
sudo cat /etc/hosts
// 외부 브리지 네트워크 드라이버를 이용하여 web-net 이름의 네트워크 작성 후 컨테이너 실행
sudo docker network create -d bridge web-net
sudo docker container run --net=web-net -it centos
4) 자원을 지정한 컨테이너 생성 및 실행
CPU나 메모리와 같은 자원을 지정하여 컨테이너를 생성 및 실행할 수 있다.
sudo docker container run [자원 옵션] [이미지명:태그명] [인수]
옵션 | 설명 |
--cpu-shares, -c | CPU의 사용 배분(비율)을 설정한다. |
--memory, -m | 사용할 메모리를 제한하여 실행한다. |
--volume=[호스트의 디렉토리:컨테이너의 디렉토리], -v | 호스트와 컨테이너의 디렉토리를 공유한다. |
// CPU 시간을 절반으로 할당(기본값 1024)
sudo docker container run --cpu-shares=512 --memory=1g centos
// 호스트 OS와 컨테이너 디렉토리 공유
sudo docker container run -v /Users/test/sharedir:/usr/share/nginx/html nginx
5) 환경을 지정한 컨테이너 생성 및 실행
컨테이너의 환경변수나 컨테이너 안의 작업 디렉토리 등을 지정하여 컨테이너를 실행할 수 있다. 환경변수 각각을 하나씩 설정하는 방법과 일괄적으로 등록할 수 있도록 파일을 생성하여 설정할 수 있다.
sudo docker container run [환경설정 옵션] [이미지명:태그명] [인수]
옵션 | 설명 |
--env=[환경변수], -e | 환경변수를 설정한다. |
--env-file=[파일명] | 환경변수를 파일로부터 설정한다. |
--read-only=[true | false] | 컨테이너의 파일 시스템을 읽기 전용 여부를 선택한다. |
--workdir=[패스], -w | 컨테이너의 작업 디렉토리를 설정한다. |
--user=[사용자명], -u | 사용자명 또는 UID를 지정한다. |
2. 컨테이너 확인
1) 동작하는 컨테이너 목록 확인
출력 결과로는 컨테이너 ID, 바탕이된 이미지, 컨테이너 안에서 실행되고 있는 명령어, 컨테이너 작성 후 경과 시간, 컨테이너의 상태, 할당된 포트, 컨테이너 이름이 출력된다.
sudo docker container ls [옵션]
옵션 | 설명 |
--all, -a | 실행 중/정지 상태의 모든 컨테이너를 출력한다. |
--filter, -f | 표시할 컨테이너를 필터링한다. |
--format | 표시할 포맷을 지정한다. |
--last, -n | 마지막으로 실행된 n건의 컨테이너만 출력한다. |
--latest, -l | 마지막으로 실행된 컨테이너만 출력한다. |
--no-trunc | 정보 생략없이 출력한다. |
--quiet, -q | 컨테이너 ID만 출력한다. |
--size, -s | 파일 크기를 출력한다. |
출력 형식 placeholder | 설명 |
.ID | 컨테이너 ID |
.Image | 이미지 ID |
.Command | 실행 명령 |
.CreatedAt | 컨테이너가 작성한 시간 |
.RunningFor | 컨테이너의 가동 시간 |
.Ports | 공개 포트 |
.Status | 컨테이너 상태 |
.Size | 컨테이너의 디스크 크기 |
.Names | 컨테이너명 |
.Mounts | 볼륨 마운트 |
.Networks | 네트워크 |
2) 컨테이너 상태 확인
상태 확인 출력 결과로는 컨테이너 식별자, 컨테이너명, CPU 사용률, 메모리 사용량/컨테이너에서 사용할 수 있는 메모리 제한, 메모리 사용률, 네트워크 I/O, 블록 I/O, PID 항목이 출력된다.
sudo docker container stats [컨테이너 식별자]
3. 컨테이너 시작, 중지, 삭제
1) 컨테이너 시작 및 중지
정지 중인 컨테이너를 시작할 때 사용한다. 컨테이너에 할당된 컨테이너 식별자를 지정하여 동작한다.
// 컨테이너 시작
sudo docker container start [명령]
// 컨테이너 중지
sudo docker container stop [명령]
// 컨테이너 일시 중지
sudo docker container pause [명령]
// 컨테이너 재시작
sudo docker container restart [명령]
2) 컨테이너 삭제 및 상태 확인
컨테이너를 삭제할 때에는 컨테이너를 중지 시킨 후 진행해야한다.
// 컨테이너 삭제
sudo docker container rm [명령]
// 컨테이너 상태 확인
sudo docker container ps [명령]
[참고] medium.com/future-vision/docker-lifecycle-tutorial-and-quickstart-guide-c5fd5b987e0d
[참고] 완벽한 IT 인프라 구축을 위한 Docker (2판)