이번 포스팅을 통해서 도커 컨테이너를 다루는 명령어를 알아보도록 합시다.
도커 엔진의 버전을 확인해보자.
## 1번
docker -v
> Docker version 20.10.6, build 370c289
## 2번
docker --version
> Docker version 20.10.6, build 370c289
아래 명령어는 도커 이미지를 컨테이너로 만들어주며, 컨테이너 내부로 들어가는 기본 명령어입니다.
## 도커 이미지를 컨테이너로 만들어주며 컨테이너 내부로 들어가는 명령어
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
다음은 도커 이미지를 컨테이너로 만들어주기만 하는 기본 명령어입니다.
## 도커 이미지를 컨테이너로 만들어주는 명령어
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
그다음은 docker create로 컨테이너만 만들어준 것을 시작하고 내부로 들어가는 명령어입니다.
## 도커 컨테이너를 시작하는 명령어
docker start [OPTIONS] CONTAINER [CONTAINER...]
## 도커 컨테이너 내부로 들어가는 명령어
docker attach [OPTIONS] CONTAINER
docker run
과 docker create
는 위에서 보는 것과 같이 차이점이 존재합니다. docker run는 생성뿐만 아니라 시작하고, 내부로 들어가게 해주는 반면, docker create는 컨테이너를 생성까지만 해주게 됩니다. 한마디로 docker run과 같은 동작을 하기 위해서는 docker create의 경우 docker start와 docker attach를 해주어야 한다는 의미입니다.
컨테이너는 가상 머신과 마친가지로 내부 가상 IP 주소를 할당받게 되는데, 컨테이너에 127.17.0.x의 IP를 순차적으로 할당합니다. 도커 NAT IP인 127.17.0.x를 할당받은 eth0 인터페이스와 로컬 호스트인 lo 인터페이스가 있습니다. 아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없으며 도커가 설치된 호스트에서만 접근할 수 있습니다. 외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 ip포트를 호스트의 ip와 포트에 바인딩해야 합니다.
eth0의 ip포트를 호스트의 ip와 포트에 바인딩하는 명령어는 아래와 같습니다.👇
## 바인딩 명령어
docker run -it -p [호스트의 포트]:[컨테이너의 포트] [CONTAINER]
## EX
docker run -it -p 80:80 ubuntu:14.04
그 다음은 호스트의 특정 ip를 사용하려면 아래와 같은 명령어를 사용할 수 있으며, 여러개의 포트를 -p를 중첩하여 사용해서 바인딩 할 수 있습니다.
## 바인딩 명령어
docker run -it -p [호스트의 포트]:[컨테이너의 포트] -p [특정 ip]:[호스트의 포트]:[컨테이너의 포트] [CONTAINER]
## EX
docker run -it -p 3306:3306 -p 128.213.12.45:7777:80 ubuntu:14.04
-i , -t 가 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정한다면 -d는 detached 모드로 컨테이너를 실행합니다. detached 모드는 컨테이너를 백그라운드에서 동작하는 애플리케이션으로써 실행하도록 설정합니다.
그러나 -d 옵션으로 run을 실행하면 입출력이 없는 상태로 컨테이너를 실행합니다. 컨태이너 내부에서 프로그램이 터미널을 차지하는 포그라운드로 실행돼 사용자의 입력을 받지 않습니다. detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야 하며, 포그라운드 프로그램이 실행되지 않는 다면 컨테이너는 종료됩니다.
이를 테스트 해보겠습니다.
## 컨테이너 내부에서 프로그램을 실행하지 않은 채로 -d 옵션 사용
docker run -d ubuntu:14.04
## 바로 종료된 것을 확인
docker ps -a
>>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7a34513b357 ubuntu:14.04 "/bin/bash" 48 seconds ago Exited (0) 43 seconds ago busy_rhodes
42a62abc2d46 a40e0b600ffe "/bin/sh -c 'pip3 in…" 33 hours ago Exited (1) 33 hours ago naughty_lichterman
3d7a1b0f44d6 1160d7512631 "python3" 2 weeks ago Exited (0) 2 weeks ago kind_mendel
위와 같이 docker start로 컨테이너를 시작해도 컨테이너 내부에 터미널을 차지하는 포그라운드로써 동작하는 프로그램이 없으므로 컨테이너는 시작되지 않습니다.
이와 반대로 mysql 와 같은 컨테이너를 -d 옵션을 사용하지 않고 -i , -t 옵션만 사용하게 되면 mysql 프로그램이 포그라운드로 실행된 로그를 볼 수 있습니다. 이 상태에서는 상호 입출력이 불가능하고 단순히 포그라운드 모드로 동작하는 것만 지켜볼 수 있습니다. 이와 같은 이유로 -d 옵션을 설정해서 컨테이너가 백그라운드로 동작하게 하는 것입니다.
-e 옵션은 컨테이너 내부의 환경변수 설정합니다. 예를 들어 mysql 컨테이너를 생성할 때 -e 옵션으로 mysql root password를 설정 후 생성할 수 있습니다.
## -e 옵션 사용을 통한 환경변수 설정
docker run ... -e MYSQL_ROOT_PASSWORD=password ...
A 컨테이너에서 B 컨테이너로 접근하는 방법 중 가장 간단한 것은 NAT로 할당받은 내부 IP를 사용하는 것 입니다. 하지만 컨테이너를 시작할 때마다 재할당하는 것이므로 매번 변경되는 컨테이너의 IP로 접근하기는 어렵습니다.
그래서 --link 옵션을 통해서 항상 컨테이너에 alias (별칭)으로 접근하도록 설정합니다.
## link 옵션으로 별칭 설정
docker run ... --link [컨테이너명]:[별칭] ...
도커 컨테이너의 상태를 확인하는 명령어는 아래와 같습니다.👇
## 도커 컨테이너 상태확인
docker ps
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7f66c492d93 mongo:latest "docker-entrypoint.s…" 2 weeks ago Up 2 weeks 27017/tcp mongodb-deepscrap
15555776a388 confluentinc/cp-kafka:5.5.1 "/etc/confluent/dock…" 2 weeks ago Up 8 days 0.0.0.0:9092->9092/tcp, :::9092->9092/tcp kafkastackdockercompose_kafka1_1
8bdb162ae101 confluentinc/cp-kafka:5.5.1 "/etc/confluent/dock…" 2 weeks ago Up 8 days 9092/tcp, 0.0.0.0:9094->9094/tcp, :::9094->9094/tcp kafkastackdockercompose_kafka3_1
21106d738ec0 confluentinc/cp-kafka:5.5.1 "/etc/confluent/dock…" 2 weeks ago Up 8 days 9092/tcp, 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp kafkastackdockercompose_kafka2_1
ab7ed4b4a365 zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2182->2182/tcp, :::2182->2182/tcp kafkastackdockercompose_zoo2_1
2e99cdf1e553 zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2183->2183/tcp, :::2183->2183/tcp kafkastackdockercompose_zoo3_1
0bc0a0a6cd2d zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 2888/tcp, 0.0.0.0:2181->2181/tcp, :::2181->2181/tcp, 3888/tcp kafkastackdockercompose_zoo1_1
도커 컨테이너 목록을 확인할 수 있으며 출력에 대한 설명은 아래와 같습니다.
- CONTAINER ID : 컨테이너에게 자동으로 할당되는 무작위 16진수 해시값으로 고유한 ID입니다.
- IMAGE : 컨테이너를 생성할 때 사용된 이미지의 이름입니다.
- COMMAND : 컨테이너가 시작될 때 실행될 명령어입니다. 이미지에 내장된 코멘트는 docker run , docker create 명령어 끝에 입력해서 덮어쓸 수 있습니다. 추후 설명드리겠습니다.
- CREATED : 컨테이너가 생성되고 난 뒤 흐른 시간을 나타냅니다.
- STATUS : 컨테이너의 상태를 나타내며, 컨테이너가 실행중임을 나타내는 up, 종료된 상태인 Exited , 일시 중지된 상태인 Pause 등이 있습니다.
- PORTS : 컨테이너가 개방한 포트와 호스트에 연결할 포트를 보여줍니다.
- NAMES : 컨테이너의 고유한 이름입니다.
여기서 중요한 점은 docker ps 명령어는 현재 실행 중인 즉 동작중은 컨테이너의 목록만 리턴합니다. 종료된 컨테이너를 확인하기 위해서는 아래와 같은 명령어로 확인할 수 있습니다.
## 도커 컨테이너 전체 목록 확인
docker ps -a
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42a62abc2d46 a40e0b600ffe "/bin/sh -c 'pip3 in…" 26 hours ago Exited (1) 26 hours ago naughty_lichterman
3d7a1b0f44d6 1160d7512631 "python3" 2 weeks ago Exited (0) 2 weeks ago kind_mendel
e7f66c492d93 mongo:latest "docker-entrypoint.s…" 2 weeks ago Up 2 weeks 27017/tcp mongodb-deepscrap
003e77c9d9aa mongo:latest "docker-entrypoint.s…" 2 weeks ago Exited (137) 2 weeks ago mongo-deepscrap
15555776a388 confluentinc/cp-kafka:5.5.1 "/etc/confluent/dock…" 2 weeks ago Up 8 days 0.0.0.0:9092->9092/tcp, :::9092->9092/tcp kafkastackdockercompose_kafka1_1
8bdb162ae101 confluentinc/cp-kafka:5.5.1 "/etc/confluent/dock…" 2 weeks ago Up 8 days 9092/tcp, 0.0.0.0:9094->9094/tcp, :::9094->9094/tcp kafkastackdockercompose_kafka3_1
21106d738ec0 confluentinc/cp-kafka:5.5.1 "/etc/confluent/dock…" 2 weeks ago Up 8 days 9092/tcp, 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp kafkastackdockercompose_kafka2_1
ab7ed4b4a365 zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2182->2182/tcp, :::2182->2182/tcp kafkastackdockercompose_zoo2_1
2e99cdf1e553 zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2183->2183/tcp, :::2183->2183/tcp kafkastackdockercompose_zoo3_1
0bc0a0a6cd2d zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 2888/tcp, 0.0.0.0:2181->2181/tcp, :::2181->2181/tcp, 3888/tcp kafkastackdockercompose_zoo1_1
0182a1a4d33e confluentinc/cp-kafka-connect:5.2.1 "/etc/confluent/dock…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_kafka-connect_1
0ba8fbc6f510 landoop/kafka-topics-ui:0.9.4 "/run.sh" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_kafka-topics-ui_1
8be07deaef7e landoop/schema-registry-ui:0.9.4 "/run.sh" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_schema-registry-ui_1
059628c4386d confluentinc/cp-kafka-rest:5.2.1 "/etc/confluent/dock…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_kafka-rest-proxy_1
0e81b59b09ee elkozmon/zoonavigator-web:0.5.1 "./run.sh" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_zoonavigator-web_1
4eabe8fc5f0e confluentinc/cp-schema-registry:5.2.1 "/etc/confluent/dock…" 2 weeks ago Exited (1) 2 weeks ago kafkadocker_kafka-schema-registry_1
3b95646920c8 confluentinc/cp-ksql-server:5.2.1 "/etc/confluent/dock…" 2 weeks ago Exited (255) 2 weeks ago kafkadocker_ksql-server_1
07514343da92 elkozmon/zoonavigator-api:0.5.1 "./run.sh" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_zoonavigator-api_1
2543953b71c7 confluentinc/cp-kafka:5.2.1 "/etc/confluent/dock…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_kafka2_1
92a86e1072fa confluentinc/cp-kafka:5.2.1 "/etc/confluent/dock…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_kafka1_1
4824e35467c6 confluentinc/cp-kafka:5.2.1 "/etc/confluent/dock…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_kafka3_1
1a29ed1b3a1d zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_zoo1_1
7f6f2afff97a zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_zoo3_1
63981e1313c6 zookeeper:3.4.9 "/docker-entrypoint.…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_zoo2_1
c7a6e96074f7 kafkadocker_kafka "start-kafka.sh" 2 weeks ago Exited (143) 2 weeks ago kafkadocker_kafka_1
d824b999954c wurstmeister/zookeeper "/bin/sh -c '/usr/sb…" 2 weeks ago Exited (137) 2 weeks ago kafkadocker_zookeeper_1
1d8d006c198c samocns "/bin/bash" 2 weeks ago Exited (0) 2 weeks ago pensive_lederberg
fa1b999cc84e samocns "/bin/bash" 4 weeks ago Exited (129) 4 weeks ago priceless_jang
위의 명령어 (docker ps)와 다르게 Exited 된 도커 컨테이너들이 보이는 것을 확인할 수 있습니다.
여담으로 docker run 해서 컨테이너 내부에 들어가서 exit를 통해서 나오는 경우 Pause 되고, Ctrl + P, Q를 입력하는 경우 컨테이너의 셸에서만 빠져나옵니다.
더 이상 사용하지 않는 컨테이너를 삭제할 때는 아래와 같은 명령어를 사용합니다.
## 도커 컨테이너 삭제 명령어
docker rm [CONTAINER]
하지만 위의 명령어는 컨테어너가 exited 된 상태만 docker rm으로 삭제가 가능합니다. 그와 반면 컨테이너가 종료되지 않은 것들은 해당 명령어로 하지 못합니다. 그래서 강제로 종료하는 명령어도 존재하며, 종료 후 삭제도 가능합니다.
## 1. 도커 컨테이너 종료 명령어
docker stop [CONTAINER]
## 1. 종료된 도커 컨테이너 삭제
docker rm [CONTAINER]
## 2. 도커 컨테이너 강제 종료
docker rm -f [CONTAINER]
그다음은 모든 컨테이너를 삭제하는 명령어입니다. 전체 컨테이너를 일일이 삭제하는 것은 매우 귀찮은 일이므로 아래와 같은 명령어를 사용합니다.
## 도커 컨테이너 전체 삭제
docker container prune
해당 글의 모든 레퍼런스는 "시작하세요! 도커/쿠버네티스 친절한 설명으로 쉽게 이해하는 컨테이너 관리" (용찬호 지음)을 알립니다.
[https://coupa.ng/b2 DsNQ](https://coupa.ng/b2 DsNQ)
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."