도커/개념 및 실습

03장-2, 컨테이너 실행

Jaden Park 2021. 6. 1. 10:13

컨테이너 생성 및 확인

  • 컨테이너를 생성하고 시작하는 방법과 한 번에 실행하는 방법이 있다.
  • 그리고 컨테이너가 실행되고 있는지 중지되어 있는지 알 수 있는 명령어를 알아본다.
  • 리소스의 사용량을 확인할 수 있는 명령어를 알아본다.

docker ps

[root@docker ~]# docker ps --help

Usage:  docker ps [OPTIONS]
  • docker ps 명령으로 실행중인 컨테이너 목록을 확인할 수 있다.
  • -a 옵션을 사용하면 현재 호스트에 존재하는 모든 컨테이너를 출력
[root@docker ~]# docker ps
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS     NAMES
f84b62afbea9   ubuntu:latest   "/bin/bash"   8 minutes ago   Up 8 minutes             os2


[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS                       PORTS     NAMES
f84b62afbea9   ubuntu:latest   "/bin/bash"   8 minutes ago   Up 8 minutes                           os2
fcc81af38bc4   ubuntu:latest   "/bin/bash"   9 minutes ago   Exited (127) 8 minutes ago             os1
  • ubuntu 이미지를 사용하는 os1 컨테이너는 /bin/bash 라는 애플리케이션을 실행중이며 상태는 종료되었다.
  • ubuntu 이미지를 사용하는 os2 컨테이너는 /bin/bash 라는 애플리케이션을 실행중이며 상태는 실행중이다.

필드

설명

CONTAINER ID 컨테이너의 고유 ID
IMAGE 컨테이너가 사용하는 이미지
COMMAND 컨테이너에서 실행중인 애플리케이션
CREATED 컨테이너가 생성된 날짜
STATUS 컨테이너의 상태
PORTS 컨테이너에서 사용 중인 포트
NAMES 컨테이너의 이름

 


 

docker create

[root@docker ~]# docker create --help

Usage:  docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
  • docker create 명령으로 컨테이너를 생성할 수 있다.

기본적인 사용 옵션

옵션 설명
-i 연결되어있지 않아도 표준입력을 유지
-t 가상 터미널 지정
--name 컨테이너 이름 지정

httpd 이미지를 사용하여 이름이 web10 인 컨테이너 생성

[root@docker ~]# docker create --name web10 httpd
9aee28976e1816f9e2ba455e420cf84381e5b04ae819fb1b0b2b4e0858d10ace

[root@docker ~]# docker ps -a | grep web10
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS             PORTS     NAMES
9aee28976e18   httpd             "httpd-foreground"       34 seconds ago      Created                      web10
  • STATUS 필드 값이 Created 로 나타나는데, 이는 컨테이너가 생성된 상태인 것을 의미

centos 이미지를 사용하여 os10 컨테이너를 생성

[root@docker ~]# docker create -it --name os10 centos
86bd21d05a26b378dd41a25942a6b507e01183323c39762c42bc62c3030c2c35

[root@docker ~]# docker ps -a | grep os10
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS             PORTS     NAMES
86bd21d05a26   centos            "/bin/bash"              11 seconds ago      Created                      os10
  • centos 이미지는 쉘 프로그램을 실행하기 떄문에 표준 입력과 표준 출력/에러를 위한 터미널이 필요하다.
  • 따라서, -it 옵션을 함께 사용해야 한다.

docker start

[root@docker ~]# docker start --help

Usage:  docker start [OPTIONS] CONTAINER [CONTAINER...]
  • docker start 명령은 중지되어 있거나 생성된 컨테이너를 시작할 수 있다.

기본적인 사용 옵션

옵션 설명
-i 컨테이너의 표준입력에 연결
-a 컨테이너의 표준출력/에러에 연결

앞에서 생성했던 web10 컨테이너 시작

[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS             PORTS     NAMES
9aee28976e18   httpd             "httpd-foreground"       5 minutes ago    Up 10 seconds      80/tcp    web10
  • web10 컨테이너의 상태가 UP 인 것을 확인할 수 있다.
  • web10 컨테이너는 웹 서비스 컨테이너이므로 컨테이너가 정상적으로 동작하는 확인하려면 curl 명령을 사용해서 확인한다.
  • curl 명령으로 web10 컨테이너에 접근하려면 docker inspect 명령으로 IP 주소를 확인해야 한다.
[root@docker ~]# docker inspect web10 | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.6",
                    "IPAddress": "172.17.0.6",

[root@docker ~]# curl 172.17.0.6
<html><body><h1>It works!</h1></body></html>
  • 출력된 내용은 컨테이너에 저장된 웹 페이지 기본 파일 내용
  • 해당 내용이 나타나면 web10 컨테이너는 정상적으로 동작 중이다.

os10 컨테이너를 시작

[root@docker ~]# docker start -ai os10
[root@86bd21d05a2]

CTRL + P + Q
[root@docker ~]#
  • 컨테이너를 종료하지 않고 다시 호스트의 쉘로 돌아오려면 CTRL + P + Q 를 입력한다.

docker run

[root@docker ~]# docker run --help

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • docker run 명령을 사용하여 컨테이너를 바로 실행할 수 있다.
  • 이 명령을 사용하면 create 와 start를 과정을 생략할 수도 있다.

대표적인 기본 옵션

옵션 설명
-i 연결되어있지 않아도 표준입력을 유지
-t 가상 터미널 지정
-d 컨테이너 실행 시 분리모드로 진행
--name 컨테이너 이름 지정

docker run 명령으로 web20 컨테이너를 실행

[root@docker ~]# docker run -d --name web20 httpd:latest
4aa3cbecc05273497d4c29015dfdd0dd4b30720b9696f820737ad470cad3a7ee

[root@docker ~]# docker ps | grep web20
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS             PORTS     NAMES
4aa3cbecc052   httpd:latest      "httpd-foreground"       About a minute ago   Up About a minute   80/tcp    web20
  • 이미지의의 CMD에 서비스 또는 데몬이 지정되어 있으면 -d 옵션을 함께 사용해야한다.

CMD에 쉘 프로그램이 지정되어 있는 이미지로 os30 컨테이너를 실행

[root@docker ~]# docker run -it --name os30 centos
[root@390384b22b04 /]#

CTRL + P + Q

[root@docker ~]# docker ps | grep os30
390384b22b04   centos            "/bin/bash"              22 seconds ago      Up 21 seconds                os30
  • docker run 명령은 이미지에 지정되어 있는 애플리케이션만 실행하는 것이 아니라 사용자가 지정한 명령을 CMD로 지정할 수 있다.
  • 물론 CMD에 지정하는 명령은 이미지에 존재해야 한다.

os40 컨테이너를 실행하면서 hostname 명령을 실행

[root@docker ~]# docker run --name os40 centos hostname
658c45a32ef0

[root@docker ~]# docker ps -a | grep os40
658c45a32ef0   centos            "hostname"               20 seconds ago      Exited (0) 19 seconds ago             os40
  • docker ps -a 명령으로 종료된 것을 확인할 수 있다.
  • 이는 hostname 이란 명령이 지속적으로 유지되는 프로세스가 아니라 한번 실행하고 종료되는 프로세스이기 때문
  • 나중에 종종 이런 형태로 실행되는 컨테이너를 확인할 수 있는데 이 컨테이너는 수동으로 삭제해야한다.
    • 이 작업이 번거로우면 docker run 명령을 실핼할 때 --rm 을 함께 사용하면 편리하다
[root@docker ~]# docker run --name os50 --rm centos hostname
7e3b8c2b89f4
[root@docker ~]# docker ps -a | grep os50
[root@docker ~]# 

 


docker stats

[root@docker ~]# docker stats --help

Usage:  docker stats [OPTIONS] [CONTAINER...]
  • docker stats 명령으로 컨테이너의 실시간 상태를 확인할 수 있다
옵션 설명
-a 모든 컨테이너 확인
--no-stream 스트리밍 출력 하지 않음
docker stats
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O   PIDS
5d10434af029   web1      0.01%     14.77MiB / 3.701GiB   0.39%     656B / 0B   0B / 0B     82
f84b62afbea9   os2       0.00%     556KiB / 3.701GiB     0.01%     656B / 0B   0B / 0B     1

docker stats -a
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O   PIDS
5d10434af029   web1      0.01%     14.77MiB / 3.701GiB   0.39%     656B / 0B   0B / 0B     82
f84b62afbea9   os2       0.00%     556KiB / 3.701GiB     0.01%     656B / 0B   0B / 0B     1
fcc81af38bc4   os1       0.00%     0B / 0B               0.00%     0B / 0B     0B / 0B     0

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O   PIDS
5d10434af029   web1      0.01%     14.77MiB / 3.701GiB   0.39%     656B / 0B   0B / 0B     82
f84b62afbea9   os2       0.00%     556KiB / 3.701GiB     0.01%     656B / 0B   0B / 0B     1
fcc81af38bc4   os1       0.00%     0B / 0B               0.00%     0B / 0B     0B / 0B     0
  • 자원을 제한하지 않았기 때문에 메모리의 제한이 호스트의 메모리의 사이즈와 동일한 것을 알 수 있다.

컨테이너 중지 및 제거

docker stop

[root@docker ~]# docker stop --help

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

-docker stop 명령어로 컨테이너를 중지시킬 수 있다.

os2 컨테이너를 중지

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND              CREATED          STATUS                        PORTS     NAMES
5d10434af029   httpd           "httpd-foreground"   13 minutes ago   Up 13 minutes                 80/tcp    web1
f84b62afbea9   ubuntu:latest   "/bin/bash"          23 minutes ago   Up 23 minutes                           os2
fcc81af38bc4   ubuntu:latest   "/bin/bash"          24 minutes ago   Exited (127) 23 minutes ago             os1

[root@docker ~]# docker stop os2
os2

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND              CREATED          STATUS                        PORTS     NAMES
5d10434af029   httpd           "httpd-foreground"   14 minutes ago   Up 14 minutes                 80/tcp    web1
f84b62afbea9   ubuntu:latest   "/bin/bash"          23 minutes ago   Exited (0) 3 seconds ago                os2
fcc81af38bc4   ubuntu:latest   "/bin/bash"          25 minutes ago   Exited (127) 24 minutes ago             os1

docker restart

[root@docker ~]# docker restart --help

Usage:  docker restart [OPTIONS] CONTAINER [CONTAINER...]
  • docker restart 명령으로 컨테이너를 재시작할 수 있다.
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND              CREATED          STATUS                        PORTS     NAMES
5d10434af029   httpd           "httpd-foreground"   14 minutes ago   Up 14 minutes                 80/tcp    web1
f84b62afbea9   ubuntu:latest   "/bin/bash"          23 minutes ago   Exited (0) 3 seconds ago                os2
fcc81af38bc4   ubuntu:latest   "/bin/bash"          25 minutes ago   Exited (127) 24 minutes ago             os1

[root@docker ~]# docker restart os2
os2

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND              CREATED          STATUS                        PORTS     NAMES
5d10434af029   httpd           "httpd-foreground"   15 minutes ago   Up 15 minutes                 80/tcp    web1
f84b62afbea9   ubuntu:latest   "/bin/bash"          24 minutes ago   Up 4 seconds                            os2
fcc81af38bc4   ubuntu:latest   "/bin/bash"          26 minutes ago   Exited (127) 25 minutes ago             os1

docker rm

[root@docker ~]# docker rm --help

Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • docker rm 명령으로 컨테이너를 삭제할 수 있다.
  • docker rm 명령은 실행중인 컨테이너를 삭제할 수 없고 삭제하려면 stop을 먼저 실행하거나 -f 옵션을 사용해야 한다.

이전에 중지했던 web1 컨테이너를 삭제

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND              CREATED          STATUS                        PORTS     NAMES
5d10434af029   httpd           "httpd-foreground"   14 minutes ago   Up 14 minutes                 80/tcp    web1
f84b62afbea9   ubuntu:latest   "/bin/bash"          23 minutes ago   Exited (0) 3 seconds ago                os2
fcc81af38bc4   ubuntu:latest   "/bin/bash"          25 minutes ago   Exited (127) 24 minutes ago             os1

[root@docker ~]# docker rm -f web1
web1

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS                        PORTS     NAMES
f84b62afbea9   ubuntu:latest   "/bin/bash"   27 minutes ago   Up 2 minutes                            os2
fcc81af38bc4   ubuntu:latest   "/bin/bash"   28 minutes ago   Exited (127) 27 minutes ago             os1

모든 컨테이너 삭제

# docker rm -f $(docker ps -qa)

docker container prune

  • 중지된 모든 컨테이너 삭제
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS                     PORTS     NAMES
658c45a32ef0   centos            "hostname"               7 minutes ago       Exited (0) 7 minutes ago             os40
390384b22b04   centos            "/bin/bash"              10 minutes ago      Up 10 minutes                        os30
4aa3cbecc052   httpd:latest      "httpd-foreground"       12 minutes ago      Up 12 minutes              80/tcp    web20
9c8fe1185d90   centos            "/bin/bash"              16 minutes ago      Created                              os20
86bd21d05a26   centos            "/bin/bash"              25 minutes ago      Up 16 minutes                        os10
9aee28976e18   httpd             "httpd-foreground"       27 minutes ago      Up 21 minutes              80/tcp    web10
975cfbe225e5   dokken/centos-7   "/usr/lib/systemd/sy…"   About an hour ago   Up About an hour                     centos7
dab144356323   ubuntu            "/bin/bash"              About an hour ago   Up About an hour                     os1
73b3158d8be3   httpd             "httpd-foreground"       2 hours ago         Up 2 hours                 80/tcp    web2
855229bd4043   httpd             "httpd-foreground"       2 hours ago         Up 2 hours                 80/tcp    web1

[root@docker ~]# docker container prune 
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
658c45a32ef0d0219650b1052dee7470870113407d111195783c115c2df8e249
9c8fe1185d90a976e18cf4ffac5bcc8e115070d7d3bd0b101bd73234dd5e6ede

Total reclaimed space: 0B

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS             PORTS     NAMES
390384b22b04   centos            "/bin/bash"              10 minutes ago      Up 10 minutes                os30
4aa3cbecc052   httpd:latest      "httpd-foreground"       12 minutes ago      Up 12 minutes      80/tcp    web20
86bd21d05a26   centos            "/bin/bash"              25 minutes ago      Up 16 minutes                os10
9aee28976e18   httpd             "httpd-foreground"       27 minutes ago      Up 22 minutes      80/tcp    web10
975cfbe225e5   dokken/centos-7   "/usr/lib/systemd/sy…"   About an hour ago   Up About an hour             centos7
dab144356323   ubuntu            "/bin/bash"              About an hour ago   Up About an hour             os1
73b3158d8be3   httpd             "httpd-foreground"       2 hours ago         Up 2 hours         80/tcp    web2
855229bd4043   httpd             "httpd-foreground"       2 hours ago         Up 2 hours         80/tcp    web1

컨테이너 실행 시 유용한 설정

  • 컨테이너를 실행하면서 함께 적용해야하는 몇 가지 사항들이 있다.
    • 환경변수, CPU 제한, 메모리 제한, 자원 제한 변경
  • 컨테이너 특성상 실행중인 상태에서는 이러한 것들을 변경할 수 없기 때문이다.

환경변수

  • docker run 명령의 -e 옵션을 사용하여 커테이너의 환경변수를 설정할 수 있다.

centos:latest 이미지를 사용하여 os3 컨테이너에 환경변수 LAB에 docker 값을 설정

[root@docker ~]# docker run -it --name os3 -e "LAB=docker" centos:latest
[root@1dfd5b42cb0b /]# echo $LAB
docker

[root@1dfd5b42cb0b /]# exit
exit
[root@docker ~]# docker rm os3
os3

CPU 제한

  • docker run 명령의 --cpus 옵션을 사용하면 코어의 수를 제한할 수 있다
  • 정수를 지정하는 방법도 있지만 소수점을 사용하는 방법이 일반적이다.

os3 컨테이너가 실행되는데 cpu 자원을 30%만 사용하도록 한다. 컨테이너가 생성되면 dd 명령으로 부하를 발생시켜 확인한다.

[root@docker ~]# docker run -it --name os3 --cpus 0.3 centos
[root@5759cf5d11d6 /]# dd if=/dev/zero of=/dev/null &
[1] 15
[root@5759cf5d11d6 /]#

Ctrl + P + Q

[root@docker ~]# docker stats os3 --no-stream
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
5759cf5d11d6   os3       33.70%    864KiB / 3.701GiB   0.02%     656B / 0B   0B / 0B     2


[root@docker ~]# docker rm -f os3
os3
  • os3 컨테이너가 현재 CPU 자원을 약 30% 사용하는 걸 알 수 있다. CPU 사용량의 백분율을 CPU 코어 하나 당 100%씩 계산해야 한다.
  • 만약, 코어가 2개라면 최대 200% 까지 사용할 수 있다.

메모리 제한

  • docker run 명령의 --memory 옵션으로 컨테이너가 사용하는 메모리를 제한할 수 있다.
  • 메모리를 제한하지 않으면 호스트의 메모리 사이즈만큼 사용할 수 있다.

os3 컨테이너를 생성하면서 메모리 사용을 1024M 로 제한하는 명령

[root@docker ~]# docker run -itd --name os3 --memory 1024m centos
e3b2c4310dffb34d41d3eac29cdd392dce02b33b8be081e91833e14a6d8fc455

[root@docker ~]# docker stats os3 --no-stream
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
e3b2c4310dff   os3       0.00%     528KiB / 1GiB       0.05%     656B / 0B   0B / 0B     1

자원 제한 변경

[root@docker ~]# docker update --help

Usage:  docker update [OPTIONS] CONTAINER [CONTAINER...]
  • docker update 명령을 사용하여 제한된 자원을 변경할 수 있다.
  • --memory-swap 으로 가용메모리보다 더 지정할 수 있다.
    • 하지만 stats 로 확인을 하지 못하는 이유는 모르겠다.
[root@docker ~]# docker update --memory 2048m os3
os3

[root@docker ~]# docker stats --no-stream
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
a30fdcaaad15   os3       0.00%     524KiB / 2GiB       0.02%     656B / 0B   0B / 0B     1
f84b62afbea9   os2       0.00%     544KiB / 3.701GiB   0.01%     656B / 0B   0B / 0B     1

[root@docker ~]# docker update --memory 1024m --memory-swap 1024m os3
os3

[root@docker ~]# docker stats --no-stream
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
a30fdcaaad15   os3       0.00%     524KiB / 1GiB       0.05%     656B / 0B   0B / 0B     1
f84b62afbea9   os2       0.00%     544KiB / 3.701GiB   0.01%     656B / 0B   0B / 0B     1

[root@docker ~]# docker rm -f os3
os3

'도커 > 개념 및 실습' 카테고리의 다른 글

1, 2, 3장 연습문제  (0) 2021.06.02
03장-3, 컨테이너 관리  (0) 2021.06.02
03장-1, docker 명령 - 이미지 다운로드  (0) 2021.05.31
02장, 도커 개요, 설치  (0) 2021.05.31
01장, 가상화  (0) 2021.05.31