run
명령어는 이미지에서 컨테이너를 동작시키기 위한 명령어입니다.
linux> docker run nginx
위 명령어는 만약 nginx 이미지가 로컬상에서 존재하면 nginx application을 docker host에서 실행하게 됩니다. 만일 이미지가 host에 존재하지 않으면, docker hub에 가서 docker image를 가져온 후 nginx를 실행합니다. docker host에 이미지가 존재한다면 docker hub에 가서 이미지를 가져오는 것은 한번만 시행됩니다. 그뒤에는 같은 이미지가 계속 사용될 것입니다.
ps
명령어는 동작하고 있는 모든 컨테이너를 보여주고 컨테이너 관련된 여러가지 정보(컨테이너 ID, 컨테이너 이름 등등)를 같이 보여줍니다.
linux> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1adece44e986 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 80/tcp pedantic\_bardeen
만일 동작을 멈춘 컨테이너까지 같이 보고 싶다면 -a
옵션을 추가해 줍니다.
linux> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1adece44e986 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp pedantic\_bardeen
66e0f6ae956e nginx "/docker-entrypoint.…" 2 minutes ago Exited (0) About a minute ago zealous\_payne
이렇게 멈추거나 exit한 컨테이너들까지 모두 볼 수 있습니다.
stop
명령어는 현재 돌아가고 있는 컨테이너를 멈출 때 사용합니다. 컨테이너 ID 또는 이름을 넘겨주어야합니다.
linux❯ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94978a1b462a ubuntu "sleep 100" 9 seconds ago Up 7 seconds recursing\_teslacorretto-dev-1@corretto-dev-1 ~
linux❯ sudo docker stop 94978
94978
linux❯ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
linux❯ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94978a1b462a ubuntu "sleep 100" 52 seconds ago Exited (137) 24 seconds ago recursing\_tesla
만약 docker ID나 이름이 기억이 나지 않는다면 위의 예시처럼 docker ps
명령어를 통해 해당 정보를 알아낸 후 작업할 수 있습니다.
위에서 본것처럼 컨테이너가 멈추거나 종료되어도 해당 컨테이너는 docker host상에 계속 남아서 공간을 차지하고 있습니다. 이런 컨테이너들을 제거하기 위해서는 rm
명령어를 사용합니다.
linux> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1adece44e986 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp pedantic\_bardeen
linux> docker rm 1adec
1adec
linux> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1adece44e986 nginx "/docker-entrypoint.…" 2 minutes ago Exited (0) 4 seconds ago pedantic\_bardeen
66e0f6ae956e nginx "/docker-entrypoint.…" 3 minutes ago Exited (0) 3 minutes ago zealous\_payne
docker host에 존재하는 이미지들을 보기 위해서는 images
명령어를 사용합니다.
linux> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f0b8a9a54136 8 days ago 133MB
ubuntu latest 7e0aa2d69a15 3 weeks ago 72.7MB
tomerbd/gcc-gdb-dockerfile latest 9e232bb6309c 5 years ago 597MB
docker/whalesay latest 6b362a9f73eb 5 years ago 247MB
더이상 사용하지 않는 이미지를 지우고 싶을 때는 rmi
명령어를 사용합니다.
linux> docker rmi nginx
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 66e0f6ae956e is using its referenced image f0b8a9a54136
rmi
명령어를 사용항 때는 주의해야할 점이 있습니다. 해당 이미지를 제거하기전에 해당 이미지로부터 의존하는 컨테이너가 없어야합니다. 이미지를 제거하기전에는 반드시 해당 이미지에 의존하는 모든 컨테이너를 삭제해야합니다.
linux> sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1adece44e986 nginx "/docker-entrypoint.…" 4 minutes ago Exited (0) 2 minutes ago pedantic\_bardeen
66e0f6ae956e nginx "/docker-entrypoint.…" 6 minutes ago Exited (0) 5 minutes ago zealous\_payne
linux> sudo docker 1adec 66e0f
1adec
66e0f
linux> sudo docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2
Deleted: sha256:f0b8a9a541369db503ff3b9d4fa6de561b300f7363920c2bff4577c6c24c5cf6
Deleted: sha256:60f61ee7da08c2a5c5f6a76c1f2926f50ba1d01d8ec4af9afb8fdcd3d97ef6f9
Deleted: sha256:affa58c5a9d1d907c11d8589d4e08d2dc8e4e6b71b141269405a2e67d0a8b011
Deleted: sha256:6b1533d42f38a9c55cad97d4e01c03756ab82b61798b6c4f4bc9122093bb6ebd
Deleted: sha256:5c3e94c8305f2a4158258725fe33d2451842c13a97c76f02042a7a7e0aa3799a
Deleted: sha256:adda6567aeaa86913f56f0e4647032e1d9347bd63ed98a320f904c71df2637c1
Deleted: sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33
linux> sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7e0aa2d69a15 3 weeks ago 72.7MB
tomerbd/gcc-gdb-dockerfile latest 9e232bb6309c 5 years ago 597MB
docker/whalesay latest 6b362a9f73eb 5 years ago 247MB
아까 run
명령어를 사용할 때, 해당 이미지가 host에 없으면 자동으로 docker hub에서 이미지를 다운로드 받고 컨테이너를 실행한다고 했습니다. 만약 특정 이미지를 다운만 받고 싶다면 어떻게 해야할까요? 그럴때 사용하는 것이 바로 pull
명령어입니다.
linux> sudo docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
69692152171a: Pull complete
49f7d34d62c1: Pull complete
5f97dc5d71ab: Pull complete
cfcd0711b93a: Pull complete
be6172d7651b: Pull complete
de9813870342: Pull complete
Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2
Status: Downloaded newer image for nginx:latest
[docker.io/library/nginx:latest](http://docker.io/library/nginx:latest)
docker run ubuntu
명령어를 입력하면 ubuntu 이미지를 다운받고 컨테이너를 실행하게 될것입니다. 주목할 점은 해당 컨테이너가 실행이 되자마자 바로 종료된다는 점입니다.
linux> sudo docker run ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
linux> sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
linux> sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
077026af8a37 ubuntu "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago affectionate\_swanson
ps
명령어에도 보이지 않는 것을 보니 실제로 ubuntu 이미지로 부터 실행된 컨테이너가 없는 것을 확인할 수 있습니다. 이렇게 된 이유는 무엇일까요?
저번 장에서 설명했던 것 처럼 가상머신(Virtual Machine)과 다르게 도커의 목적은 OS를 host하는 것이 아닙니다. 도커의 목적은 특정 task나 process를 실행하는 것입니다. 해당 task나 process가 완료되면 컨테이너는 종료됩니다. 컨테이너는 컨테이너안의 process가 살아있을 때만 실행됩니다. 만약 어떤 웹서버를 돌리는 컨테이너가 있다고 했을 때 그 웹서버가 멈추거나 충돌이 일어나면 해당 컨테이너도 종료되는 것입니다.
ubuntu는 그저 OS이기 때문에(기본적으로 해당 OS안에서 돌아가는 process가 없다.) docker run ubuntu
명령어로 돌아간 컨테이너는 종료될 수밖에 없는 것입니다. 따라서 이런 경우에는 디폴트로 동작하는 프로세스를 지정하여 해당 컨테이너가 종료되지 않게끔 할 수 있습니다.
linux> sudo docker run -d ubuntu sleep 10
93e67702c79669bdf4649794a73c999696966ed743bfdfb5565c07fe17b004fc
linux> sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93e67702c796 ubuntu "sleep 10" 8 seconds ago Up 7 seconds stupefied\_zhukovsky
이렇게 되면 ubuntu 이미지로부터 컨테이너를 실행하자마자 sleep 5
에 해당하는 프로세스를 실행하게 됩니다. 10초동안 해당 프로세스가 진행되고 10초후에 프로세스가 종료되면 컨테이너가 종료되게 됩니다.
linux> sudo docker run -d ubuntu sleep 100
9534f8971d387bd0a1dc347c69077dfd1f19df00d35691b3d68740c9205be188
linux> sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9534f8971d38 ubuntu "sleep 100" 4 seconds ago Up 3 seconds compassionate\_mahavira
linux> sudo docker exec compassionate\_mahavira cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 9534f8971d38
linux❯ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9534f8971d38 ubuntu "sleep 100" 50 seconds ago Up 49 seconds compassionate\_mahavira
linux❯ sudo docker exec 9534f cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 9534f8971d38
여기서 보면 현재 ubuntu 이미지로 돌린 컨테이너가 100초 동안 sleep인 것을 볼 수 있습니다. 해당 컨테이너에서 어떤 특정 명령어를 실행시키고자 하면 exec
명령어를 활용하면 됩니다.
linux> sudo docker exec compassionate\_mahavira cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 9534f8971d38
이렇게 하면 해당 컨테이너 우분투의 /etc/hosts
폴더에 있는 내용들을 확인할 수 있습니다.
docker run kodekloud/simple-webapp
이런식으로 명령어를 입력하면 해당 컨테이너를 foreground로 돌리게 됩니다. 다른 말로 attached 모드로 돌린다고도 하는데요. 이것이 의미하는 바는 도커 컨테이너의 stdout을 콘솔과 연결하고 그 결과를 보겠다는 뜻입니다.
foreground로 돌리게 되면 해당 콘솔에서는 컨테이너가 종료될때까지 컨테이너가 돌아가는 것만 확인하고 그 어떤 작업도 할 수 없게됩니다.
docker run -d kodekloud/simple-webapp
은 detach 모드로 컨테이너를 동작 시킵니다. 여기서 -d
옵션이 detach 모드를 의미합니다. 위 명령어를 입력하면 해당 컨테이너를 background로 동작시키고 입력한 prompt로 바로 돌아올 수 있습니다.
만약 background로 돌린 컨테이너를 foreground로 변환시키고 싶으면 attach
명령어를 사용하면 됩니다.
linux❯ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9534f8971d38 ubuntu "sleep 100" 7 minutes ago Exited (0) 5 minutes ago compassionate\_mahavira
linux❯ sudo docker rm 9534f
9534f
❯❯❯ sudo docker run -d ubuntu sleep 100
03fcf7c9586ec2b2b9a3c645c064726cbcdc4023cd651f8fc074b6ab85e3f40a
❯❯❯ sudo docker attach 03fcf