이재홍의 언제나 최신 Docker - Unit 5. Docker 살펴보기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Docker 살펴보기

이재홍 http://www.pyrasis.com

지금까지 기본적인 명령 사용 방법과 이미지 생성 방법을 알아보았습니다. 이 장에서는 이미지와 컨테이너의 정보를 조회하는 방법, 컨테이너에서 파일을 꺼내는 방법, 변경된 파일을 확인하는 방법, 변경 사항을 이미지로 저장하는 방법을 알아보겠습니다.

history 명령으로 이미지 히스토리 살펴보기

앞에서 생성한 hello:0.1 이미지의 히스토리를 조회해보겠습니다.

$ sudo docker history hello:0.1
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
8307ff628ec8   5 minutes ago   /bin/sh -c #(nop)  EXPOSE 443                   0B
adbb8a7ef64d   5 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
a405f9d28415   5 minutes ago   /bin/sh -c #(nop)  CMD ["nginx"]                0B
a9726f7e681e   5 minutes ago   /bin/sh -c #(nop) WORKDIR /etc/nginx            0B
78f354dbdbcc   5 minutes ago   /bin/sh -c #(nop)  VOLUME [/data /etc/nginx/…   0B
66f885084c19   5 minutes ago   /bin/sh -c chown -R www-data:www-data /var/l…   0B
5c54eb835f57   5 minutes ago   /bin/sh -c echo "\ndaemon off;" >> /etc/ngin…   1.46kB
9fc2f61ad2f4   5 minutes ago   /bin/sh -c apt install -y nginx                 55.6MB
9c80ad1c1c34   6 minutes ago   /bin/sh -c apt update                           36.2MB
69b49943b930   6 minutes ago   /bin/sh -c #(nop)  MAINTAINER Foo Bar <foo@b…   0B
2dc39ba059dc   7 days ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      7 days ago      /bin/sh -c #(nop) ADD file:a7268f82a86219801…   77.8MB

docker history <이미지 이름>:<태그> 형식입니다. 이미지 이름 대신 이미지 ID를 사용해도 됩니다.

이렇게 Dockefile에 설정한 대로 히스토리가 생성됩니다.

cp 명령으로 파일 꺼내기

hello-nginx 컨테이너에서 파일을 꺼내보겠습니다.

$ sudo docker cp hello-nginx:/etc/nginx/nginx.conf ./

docker cp <컨테이너 이름>:<경로> <호스트 경로> 형식입니다.

현재 디렉터리에 nginx.conf 파일이 복사되었습니다.

commit 명령으로 컨테이너의 변경사항을 이미지로 생성하기

docker commit 명령은 컨테이너의 변경 사항을 이미지 파일로 생성합니다.

hello-nginx 컨테이너 안의 파일 내용이 바뀌었다고 치고, 컨테이너를 이미지 파일로 생성해보겠습니다.

$ sudo docker commit -a "Foo Bar <foo@bar.com>" -m "add hello.txt" hello-nginx hello:0.2

docker commit <옵션> <컨테이너 이름> <이미지 이름>:<태그> 형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.

-a "Foo Bar <foo@bar.com>"과 -m "add hello.txt" 옵션으로 커밋한 사용자와 로그 메시지를 설정합니다. hello-nginx 컨테이너를 hello:0.2 이미지로 생성합니다.

이미지 목록을 출력합니다.

$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
hello        0.2       011ff3ff87e9   14 seconds ago   170MB
hello        0.1       8307ff628ec8   6 minutes ago    170MB
ubuntu       22.04     2dc39ba059dc   7 days ago       77.8MB

hello:0.2 이미지가 생성되었습니다.

diff 명령으로 컨테이너에서 변경된 파일 확인하기

docker diff 명령은 컨테이너가 실행되면서 변경된 파일 목록을 출력합니다. 비교 기준은 컨테이너를 생성한 이미지 내용입니다.

$ sudo docker diff hello-nginx
C /etc
C /etc/nginx
A /etc/nginx/site-enabled
A /data
C /var
C /var/lib
C /var/lib/nginx
A /var/lib/nginx/body
A /var/lib/nginx/fastcgi
A /var/lib/nginx/proxy
A /var/lib/nginx/scgi
A /var/lib/nginx/uwsgi
C /run
A /run/nginx.pid

docker diff <컨테이너 이름> 형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.

A는 추가된 파일, C는 변경된 파일, D는 삭제된 파일입니다.

inspect 명령으로 세부 정보 확인하기

docker inspect 명령은 이미지와 컨테이너의 세부 정보를 출력합니다.

$ sudo docker inspect hello-nginx
[
    {
        "Id": "9f4bb4c4a3d8698a31507febffba19a655caab5a0ee78452cc2c64ea406af7bd",
        "Created": "2022-09-09T03:11:49.391803068Z",
        "Path": "nginx",
        "Args": [],
        "State": {
            "Status": "running",
            ... 생략 ...
        },
        "Image": "sha256:8307ff628ec8900bc7a80eecc54bf6f21b6019ee96d22ca3e4152a06f704756d",
        ... 생략 ...
        "Name": "/hello-nginx",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        ... 생략 ...
        "HostConfig": {
            ... 생략 ...
            "NetworkMode": "default",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "80"
                    }
                ]
            },
            ... 생략 ...
        },
        ... 생략 ...
        "Config": {
            "Hostname": "9f4bb4c4a3d8",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "443/tcp": {},
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "nginx"
            ],
            "Image": "hello:0.1",
            "Volumes": {
                "/data": {},
                "/etc/nginx/site-enabled": {},
                "/var/log/nginx": {}
            },
            "WorkingDir": "/etc/nginx",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "0adee39c61d22d570a50a3e9ba174dc7901ffea732f6aca75e5ea00a330f9fa3",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "443/tcp": null,
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "80"
                    }
                ]
            },
            ... 생략 ...
        }
    }
]
}]

docker inspect <이미지 또는 컨테이너 이름> 형식입니다. 이미지, 컨테이너 이름 대신 이미지 ID나, 컨테이너 ID를 사용해도 됩니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2022-10-03