Docker Container를 실행 시키면서 사용하는 명령어에 대해서 간단하게 알아보겠습니다.
우선 여러개의 프로그램을 마구잡이로 띄워보겠습니다.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
[옵션] [설명] -d detached mode 흔히 말하는 백그라운드 모드 -p 호스트와 컨테이너의 포트를 연결 (포워딩) -v 호스트와 컨테이너의 디렉토리를 연결 (마운트) -e 컨테이너 내에서 사용할 환경변수 설정 –name 컨테이너 이름 설정 –rm 프로세스 종료시 컨테이너 자동 제거 -it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 –link 컨테이너 연결 [컨테이너명:별칭]
nasa1515@nasa:/$ docker run ubuntu:16.04 Unable to find image 'ubuntu:16.04' locally 16.04: Pulling from library/ubuntu 7b378fa0f908: Pull complete 4d77b1b29f2e: Pull complete 7c793be88bae: Pull complete ecc05c8a19c0: Pull complete Digest: sha256:0eb024b1147ab61246cfdbdf05c128550ede262790b25a8a6fd93dd3385ab1c8 Status: Downloaded newer image for ubuntu:16.04
run
명령어를 수행하면 로컬 저장소의 이미지를 확인하고 없다면 다운로드(pull)
를 한 후 컨테이너를 생성(create)
하고 시작(start)
합니다.ubuntu:16.04
이미지를 다운받은 적이 없기 때문에 이미지를 다운로드 한 후 컨테이너가 실행되었습니다.nasa1515@nasa:/$ nasa1515@nasa:/$ docker run --rm -it ubuntu:16.04 /bin/bash root@ddc99f1734ab:/# root@ddc99f1734ab:/# cat /etc/*-release | grep -i version VERSION="16.04.6 LTS (Xenial Xerus)" VERSION_ID="16.04" VERSION_CODENAME=xenial root@ddc99f1734ab:/# root@ddc99f1734ab:/# exit exit
bash 쉘
을 실행하고 키보드 입력을 위해 -it 옵션
을 줍니다.--rm
옵션도 추가하였습니다.두번째 예로는 Redis Image를 사용해 Container를 생성해보겠습니다.
redis는 메모리기반의 다양한 기능을 가진 스토리지입니다. 6379 포트로 통신하며 telnet 명령어로 테스트해 볼 수 있습니다.
백그라운드 모드로 실행하기 위해 -d 옵션
을 추가하고 -p 옵션
을 추가하여 컨테이너의 포트를 호스트의 포트로 연결해보겠습니다.
-d 옵션
이 없다면 프로세스가foreground
로 실행되어 아무키도 입력할 수 없게 됩니다.
컨테이너를 종료하려면 ctrl + c를 입력해 주세요.
nasa1515@nasa:/$ docker run -d -p 1234:6379 redis Unable to find image 'redis:latest' locally latest: Pulling from library/redis bf5952930446: Pull complete 911b8422b695: Pull complete 093b947e0ade: Pull complete 5b1d5f59e382: Pull complete 7a5f59580c0b: Pull complete f9c63997c980: Pull complete Digest: sha256:09c33840ec47815dc0351f1eca3befe741d7105b3e95bc8fdb9a7e4985b9e1e5 Status: Downloaded newer image for redis:latest e0a912150d3eb6cdaeda5a643c3969775adf2d2d2e64862e9053dc99d936a1b4 nasa1515@nasa:/$ nasa1515@nasa:/$ telnet localhost 1234 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. set mykey nasa +OK get mykey $4 nasa quit +OK Connection closed by foreign host.
-d 옵션
을 주었기 때문에 컨테이너를 실행하자마자 컨테이너의 ID(e0a9121…)를 보여주고 바로 쉘로 돌아왔습니다.
컨테이너는 종료된 것이 아니라 백그라운드 모드로 동작하고 있고 컨테이너 ID를 이용하여 컨테이너를 제어할 수 있습니다.-p 옵션
을 이용하여 호스트의 1234포트를 컨테이너의 6379포트로 연결하고 localhost의 1234포트로 접속하면 하면 redis를 사용할 수 있습니다.
- 테스트 결과
redis에 접속하여 새로운 키를 저장하고 불러오는데 성공했습니다. 실행이 간단한건 물론이고 호스트의 포트만 다르게 하면 하나의 서버에 여러개의 redis 서버를 띄우는 것도 매우 간단합니다.
이번에 실행할 컨테이너는 MySQL 서버입니다. 흔히 사용되는 데이터베이스인데 이번에는 -e 옵션
을 이용하여 환경변수를 설정하고 --name 옵션
을 이용해 컨테이너에 읽기 어려운 ID 대신 쉬운 이름을 부여할 예정입니다.
--name옵션
을 생략하면 도커가 자동으로 이름을 지어 줍니다. 이름은 유명한 과학자나 해커의 이름과 수식어를 조합하여 랜덤으로 생성합니다.
(ex - boring_wozniak) 우리나라 과학자 장영실도 등록되어 있습니다.
MySQL Docker hub 페이지에 접속하면 간단한 사용법과 환경변수에 대한 설명이 있습니다.
여러가지 설정값이 있는데 패스워드 없이 root계정을 만들기 위해 MYSQL_ALLOW_EMPTY_PASSWORD
환경변수를 설정합니다.
이름은 nasa-mysql로 할당하고 백그라운드 모드로 띄우기 위해 -d 옵션
을 줍니다. 포트는 3306포트
를 호스트에서 그대로 사용하겠습니다.
nasa1515@nasa:/$ docker run -d -p 3306:3306 \ > -e MYSQL_ALLOW_EMPTY_PASSWORD=true \ > --name nasa-mysql \ > mysql:5.7 Unable to find image 'mysql:5.7' locally 5.7: Pulling from library/mysql bf5952930446: Already exists 8254623a9871: Pull complete 938e3e06dac4: Pull complete ea28ebf28884: Pull complete f3cef38785c2: Pull complete 894f9792565a: Pull complete 1d8a57523420: Pull complete 5f09bf1d31c1: Pull complete 1b6ff254abe7: Pull complete 74310a0bf42d: Pull complete d398726627fd: Pull complete Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84 Status: Downloaded newer image for mysql:5.7 64e17595fca839d513c7c5bab4d6c624cc5fa729dec66881ca66aa61e2bee571 nasa1515@nasa:/$ nasa1515@nasa:/$ mysql -h 127.0.0.1 -uroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.31 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Orale is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql>
이번에는 컨테이너를 생성할때 메모리와 CPU 사용률
을 제한 하는 것입니다.
DOCKER는 호스트의 자원을 사용하기 때문에 여러대의 컨테이너를 생성하기 위해선 필수 적인 옵션입니다.
nasa1515@nasa1515:/$ docker run -it --name nasa-cpu --cpus 0.3 centos:latest [root@0c9cc5567f06 /]# dd if=/dev/zero of=/dev/null & ------------------------------------------------------------------------ nasa1515@nasa1515:~$ docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 0c9cc5567f06 nasa-cpu 29.93% 3.555MiB / 9.709GiB 0.04% 4.72kB / 0B 0B / 0B 2 fa06266704bc nasa-centos 0.00% 3.066MiB / 9.709GiB 0.03% 13.3kB / 0B 0B / 0B 1 e0a912150d3e jovial_wing 0.13% 4.059MiB / 9.709GiB 0.04% 36.6kB / 772B 0B / 0B 5
nasa-cpu
컨테이너에 dd 명령으로 부하를 발생시키고 확인해보면, 설정한 0.3 (30%)
값 이상으로 cpu를 사용하지 않습니다.nasa1515@nasa1515:/$ docker run -itd --name nasa-memory --memory 1024m centos:latest WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap. d387c47fa6b81d23871656d52448c465ad51abae02e2115f865890321ae2b82c nasa1515@nasa1515:~$ docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d387c47fa6b8 nasa-memory 0.00% 3.164MiB / 1GiB 0.31% 4.44kB / 0B 0B / 0B 1 fa06266704bc nasa-centos 0.00% 3.066MiB / 9.709GiB 0.03% 16.8kB / 0B 0B / 0B 1 e0a912150d3e jovial_wing 0.15% 4.059MiB / 9.709GiB 0.04% 40.2kB / 772B 0B / 0B 5
nasa-momory 컨테이너를
1024(1G)
의 메모리만 부여한 뒤 생생해봤습니다.
docker stats --no-stream
명령어를 통해 확인한 결과
적용한 메모리만큼만 부여되어 컨테이너가 생성됩니다.
update
명령어로 컨테이너 제한 업데이트update 명령어를 이용하면 이미 실행중인 컨테이너의 설정을 변경 할 수 있습니다.
위에 생성한 nasa-memory 컨테이너의 메모리를 2G
로 변경해보죠.
nasa1515@nasa:~$ docker update --memory 2048m nasa-memory nasa-memory Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap. nasa1515@nasa:~$ nasa1515@nasa:~$ docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d387c47fa6b8 nasa-memory 0.00% 3.164MiB / 2GiB 0.15% 8.96kB / 0B 0B / 0B 1 fa06266704bc nasa-centos 0.00% 3.066MiB / 9.709GiB 0.03% 20.5kB / 0B 0B / 0B 1 e0a912150d3e jovial_wing 0.13% 4.285MiB / 9.709GiB 0.04% 43.6kB / 772B 0B / 4.1kB 5
앞에서 도커의 run 명령어를 이용하여 여러개의 컨테이너를 실행했습니다.
이제 컨테이너의 상태를 살펴보고 어떤 이미지가 설치되어 있는지 확인하는 명령어를 알아봅니다.
(ps)
컨테이너 목록을 확인하는 명령어는 다음과 같습니다
$ docker ps --help Usage: docker ps [OPTIONS]
nasa1515@nasa:/$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 64e17595fca8 mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp nasa-mysql e0a912150d3e redis "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 0.0.0.0:1234->6379/tcp jovial_wing nasa1515@nasa:/$
CONTAINER ID
: 컨테이너의 고유 IDIMAGE
: 컨테이너가 사용하는 이미지COMMAND
: 컨테이너에서 실행중인 애플리케이션CREATED
: 컨테이너가 생성된 날짜STATUS
: 컨테이너의 상태PORTS
: 컨테이너에서 사용 중인 포트NAMES
: 컨테이너의 이름
-a 옵션
을 넣어 실행해보겠습니다nasa1515@nasa:/$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 64e17595fca8 mysql:5.7 "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp nasa-mysql e0a912150d3e redis "docker-entrypoint.s…" 21 minutes ago Up 21 minutes 0.0.0.0:1234->6379/tcp jovial_wing f481493bd3b2 ubuntu:16.04 "/bin/bash" 46 minutes ago Exited (0) 46 minutes ago nifty_chatterjee nasa1515@nasa:/$
이전에 실행했다가 종료된 컨테이너(Exited (0))가 추가로 보입니다. 컨테이너는 종료되어도 삭제되지 않고 남아있습니다.
종료된 건 다시 시작할 수 있고 컨테이너의 읽기/쓰기 레이어는 그대로 존재합니다. 명시적으로 삭제를 하면 깔끔하게 컨테이너가 제거됩니다.
(stop)
실행중인 컨테이너를 중지하는 명령어는 다음과 같습니다.
docker stop [OPTIONS] CONTAINER [CONTAINER...]
옵션은 특별한게 없고 실행중인 컨테이너를 하나 또는 여러개 (띄어쓰기로 구분) 중지할 수 있습니다.
앞에서 실행한 mysql 컨테이너는 더이상 필요가 없으니 중지해 보겠습니다.
중지하려면 컨테이너의 ID 또는 이름을 입력하면 됩니다. mysql 컨테이너의 ID를 ps명령을 통해 확인하고 중지해 봅니다.
nasa1515@nasa:/$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 64e17595fca8 mysql:5.7 "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp nasa-mysql e0a912150d3e redis "docker-entrypoint.s…" 25 minutes ago Up 25 minutes 0.0.0.0:1234->6379/tcp jovial_wing
nasa1515@nasa:/$ docker stop nasa-mysql nasa-mysql nasa1515@nasa:/$ nasa1515@nasa:/$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e0a912150d3e redis "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 0.0.0.0:1234->6379/tcp jovial_wing
(rm)
종료된 컨테이너를 완전히 제거하는 명령어는 다음과 같습니다.
docker rm [OPTIONS] CONTAINER [CONTAINER...]
종료 명령어도 옵션은 특별한게 없습니다. 종료된 컨테이너를 하나 또는 여러개 삭제할 수 있습니다.
종료된 ubuntu
컨테이너와 mysql
컨테이너를 삭제해보겠습니다.
-a
옵션에서 보이는 것을 확인nasa1515@nasa:/$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 64e17595fca8 mysql:5.7 "docker-entrypoint.s…" 18 minutes ago Exited (0) 2 minutes ago nasa-mysql e0a912150d3e redis "docker-entrypoint.s…" 28 minutes ago Up 28 minutes 0.0.0.0:1234->6379/tcp jovial_wing f481493bd3b2 ubuntu:16.04 "/bin/bash" 53 minutes ago Exited (0) 53 minutes ago nifty_chatterjee
nasa1515@nasa:/$ docker rm nasa-mysql nasa-mysql nasa1515@nasa:/$ docker rm nifty_chatterjee nifty_chatterjee nasa1515@nasa:/$ nasa1515@nasa:/$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e0a912150d3e redis "docker-entrypoint.s…" 29 minutes ago Up 29 minutes 0.0.0.0:1234->6379/tcp jovial_wing nasa1515@nasa:/$
컨테이너가 말끔히 삭제되었습니다. 호스트 OS는 아무런 흔적도 남아있지 않고 컨테이너만 격리된 상태로 실행되었다가 삭제되었습니다.
중지된 컨테이너를 일일이 삭제 하는 건 귀찮은 일입니다. docker rm -v $(docker ps -a -q -f status=exited)
명령어를 입력하면
위에서 도커에 대한 아주아주아주 기본적인 명령어를 살펴보았습니다. 사실 저 명령어들과 이번에 살펴볼 log, exec 명령어를 익히면
도커에서 사용하는 명령어는 거의 다 익혔다고 할 수 있습니다. 다른 명령어는 필요에 따라 하나하나 살펴보면 됩니다.
(logs)
컨테이너가 정상적으로 동작하는지 확인하는 좋은 방법은 로그를 확인하는 것 입니다.
로그를 확인하는 방법은 다음과 같습니다.
docker logs [OPTIONS] CONTAINER
기본 옵션과, -f
, --tail
옵션을 살펴봅시다.
기존에 생성해 놓은 redis 컨테이너
로그를 확인해 보겠습니다.
docker ps docker logs ${redis containerid}
nasa1515@nasa:/$ docker logs e0a912150d3e 1:C 17 Aug 2020 05:09:58.870 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1:C 17 Aug 2020 05:09:58.870 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=1, just started 1:C 17 Aug 2020 05:09:58.870 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 1:M 17 Aug 2020 05:09:58.872 * Running mode=standalone, port=6379. 1:M 17 Aug 2020 05:09:58.872 # Server initialized 1:M 17 Aug 2020 05:09:58.872 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 1:M 17 Aug 2020 05:09:58.872 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 1:M 17 Aug 2020 05:09:58.873 * Ready to accept connections
아무 옵션을 주지 않았을 때는 전체 로그를 무식하게 전부 다 출력합니다.
--tail옵션
으로 마지막 3줄만 출력해 보겠습니다.nasa1515@nasa:/$ docker logs --tail 3 e0a912150d3e 1:M 17 Aug 2020 05:09:58.872 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 1:M 17 Aug 2020 05:09:58.872 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 1:M 17 Aug 2020 05:09:58.873 * Ready to accept connections
(exec)
컨테이너를 관리하다 보면 컨테이너에 접속하거나 파일을 실행하고 싶을 때가 있습니다.
SSH를 통해 연결하면 되지 않을까? 라고 생각할 수 있지만 SSH는 권장하지 않습니다.
예전에는 nsenter
라는 프로그램을 이용하였는데 docker에 exec
라는 명령어로 흡수되었습니다.
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
run 명령어와 유사해 보입니다. 차이는 run은 새로 컨테이너를 만들어서 실행하고 exec는 실행중인 컨테이너에 명령어를 내리는 정도입니다.
nasa1515@nasa1515:/$ docker exec nasa-centos ls -lart / total 56 drwxr-xr-x 2 root root 4096 May 11 2019 srv lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 May 11 2019 opt drwxr-xr-x 2 root root 4096 May 11 2019 mnt drwxr-xr-x 2 root root 4096 May 11 2019 media lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib drwxr-xr-x 2 root root 4096 May 11 2019 home lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin drwx------ 2 root root 4096 Aug 9 21:40 lost+found drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr drwxr-xr-x 20 root root 4096 Aug 9 21:40 var drwxr-xr-x 11 root root 4096 Aug 9 21:40 run drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp dr-xr-x--- 2 root root 4096 Aug 9 21:40 root drwxr-xr-x 1 root root 4096 Aug 17 05:51 etc -rwxr-xr-x 1 root root 0 Aug 17 05:51 .dockerenv drwxr-xr-x 1 root root 4096 Aug 17 05:51 .. drwxr-xr-x 1 root root 4096 Aug 17 05:51 . dr-xr-xr-x 348 root root 0 Aug 17 05:51 proc dr-xr-xr-x 13 root root 0 Aug 17 05:51 sys drwxr-xr-x 5 root root 360 Aug 17 05:51 dev
(attach)
attach
옵션은 분리 모드로 실행중인 컨테이너에 접근하는 명령어입니다.
nasa1515@nasa:/$ docker attach nasa-memory [root@d387c47fa6b8 /]# [root@d387c47fa6b8 /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 31: eth0@if32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
다음과 같이 백그라운드에서 실행중인 nasa-memory 컨테이너에 접속이 가능합니다.