Docker 기본 명령어

Park Choong Ho·2021년 5월 20일
0

Docker

목록 보기
2/4

Docker Commands

run - start a container

run 명령어는 이미지에서 컨테이너를 동작시키기 위한 명령어입니다.

linux> docker run nginx

위 명령어는 만약 nginx 이미지가 로컬상에서 존재하면 nginx application을 docker host에서 실행하게 됩니다. 만일 이미지가 host에 존재하지 않으면, docker hub에 가서 docker image를 가져온 후 nginx를 실행합니다. docker host에 이미지가 존재한다면 docker hub에 가서 이미지를 가져오는 것은 한번만 시행됩니다. 그뒤에는 같은 이미지가 계속 사용될 것입니다.

ps - list containers

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 - stop a container

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 명령어를 통해 해당 정보를 알아낸 후 작업할 수 있습니다.

rm - remove a container

위에서 본것처럼 컨테이너가 멈추거나 종료되어도 해당 컨테이너는 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

images - list images

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 - remove images

더이상 사용하지 않는 이미지를 지우고 싶을 때는 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

pull - download an image

아까 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)

ubuntu image

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초후에 프로세스가 종료되면 컨테이너가 종료되게 됩니다.

exec - execute a command

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 폴더에 있는 내용들을 확인할 수 있습니다.

run - attach and detach

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 
profile
백엔드 개발자 디디라고합니다.

0개의 댓글