도커 컨테이너 라이프사이클

image

도커 컨테이너를 run 상태로 만들기 위해서는 docker run 이나 docker create 명령어를 통해 컨테이너를 만들고 docker start하는 방법 2가지가 있다. 도커 컨테이너는 중지된다고 삭제되지 않는 것을 볼 수 있다.

도커 컨테이너 시작

만약 도커 이미지가 로컬에 없을 경우 자동으로 docker image pull을 먼저 진행한다.

  1. docker run
$ docker run [image]

image

docker ps -a 명령어를 통해 모든 컨테이너를 확인할 수 있다.

image

docker images 명렁어를 통해 로컬상의 도커 이미지를 확인할 수 있다.

image

  1. docker create & docker start
$ docker create [image]
$ docker start [container name or container ID]

image

image


docker run 옵션

$ docker run \
-i \  # 호스트의 표준입력을 컨테이너의 표준입력과 연결 (interactive)
-t \  # TTY 할당
--rm \  # 컨테이너가 종료되면 자동으로 컨테이너 삭제
-d \    # 백그라운드 모드로 실행 (detached)
--name hello-world \  # 컨테이너 이름 지정 (지정하지 않으면 자동으로 이름 부여됨) 
-p 80:80 \  # 호스트 운영체제와 컨테이너 간 네트워크 포트 바인딩
-v /opt/example:/example \  # 호스트와 컨테이너 간의 볼륨 바인딩 - 파일 시스템 (디렉토리) 마운트
registry/hello-world:latest \  # 실행할 이미지
my-command   # 컨테이너 내에서 실행할 명령어 

컨테이너에서 실행되는 어플리케이션이 키보드 입력을 필요로 하는 경우에 -i 옵션을 사용하여 호스트에서의 키보드 입력이 컨테이너로 전달되도록 한다.

-t 옵션은 컨테이너에 TTY를 할당하여 터미널 명령어를 수행할 수 있게 한다. -i옵션과 -t 옵션은 보통 같이 사용하며 도커 컨테이너 안에서 shell을 실행할 때 사용한다.

-d 옵션은 컨테이너를 백그라운드 모드로 실행한다. 도커 컨테이너로 서비스를 운영할 때 컨테이너가 daemon 형태로 백그라운드에서 동작해야 한다.

-v 옵션은 컨테이너가 호스트의 파일 시스템에 접근할 수 있도록 한다.

-it 옵션

ubuntu:focal 이미지를 사용해 컨테이너를 만들어 보자.

image

위와 같이 ubuntu:focal 이미지를 사용해 컨테이너를 만들어 보면 컨테이너가 바로 종료되는 것을 볼 수 있다. 그 이유는 bash 명령어가 포그라운드 형태로 동작하지 않고 interactive한 표준 입력을 필요로 하는 어플리케이션이기 때문이다.

이럴 때 사용하는 것이 -it 옵션이다.

image

이제 컨테이너가 정상적으로 동작하고, 컨테이너 내부의 파일 시스템에서 명령어를 실행할 수 있다. 컨테이너를 빠져나가면 컨테이너가 종료된다.

컨테이너를 종료시키지 않고 빠져나가려면 ctrl + p , q 를 입력하면 된다.

-d 옵션

image

-d 옵션을 주면 아래와 같이 백그라운드 형태로 실행할 수 있다.

image

–name 옵션

image

-p 옵션

-p host port:container port

image

위의 예시처럼 컨테이너의 80번 포트와 호스트의 80번 포트를 연결할 수 있다. (nginx의 기본 포트가 80이다) localhost에 80 포트에 curl 요청을 날려보면 nginx가 실행중인 것을 확인할 수 있다.

image

command

우분투 환경체제에서 id 명령어를 실행하고 종료된 것을 볼 수 있다.

image

–rm

image


컨테이너 상태 확인

실행중인 컨테이너 상태 확인

$ docker ps

전체 컨테이너 상태 확인

$ docker ps -a

컨테이너 상세 정보 확인

$ docker inspect [container]

컨테이너 일시중지 및 재개

컨테이너 일시중지

$ docker pause [container]

image

컨테이너 재개

$ docker unpause [container]

image

컨테이너 종료

컨테이너 종료

$ docker stop [container]

컨테이너 강제 종료

$ docker kill [container]

모든 컨테이너 종료

$ docker stop $(docker ps -a -q)

컨테이너 삭제 (실행중인 컨테이너 삭제 불가)

$ docker rm [container]

컨테이너 강제 종료 후 삭제

$ docker rm -f [container]

컨테이너 실행 종료 후 자동 삭제

$ docker run --rm 

중지된 모든 컨테이너 삭제

$ docker container prune