🌱 Infra/Container_Docker

[Docker-Basic (3)] 도커 기본 명령어 익히기 :D

mini_world 2020. 9. 28. 13:16
목차 접기


 

이번 실습에서 Docker 컨테이너의 기본 사용법을 실습합니다. 😁

Docker 컨테이너의 Status와 라이프사이클(=명령어)을 아래 참고 사진에서 확인할 수있습니다.
* Docker 컨테이너의 5가지 Status : created, running, stopped, paused, deleted

이미지 출처 : https://github.com/jwilder/docker-gen

이제 각 명령어를 하나씩 실행 해보면서 실습해보도록 하겠습니다 :)


1. 컨테이너 생성 및 확인

   1-1) Create ( pull + create )

Create 명령어는 이미지를 가져오고, 컨테이너를 생성하는 명령어 입니다. 
Create 명령어를 사용할 경우 컨테이너는 생성되지만, Start를 별도로 해주어야 컨테이너가 실행됩니다.
# Docker container create 명령어를 통해 httpd 컨테이너를 생성해봅시다 :)

[root@docker /]# docker container create --name webserver -p 80:80 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
d121f8d1c412: Pull complete 
9cd35c2006cf: Pull complete 
b6b9dec6e0f8: Pull complete 
fc3f9b55fcc2: Pull complete 
802357647f64: Pull complete 
Digest: sha256:5ce7c20e45b407607f30b8f8ba435671c2ff80440d12645527be670eb8ce1961
Status: Downloaded newer image for httpd:latest
64c1174446d8c95377f214c90d242442a29fa821708be29e42c49b0ad50828d7

이미지를 확인해보겠습니다. 

[root@docker /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              417af7dc28bc        12 days ago         138MB

  #docker container ls -a 명령어를 통해 컨테이너의 현재 상태를 확인하겠습니다.
STATUS를 확인해보면 Running 상태가 아닌 Created 상태로 되어있는것을 볼수 있습니다.
즉, 컨테이너를 생성했지만 실행중은 아닙니다.

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
64c1174446d8        httpd               "httpd-foreground"   19 seconds ago      Created                                 webserver

컨테이너를 이제 시작해보도록 하겠습니다.

[root@docker /]# docker container start webserver
webserver

컨테이너 상태를 확인합니다. 이제 Status(상태)가 UP입니다. :)

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND              CREATED              STATUS              PORTS                NAMES
64c1174446d8        httpd               "httpd-foreground"   About a minute ago   Up 4 seconds        0.0.0.0:80->80/tcp   webserver

 

 1-2) run ( pull + create + start ) 

Run 명령어는 이미지를 pull하고 컨테이너 이미지를 create하고, start합니다 :)
위의 Create명령어와 달리 RUN 명령어는 별도로 컨테이너를 실행시키지 않아도 컨테이너가 실행됩니다.

자, 먼저 run 명령어로 nginx를 시작해봅시다.

[root@docker /]# docker container run --name nginx -d -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
d121f8d1c412: Already exists 
ebd81fc8c071: Pull complete 
655316c160af: Pull complete 
d15953c0e0f8: Pull complete 
2ee525c5c3cc: Pull complete 
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:latest
45580502d3b874b1c844d0c9b48bcf10b4ab93f989d70d28b573f70826229fa9

도커 컨테이너 목록을 확인합니다.
이번에는 별도로 Start 하지 않았지만 컨테이너가 실행되고 있습니다.

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       5 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp     webserver

 

2. 컨테이터 중지 및 재실행

이번에는 컨테이너를 중지하고 다시 시작하는 명령어를 사용해보겠습니다.

자, 지금 두개의 컨테이너가 실행되고 있습니다 :)

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       5 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp     webserver

이제 nginx 컨테이너를 중지하겠습니다.

[root@docker /]# docker container stop nginx
nginx

컨테이너 상태를 다시한번 확인하겠습니다.
nginx 컨테이너 STATUS가 Exited 상태입니다.

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS                NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   About a minute ago   Exited (0) 2 seconds ago                        nginx
64c1174446d8        httpd               "httpd-foreground"       7 minutes ago        Up 5 minutes               0.0.0.0:80->80/tcp   webserver

이제 nginx 컨테이너를 다시 시작 하겠습니다.

[root@docker /]# docker container restart nginx
nginx

컨테이너  상태를 다시한번 확인합니다.
이제 nginx 컨테이너의 Status가 UP상태가 되었습니다.

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   2 minutes ago       Up 1 second         0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       7 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp     webserver

 

3. 컨테이너 일시중지

이번에는 nginx 컨테이너를 일시중지(pause)해보도록 하겠습니다.

[root@docker /]# docker container pause nginx
nginx

nginx 컨테이너의 Status가 UP (Paused)인 것을 확인할 수 있습니다. 

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   5 minutes ago       Up 3 minutes (Paused)   0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       10 minutes ago      Up 9 minutes            0.0.0.0:80->80/tcp     webserver

이번에는 일시중지를 풀겠습니다.

[root@docker /]# docker container unpause nginx
nginx

nginx 컨테이너의 Status가 UP인 것을 확인할 수 있습니다. 

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   5 minutes ago       Up 3 minutes        0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       11 minutes ago      Up 9 minutes        0.0.0.0:80->80/tcp     webserver

 

 

4. 컨테이너 내부 정보 확인하기

컨테이너의 내부정보를 확인할 수 있는 명령어를 확인합니다.

[root@docker /]# docker container inspect nginx
[
    {
        "Id": "45580502d3b874b1c844d0c9b48bcf10b4ab93f989d70d28b573f70826229fa9",
        "Created": "2020-09-28T04:15:34.48069232Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4048,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-09-28T04:17:38.822151268Z",
            "FinishedAt": "2020-09-28T04:17:15.43676131Z"
        },
        
        -- 생략 --
        
]

 

5. 컨테이너 접속 및 파일 변경하기 (index.html)

컨테이너의 목록을 확인하겠습니다.
이번에는 nginx 컨테이너에 접속해서 index.html 파일의 내용을 수정해보겠습니다.

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   9 minutes ago       Up 7 minutes        0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       15 minutes ago      Up 13 minutes       0.0.0.0:80->80/tcp     webserver

nginx 컨테이너에 접속합니다.

[root@docker /]# docker container exec -it nginx /bin/bash

컨테이너에 접속 되었습니다.
이제 index.html 파일에 새로운 내용을 입력하고 컨테이너에서 나옵니다.

root@45580502d3b8:/# echo 'Docker Container - test' > /usr/share/nginx/html/index.html 
root@45580502d3b8:/# exit
exit

nginx http 출력 결과를 확인해봅시다 :)

[root@docker /]# curl 127.0.0.1:8080/index.html
Docker Container - test

 

6.  컨테이너 로그 정보 확인

컨테이너 실행시 오류가 나서 로그를 확인해봐야할때, 어떻게 볼수있을까요 ?
컨테이너 내부의 로그를 확인합니다.

컨테이너의 목록을 확인해봅시다.
두개의 컨테이너가 운영중이니, 두개 모두 로그를 확인해봅시다!

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   9 minutes ago       Up 7 minutes        0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       15 minutes ago      Up 13 minutes       0.0.0.0:80->80/tcp     webserver

먼저 nginx 컨테이너의 로그를 확인해봅시다.
위에서 index.html 페이지 요청한것도 로그로 남아있네요 :)

[root@docker /]# docker container logs -f nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: error: IPv6 listen already enabled
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
172.17.0.1 - - [28/Sep/2020:04:26:56 +0000] "GET /index.html HTTP/1.1" 200 24 "-" "curl/7.29.0" "-"

이번에는 webserver(httpd)로그를 확인해봅니다.

[root@docker /]# docker container logs -f webserver
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Mon Sep 28 04:11:59.349361 2020] [mpm_event:notice] [pid 1:tid 139753489142912] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations
[Mon Sep 28 04:11:59.349535 2020] [core:notice] [pid 1:tid 139753489142912] AH00094: Command line: 'httpd -D FOREGROUND'
209.17.96.42 - - [28/Sep/2020:04:33:31 +0000] "GET / HTTP/1.1" 200 45

 

7. 컨테이너 상태 정보 확인

그럼 컨테이너의 CPU Memory 사용량 등의 실시간 정보는 어떻게 확인할까요?
stats 명령어로 상태를 확인할 수 있습니다, 확인 해봅시다 :)

[root@docker /]# docker container stats

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
45580502d3b8        nginx               0.00%               1.406MiB / 7.392GiB   0.02%               1.39kB / 682B       0B / 0B             2
64c1174446d8        webserver           0.00%               17.09MiB / 7.392GiB   0.23%               2.82kB / 1.53kB     0B / 0B             109

 

8. 컨테이너 프로세스 및 포트 확인

컨테이너 목록을 확인합니다.

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   28 minutes ago      Up 26 minutes       0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       33 minutes ago      Up 31 minutes       0.0.0.0:80->80/tcp     webserver

nginx 컨테이너 내부에 어떤 프로세스가 구동중인지 확인할 수 있습니다.
nginx 프로세스네요 :)

<!-- 컨테이너 nginx의 프로세스 확인 -->
[root@docker /]# docker container top nginx
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4048                4031                0                   04:17               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 4092                4048                0                   04:17               ?                   00:00:00            nginx: worker process

nginx 컨테이너에서 사용하는 포트를 확인해봅시다.
컨테이너 80포트가 호스트 컴퓨터의 8080포트로 연결되어있네요 :)

[root@docker /]# docker container port nginx
80/tcp -> 0.0.0.0:8080

이번에는 webserver 컨테이너를 확인해봅시다!
지금 webserver 컨테이너에서 운영되고있는 프로세스입니다.

[root@docker /]# docker container top webserver
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                3662                3644                0                   04:11               ?                   00:00:00            httpd -DFOREGROUND
bin                 3689                3662                0                   04:11               ?                   00:00:00            httpd -DFOREGROUND
bin                 3690                3662                0                   04:11               ?                   00:00:00            httpd -DFOREGROUND
bin                 3691                3662                0                   04:11               ?                   00:00:00            httpd -DFOREGROUND
bin                 4244                3662                0                   04:41               ?                   00:00:00            httpd -DFOREGROUND

 

webserver 컨테이너에서 사용하는 포트는 80포트이며, 호스트 컴퓨터에도 80 포트에 매핑되어있네요 :)

[root@docker /]# docker container port webserver
80/tcp -> 0.0.0.0:80

 

9. 컨테이너 이름 변경하기

컨테이너의 목록을 확인해봅니다. webserver 컨테이너의 이름을 바꿔볼까요?

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   31 minutes ago      Up 29 minutes       0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       36 minutes ago      Up 34 minutes       0.0.0.0:80->80/tcp     webserver

docker container rename <컨테이너 지금쓰는이름> <컨테이너 바꿀 이름> 명령어를 통해 이름을 변경합니다. 

[root@docker /]# docker container rename webserver apache_server

잘 변경 되었는지 확인해봅니다 :)
apache_server로 잘 변경되었네요.

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   31 minutes ago      Up 29 minutes       0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       36 minutes ago      Up 35 minutes       0.0.0.0:80->80/tcp     apache_server

 

10. 컨테이너에 파일 복사하기

이번에는 호스트 컴퓨터의 index2.html 파일을 컨테이너로 복사 붙여넣기 해보도록 하겠습니다. :)

컨테이너 목록을 확인해봅시다.
이번에도 apache_server 컨테이너를 사용해봅시다!

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   34 minutes ago      Up 32 minutes       0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       39 minutes ago      Up 38 minutes       0.0.0.0:80->80/tcp     apache_server

자, 먼저 apache_server 컨테이너의 웹서버가 잘 동작하고 있는지 확인해봅시다.

[root@docker /]# curl 127.0.0.1:80/index.html
<html><body><h1>It works!</h1></body></html>

이제 index2.html 파일을 작성하겠습니다.

[root@docker /]# echo 'This is Docker test - File COPY' > index2.html

이제 이 파일을 컨테이너에 복사하겠습니다.
명령어는 docker container cp <원본파일> <컨테이너명>:<경로> 입니다 :)

[root@docker /]# docker container cp index2.html apache_server:/usr/local/apache2/htdocs/

자 이제 잘 복사되었나 확인해볼까요! 
index2.html 파일이 컨테이너 내부로 복사 되었고, index2.html 요청에 응답 잘 하네요!!

[root@docker /]# curl 127.0.0.1:80/index2.html
This is Docker test - File COPY

 

11. 컨테이너 변경 정보 확인하기

위 단계에서 index2.html이라는 파일을 컨테이너 내부에 복사해넣었습니다.
diff 명령어로 도커 컨테이너 변경정보 확인 해보겠습니다. index2.html은 새로 추가되어 A 태그가 붙어있네요!
* 'C'는 Change, 'A'는 Add, 'D'는 Delete 

[root@docker /]# docker container diff apache_server
C /usr
C /usr/local
C /usr/local/apache2
C /usr/local/apache2/logs
A /usr/local/apache2/logs/httpd.pid
C /usr/local/apache2/htdocs
A /usr/local/apache2/htdocs/index2.html

 

12. 컨테이너 삭제하기

이제 마지막 단계입니다.
컨테이너를 생성하고 운영해보았으니, 이제 삭제해볼까요!
컨테이너의 목록을 확인해봅시다!

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   39 minutes ago      Up 37 minutes       0.0.0.0:8080->80/tcp   nginx
64c1174446d8        httpd               "httpd-foreground"       45 minutes ago      Up 43 minutes       0.0.0.0:80->80/tcp     apache_server

컨테이너 remove(rm) 명령어를 이용해서 컨테이너를 삭제 해볼까요?
앗, 에러가 나오네요. 
그 이유는 실행중인 컨테이너는 stop 이후에 remove 할수있기 때문입니다.

[root@docker /]# docker rm apache_server
Error response from daemon: You cannot remove a running container 64c1174446d8c95377f214c90d242442a29fa821708be29e42c49b0ad50828d7. Stop the container before attempting removal or force remove

이번에는 f 옵션을 줘서 강제로 삭제해보겠습니다.

[root@docker /]# docker rm apache_server -f
apache_server

잘 지워졌는지 목록을 확인해봅니다.
삭제가 잘 되었습니다 :)

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   40 minutes ago      Up 38 minutes       0.0.0.0:8080->80/tcp   nginx

Prune 명령어를 사용해볼건데, 이 명령어는 중지상태인 컨테이너를 전체 삭제하는 명령어 입니다.

[root@docker /]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

지금은 중지상태인 컨테이너가 없어서, 상태 그대로 유지됩니다. 결과 확인해볼게요 :)

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45580502d3b8        nginx               "/docker-entrypoint.…"   42 minutes ago      Up 39 minutes       0.0.0.0:8080->80/tcp   nginx

그런데 이렇게 하나하나 삭제하는게 귀찮을떄 한번에 날릴수 있는 명령어가 있을까요?
전체 삭제 해봅시다!

[root@docker /]# docker container rm -f $(docker ps -aq)
45580502d3b8

컨테이너 목록을 확인해봅시다 :)
전부 다 잘 삭제 되었네요.

[root@docker /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

수고하셨습니다. 🥳

728x90