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