docker 기본 명령어 (ps, stop, start, rm, logs, exec, images, network)
컨테이너 레벨 명령어
🐳 docker ps
ps는 process status의 약자입니다.
// 현재 실행 중인 도커 컨테이너
docker ps
// a옵션을 주게 된 경우 stop된 컨테이너도 확인할 수 있습니다.
docker ps -a
docker ps를 실행해보면 다음과 같이 실행중인 컨테이너가 뜹니다. names는 직접 --name 옵션을 준 경우에는 해당 이름으로 뜨지만 생략한 경우 랜덤한 이름이 부여됩니다. 아래 출력에서는 borring_mahavirra, bold_heisenberg가 떴네요.
그밖에 사용하고 있는 포트가 어디인지, 언제 생성되었는지, 무슨 명령어를 수행 중인지 등의 정보도 알려줍니다.
원하는 부분만 보고 싶다면 다음과 같이 작성하면됩니다. \는 가독성을 높이기 위해 테이블을 tab으로 띄워놓기 위한 것입니다.
docker ps --format 'table{{.Image}}\table{{.Names}}'
🚨 도커의 라이프사이클
docker create나 start는 잘 사용하지 않고 run을 자주 씁니다만, 굳이 구분하다면 다음과 같습니다.
🐳 docker stop / 🐳 docker kill
https://docs.docker.com/engine/reference/commandline/stop/
docker stop [OPTIONS] CONTAINER [CONTAINER...]
컨테이너 ID를 입력해 docker를 중지할 수 있습니다. 여러 개를 중지하고 싶은 경우 컨테이너 ID를 띄어쓰기로 구별하면 됩니다.
docker stop은 Gracefully(우아)하게 작업을 중지시킵니다. 이 뜻은, 하고 있는 작업을 마친 후에 컨테이너를 중지한다는 것입니다.
docker kill 또한 컨테이너를 중지합니다. (중지 및 삭제의 숏컷이 아닙니다! 주의하세요!) docker stop과의 차이점은 stop이 gracefully하게 컨테이너를 중지시키는 반면 kill은 어떠한 작업도 기다리지 않고 즉각 중지합니다.
docker kill [OPTIONS] CONTAINER [CONTAINER...]
🐳 docker rm / docker container prune
https://docs.docker.com/engine/reference/commandline/rm/
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker를 삭제합니다. 중지와 삭제는 다릅니다. 이미지 run시 --rm 속성을 주었다면 프로세스 종료시 자동 삭제되지만 지정하지 않은 경우 직접 삭제해줘야 합니다. 여러 개를 삭제하고 싶은 경우 컨테이너 ID를 띄어쓰기로 구별하면 됩니다.
tip!) 만약 정지 중인 docker 컨테이너 전부를 삭제하고 싶다면
docker container prune
tip!) 이미지, 정지 중인 컨테이너, 네트워크 모두 다 지워버리고 싶다면
docker system prune
🐳 docker (re)start
EC2 인스턴스를 끄는 등 서버를 정지하면 docker 컨테이너들이 전부 정지됩니다. 다시 시작하기 위해서는
docker start 명령어를 이용하면 됩니다.
docker start [OPTIONS] CONTAINER [CONTAINER...]
이미 실행하고 있는 컨테이너를 다시 실행하기 위해서는 docker restart를 이용하시면 됩니다.
🐳 docker logs
docker logs [OPTIONS] CONTAINER
options은 아래와 같습니다.
--details | Show extra details provided to logs | |
--follow , -f | Follow log output (한번 출력하고 마는 것이 아니라 계속 watch함) | |
--since | Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) | |
--tail | all | Number of lines to show from the end of the logs (몇 줄 출력할건지) |
--timestamps , -t | Show timestamps | |
--until | API 1.35+ Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) |
🐳 docker exec
이미 실행중인 컨테이너에 명령어를 전달하고 싶은 경우 사용합니다.
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
위와 같이 이미 돌고있는 컨테이너에서 추가적으로 명령어를 입력하고자 하면 다음과 같이 합니다.
docker exec b810550e80e3 ls
docker exec -it c878a4949ba8 redis-cli
이미지 레벨 명령어
🐳 docker images / docker pull / docker rmi
docker images [OPTIONS] [REPOSITORY[:TAG]]
말 그대로 다운로드한 이미지들을 볼 수 있습니다. docker run을 할 때 먼저 로컬에서 이미지를 찾는다고 했는데 여기 목록에 없으면 자동으로 다운로드(pull)합니다.
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 41de2cc0b30e 17 hours ago 104MB
wordpress latest 6158ccbb8924 18 hours ago 546MB
ubuntu 20.04 4e2eef94cd6b 13 days ago 73.9MB
centos 8 0d120b6ccaa8 3 weeks ago 215MB
mysql 5.7 718a6da099d8 4 weeks ago 448MB
hashicorp/http-echo latest a6838e9a6ff6 3 years ago 3.97MB
docker pull은 이미지를 다운로드 받습니다. 사실 run을 돌려서 없으면 자동으로 pull하기 때문에 굳이 수동으로 pull을 먼저해 줄 필요는 없습니다.
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull mongo
이미지를 삭제할 때는 docker rmi를 이용하면 됩니다. 단 컨테이너가 이용하는 중인 이미지는 삭제되지 않습니다.
지우려고 하면 에러를 냅니다.
conflict: unable to delete 6158ccbb8924 (cannot be forced) - image is being used by running container ee4a38b07889
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi 409c3f937574
🐳 docker inspect [name]
특정 이미지의 내부 정보를 볼 수 있습니다.
docker inspect nginx로 nginx 이미지 내부를 까보면 여러 정보를 확인할 수 있습니다.
중요한 정보가 많지만 Env와 Cmd가 눈에 먼저 뜨입니다. (심화된 수준에선 layer도 보고 하시던데 아직 저는...)
cmd는 이미지가 실행되자마자 실행되는 command이고
env은 기본값으로 설정된 값들입니다.
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.19.8",
"NJS_VERSION=0.5.2",
"PKG_RELEASE=1~buster"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
🐳 docker image prune
docs.docker.com/engine/reference/commandline/image_prune/
prune이라는 단어에서 알 수 있듯 모조리 지워버리는 것입니다.
복수형인 images 가 아니라 단수형인 image인 것에 주의합시다.
docker image prune [OPTIONS]
--all , -a | Remove all unused images, not just dangling ones |
--filter | Provide filter values (e.g. ‘until=') |
--force , -f | Do not prompt for confirmation |
도커 네크워크
🐳 docker network create/connect/option
도커 네트워크란 컨테이너끼리 통신할 수 있는 가상의 네트워크를 말합니다. 도커의 컨테이너는 각각 격리된 상태이므로 통신하기 위해서는 네트워크를 만들어줘야 합니다.
docker network create 를 통해 app-network라는 이름의 네트워크를 만들어줬습니다.
docker network create [OPTIONS] NETWORK
docker network create app-network
app-network라는 이름의 네트워크에 현재 있는 mysql 이란 이름의 컨테이너를 연결해보았습니다.
docker network connect를 사용하면 됩니다.
https://docs.docker.com/engine/reference/commandline/network_connect/
docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect app-network mysql
이후 wordpress 이미지를 run할 때 --network 옵션을 통해 어떤 네트워크를 사용할 것인지 명시할 수 있습니다.
docker run -d -p 8080:80 --network=app-network
-e WORDPRESS_DB_HOST=mysql
-e WORDPRESS_DB_NAME=wp
-e WORDPRESS_DB_USER=wp
-e WORDPRESS_DB_PASSWORD=wp
wordpress