도커 컨테이너 라이프사이클
도커 컨테이너를 run 상태로 만들기 위해서는 docker run 이나 docker create 명령어를 통해 컨테이너를 만들고 docker start하는 방법 2가지가 있다. 도커 컨테이너는 중지된다고 삭제되지 않는 것을 볼 수 있다.
도커 컨테이너 시작
만약 도커 이미지가 로컬에 없을 경우 자동으로 docker image pull을 먼저 진행한다.
- docker run
$ docker run [image]
docker ps -a 명령어를 통해 모든 컨테이너를 확인할 수 있다.
docker images 명렁어를 통해 로컬상의 도커 이미지를 확인할 수 있다.
- docker create & docker start
$ docker create [image]
$ docker start [container name or container ID]
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 이미지를 사용해 컨테이너를 만들어 보자.
위와 같이 ubuntu:focal 이미지를 사용해 컨테이너를 만들어 보면 컨테이너가 바로 종료되는 것을 볼 수 있다. 그 이유는 bash 명령어가 포그라운드 형태로 동작하지 않고 interactive한 표준 입력을 필요로 하는 어플리케이션이기 때문이다.
이럴 때 사용하는 것이 -it 옵션이다.
이제 컨테이너가 정상적으로 동작하고, 컨테이너 내부의 파일 시스템에서 명령어를 실행할 수 있다. 컨테이너를 빠져나가면 컨테이너가 종료된다.
컨테이너를 종료시키지 않고 빠져나가려면 ctrl + p , q 를 입력하면 된다.
-d 옵션
-d 옵션을 주면 아래와 같이 백그라운드 형태로 실행할 수 있다.
–name 옵션
-p 옵션
-p host port:container port
위의 예시처럼 컨테이너의 80번 포트와 호스트의 80번 포트를 연결할 수 있다. (nginx의 기본 포트가 80이다) localhost에 80 포트에 curl 요청을 날려보면 nginx가 실행중인 것을 확인할 수 있다.
command
우분투 환경체제에서 id 명령어를 실행하고 종료된 것을 볼 수 있다.
–rm
컨테이너 상태 확인
실행중인 컨테이너 상태 확인
$ docker ps
전체 컨테이너 상태 확인
$ docker ps -a
컨테이너 상세 정보 확인
$ docker inspect [container]
컨테이너 일시중지 및 재개
컨테이너 일시중지
$ docker pause [container]
컨테이너 재개
$ docker unpause [container]
컨테이너 종료
컨테이너 종료
$ 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