본문 바로가기

Container/Docker

11. Docker Container Life Cycle

이번 장에서는 컨테이너 라이프 사이클을 확인하고 라이프 사이클에 따라 
 
컨테이너의 상태를 조정하는 명령 및 컨테이너의 상태를 확인하는 명령에 대해 
 
docker command 신규버전으로 살펴보고 정리하는 시간을 가지도록 하자.
 
 
  
docker container run
 
받은 이미지를 컨테이너로 생성<create> 후 실행<start> 한다.
 
도커 이미지가 컨테이너로 생성된다는 것은 
 
도커 이미지가 host os 를 공유해서 프로세스가 동작하는 격리 공간을 가지게 된다는 의미 이다.
 
그리고 현재 상태는 실행중<running> 이 된다. (라이프 사이클 확인)
 
$ docker container run -i -t ---name hello ubuntu:14.04 /bin/bash
$ docker container run --publish 8080:80 --name webhost --detach nginx:1.11 nginx -T
 
위와 같이 실행 시킬 때 내부에서 일어나는 일은 아래와 같다.
 
    1. 이미지 캐시를 뒤진다. (로컬)
    2. 이미지 래포지토리를 뒤진다 (Docker Hub 가 Default)
    3. 찾은 이미지가 있으면 해당 이미지의 지정한 버전을 다운로드 받는다 (nginx:1.1)
    4. 이미지를 기반으로 컨테이너를 생성한다. (컨테이너의 상태 Created)
    5. 도커 엔진에서 private network 를 구성하고 virtual IP 를 컨테이너에 할당한다.
    6. --publish(-p) 이 있는 경우 지정한 포트를 개방한다.
    7. 이미지의 Dockerfile 에 지정한 ENTRYPOINT 나 CMD 를 시작한다. (컨테이너의 상태 Running)
 
자주 사용되는 옵션은 아래와 같다. 
 
자원 할당
    -c , --cpu-shares : cpu 자원 분배 , default 1024
    -m, --memory : 메모리 한계를 설정 , --memory="1000k" b,k,m,g 사용가능
 
표준입력 및 터미널 사용
   -i, --interactive : 표준 입력을 활성화
    -t, --tty : 터미널을 활성화
 
폴더 공유
    -v, --volume : host OS 와 공유할 디렉토리를 설정 -v /hostDir:/contDir
 
포트공유
    -p, --publish : 컨테이너의 특정 포트를 외부에 노출하고 호스트 포트와 연결
                        -p 5555(호스트포트):80(컨테이너 포트)
    --expose  : 컨테이너 포트를 외부에 노출
 
이름
    --name : 실행할 컨테이너의 이름을 붙인다. 넣지 않으면 도커가 자동으로 붙인다.
 
 
그리고 컨테이너를 실행할 때 실행한 프로그램이 종료되면 ( 여기서는 exit 혹은 ctrl + d 컨테이너
 
상태가 정지<Stopped> 가 된다.
 
컨테이너를  정지하지 않고 bash 에서 나오려고 하는 경우에는 ctrl + pq 버튼을 누르면 된다.
 
 
docker container exec
 
기존에 running 중인 컨테이너에 들어가서 추가로 작업을 하고 싶은 경우
 
( 새로운 컨테이너를 만들고 싶지 않은 경우 ) 사용하는 명령어다.
 
$ docker container exec -it mysql bash
    > exit 명령으로 빠져나오자.
docker container  ls
   > exit 로 빠져나왔음에도 실행한 컨테이너 인스턴스가 running 중이며 인스턴스가 추가되지 않는다.
 
 
docker container stop
 
도커가 실행중인 상태에서 ctrl + pq 버튼으로 실행중인 컨테이너에서 빠져 나온 경우
 
실행중인 컨테이너를 종료하고자 하는 경우 사용한다.
 
이 경우 도커의 상태가 정지<stopped> 가 된다.
 
$ docker container stop hello
 
 
docker container start
 
컨테이너의 상태가 정지<Stopped> 인 상태에서 컨테이너 상태를
 
실행중 <Running> 으로 바꾸기 위해서 사용한다.
 
run 과의 차이점은 단순히 컨테이너를 실행중으로 바꾸는 명령이며 
 
실제 해당 컨테이너 내부로 들어가진 않는다.
 
$ docker container start hello
 
 
docker container  attach
 
docker start 명령후 실행중인 컨테이너에 접속할 때 사용한다.
 
명령을 치고 엔터 두번을 쳐야 들어간다. 
 
$ docker container attach hello
 
 
docker container  restart
 
ctrl + pq 로 컨테이너 외부에서 해당 컨테이너를 재시작하고자 하는 경우 사용한다.
 
OS 재부팅처럼 컨테이너를 재시작 한다.
 
$ docker container restart hello
 
 
docker container  rm
 
아예 컨테이너를 지우고자 하는 경우 사용한다.
 
$ docker container rm hello
 
 
docker container ps
 
컨테이너 목록을 확인할 때 아래 명령어를 사용한다.
 
$ docker container ps -a
-a 옵션을 사용하면 종료 및 실행중인 컨테이너가 출력되고 
 
-a 옵션을 사용하지 않으면 실행중인 것만 보인다.
 
 
docker container top
 
마치 리눅스 ps (processes) 명령처럼 작동하고 옵션도 ps 명령과 동일하게 준다.
 
다만 컨테이너에서 실행되고 있는 프로세스 리스트를 출력하는 명령이다.
 
특정 컨테이너만 표시하고 싶은 경우는 컨테이너 이름을 docker container top 명령 뒤에 넣어주면 된다.
 
리눅스 ps 명령의 옵션은 아래와 같다.
 
-a: 모든 사용자의 프로세스를 출력
-u: 각 프로세스의 사용자(UID)를 표시
-s: 시그널을 표시
-v: 가상 메모리를 표시
-x: 자신을 실행시킨 셸이 없는 프로세스를 출력
-c: 커널에서 사용되는 프로세스 이름으로 표시
-e: 환경 변수를 표시
-f: 내용을 완전한 형태로 표시
-l: 자세한 형식으로 출력
-n: WCHAN 값을 숫자료 출력
 
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b9b966b4105e        mongo               "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        27017/tcp           mongo
 
$ docker top mongo aux
USER     PID      %CPU    %MEM   VSZ        RSS        TTY       STAT      START       TIME     COMMAND
999      33840    1.1         5.3       985320   53584      ?          Ssl         23:33         0:01     mongod --bind_ip_all
 
root@server:~# ps aux | grep mongo
999       33840  0.6  4.8 991084 48296 ?        Ssl  23:33   0:02 mongod --bind_ip_all
root      34091  0.0  0.0  15504   892 pts/19   S+   23:40   0:00 grep --color=auto mongo
 
위의 테스트 코드에서 보면 결국 컨테이너가 실행되어도
 
현재 커널 기반으로 실행되기 때문에 process 가 현재 커널에 그대로 
 
실행되고 있는 것을 확인할 수 있다. (ps aux 명령)
 
이 부분이 일반 VM 과의 차이점이다. (VM 은 OS 부터 완전히 분리된다.)
 
 
docker container inspect
 
컨테이너의 모든 Config 에 대한 JSON Array 가 리턴된다.
 
$ docker container run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql
$ docker container inspect mysql
  ...
 
 
docker container stats
 
컨테이너의 모든 Config 에 대한 JSON Array 가 리턴된다.
 
$ docker container run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql
$ docker container stats mysql
  (Ctrl +C 로 빠져나옴)
 

'Container > Docker' 카테고리의 다른 글

13. Docker Network Overview  (0) 2020.01.14
12. Docker Compose  (0) 2020.01.14
10. Docker Image 생성 (도커파일)  (0) 2020.01.14
09. Docker Image 생성 (기존이미지 사용)  (0) 2020.01.14
08. Docker Image Inspect  (0) 2020.01.14