샤인의 IT (막 적는) 메모장

[Docker] 도커 이미지 이해와 기본 명령어 본문

Container/Docker

[Docker] 도커 이미지 이해와 기본 명령어

신샤인 2021. 3. 24. 09:38
반응형

도커는 컨테이너를 올리거나 분리하는 등의 작업이 굉장히 쉬운 편입니다.

먼저 도커를 이해하는데 필요한 이미지와 컨테이너에 대해 알아봅시다.

 

이미지

 

도커 이미지는 도커에서 읽기 전용 템플릿으로 컨테이너와 관련된 인스턴스를 저장한 파일입니다.

 

하나의 컨테이너가 올라가기 위해 단일 이미지 혹은 여러 이미지로 구성되어 있습니다.

 

이를 Overlay라고 하는데 말 그대로 겹겹이 쌓아 올린다라는 느낌으로 이해하시면 좀 더 편합니다

 

Image layer

도커 이미지 확인

#My Docker Image list 
docker images

#Image pull
docker pull <IMAGE>:<TAG>

#Check my image layer
docker inspect <MY-IMAGE>

#Check Image history
docker history <MY-IMAGE>

이미지 확인 후 Inspect 명령어를 사용하여 Overlay된 이미지 목록을 확인할 수 있습니다

JSON으로 구성되어 있으며 RootFS에 Layers를 보게 되면 Overlay되어 있고 PID로 구성된 디렉토리를 확인하실 수 있습니다. 현재 예제의 Nginx의 3개의 이미지 레이어를 통해 구성된 것이죠

 

[root@docker ~]# docker inspect nginx:1.14
[
    {
        "Id": "sha256:295c7be079025306c4f1d65997fcf7adb411c88f139ad1d34b537164aa060369",   
        "RepoTags": [
            "nginx:1.14"
        ],
        "RepoDigests": [
            "nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2019-03-26T23:14:52.227945051Z",
        "Container": "5e8d96e0fb01832974f0680a9aff2fbadc37fcf30447ae30e19f59b926672041",   
        "ContainerConfig": {
            "Hostname": "5e8d96e0fb01",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.14.2-1~stretch",
                "NJS_VERSION=1.14.2.0.2.6-1~stretch"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:ac539667b75fa925232b8dbbfdfb8adb98007c44e11a5fbd4001916c0fcc0bd4",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "DockerVersion": "18.06.1-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.14.2-1~stretch",
                "NJS_VERSION=1.14.2.0.2.6-1~stretch"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:ac539667b75fa925232b8dbbfdfb8adb98007c44e11a5fbd4001916c0fcc0bd4",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 109129446,
        "VirtualSize": 109129446,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/3371b2db5b86be01d04000df75fc242b7e0a0c5105d7755308ef076cf8e935e9/diff:/var/lib/docker/overlay2/0f9fc2e85a663b852e99e4fce7149ac6a18641c23d5e221526cf5f14370c0e99/diff",
                "MergedDir": "/var/lib/docker/overlay2/48d1006a4b30a2bcbce9733d20a725b0147aae3be47f3f117585ea120413d28c/merged",
                "UpperDir": "/var/lib/docker/overlay2/48d1006a4b30a2bcbce9733d20a725b0147aae3be47f3f117585ea120413d28c/diff",
                "WorkDir": "/var/lib/docker/overlay2/48d1006a4b30a2bcbce9733d20a725b0147aae3be47f3f117585ea120413d28c/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda",
                "sha256:b8f18c3b860b067be09836beadd676a0aa1e784ec28cf730986859b4146c344a",
                "sha256:82ae01d5004e2143b642b1a008624e7521c73ab18e5776a22f18a172b9dbec80"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

또한 History라는 명령어를 통하여 해당 이미지를 어떻게 빌드했는지 알 수 있습니다.

그러나 정확하게 이미지를 만들기 위하여 어떻게 작업했는지는 알 수 없습니다. (도커 보안성의 문제)

보통 이미지를 받아서 사용하는 경우가 많은데 검증된 이미지가 아닌

일반 유저가 커스터마이징한 이미지는 문제가 될 수 있으니 주의하면서 사용해주세요

 

[root@docker ~]# docker history nginx:1.14
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
295c7be07902   24 months ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>      24 months ago   /bin/sh -c #(nop)  STOPSIGNAL SIGTERM           0B
<missing>      24 months ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>      24 months ago   /bin/sh -c ln -sf /dev/stdout /var/log/nginx…   22B
<missing>      24 months ago   /bin/sh -c set -x  && apt-get update  && apt…   53.8MB
<missing>      24 months ago   /bin/sh -c #(nop)  ENV NJS_VERSION=1.14.2.0.…   0B
<missing>      24 months ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.14.2-…   0B
<missing>      24 months ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B
<missing>      24 months ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      24 months ago   /bin/sh -c #(nop) ADD file:4fc310c0cb879c876…   55.3MB

 

history 명령어를 통하여 해당 이미지가 2년전에 작업된 것을 확인할 수 있고 지정한 환경변수 및 명령어를 확인할 수 있습니다.

 

컨테이너 실행 및 종료

 

그러면 Pull한 이미지를 컨테이너로 올려보는 작업을 수행해보도록 하겠습니다.

 

저는 예제로 Nginx:1.14 이미지를 이용하겠습니다.

 

이미지를 컨테이너로 올리는 작업에서 Foreground와 Background로 올릴 수 있는데

 

기본적으로 Foreground로 올라가지만 컨테이너를 Background로 올리고 싶은 경우 -d (detach) 옵션을 사용합니다.

 

#Upload Container

#Foreground
docker run -it --name my-fore-web nginx:1.14 <Command>

#Background
docker run -a --name my-back-web nginx:1.14

#Docker Process list
docker ps
#Docker All Process list
docker ps -a

 

[root@docker ~]# docker run -it --name my-fore-web nginx:1.14 /bin/bash
root@a09390ae1ce3:/# 
root@a09390ae1ce3:/# exit

[root@docker ~]# docker run -d --name my-back-web nginx:1.14
0e389b3911d5d91f468352cd65c82a00e2c9c87020b27184563b173fa0f346ca

[root@docker ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS              PORTS     NAMES      
0e389b3911d5   nginx:1.14   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp    my-back-web
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS                       PORTS     NAMES      
0e389b3911d5   nginx:1.14   "nginx -g 'daemon of…"   About a minute ago   Up About a minute            80/tcp    my-back-web
a09390ae1ce3   nginx:1.14   "/bin/bash"              2 minutes ago        Exited (127) 2 minutes ago             my-fore-web

 

가동된 컨테이너를 가지고 놀아봅시다.

 

현재 Exit된 my-fore-web 컨테이너를 시작하고 중지하고 삭제해보도록 하겠습니다.

 

#Start Container
docker start my-fore-web

#Container Log check
docker logs my-fore-web

#Access Container
docker exec -it my-fore-web /bin/bash

#Stop Container
docker stop my-fore-web

#Delete Container
docker rm my-fore-web

 

[root@docker ~]# docker start my-fore-web
my-fore-web
[root@docker ~]# docker logs my-fore-web
root@a09390ae1ce3:/# ll
bash: ll: command not found
root@a09390ae1ce3:/# docker run -a --name my-fore-web nginx:1.14
bash: docker: command not found

[root@docker ~]# docker exec -it my-fore-web /bin/bash
root@a09390ae1ce3:/# exit

[root@docker ~]# docker stop my-fore-web
my-fore-web

[root@docker ~]# docker rm my-fore-web
my-fore-web

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS     NAMES
0e389b3911d5   nginx:1.14   "nginx -g 'daemon of…"   18 minutes ago   Up 18 minutes   80/tcp    my-back-web

 

컨테이너 관리

 

가동된 컨테이너를 따로 관리할 수 있는데 컨테이너 이름을 변경하거나 컨테이너 내 파일 복사, 변경이력 확인 등을 명령어를 통해 수행할 수 있습니다.

 

#Container rename
docker container rename my-fore-web my-fore1-web

#Container 내 File Copy
docker container cp my-fore-web:/home /my-directory

#Container 변경이력
docker container diff my-fore-web

 

[root@docker ~]# docker start my-fore-web
my-fore-web
[root@docker ~]# docker container rename my-fore-web my-fore1-web

[root@docker ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS          PORTS     NAMES
7b6ee957dcc4   nginx:1.14   "/bin/bash"              About a minute ago   Up 59 seconds   80/tcp    my-fore1-web

[root@docker ~]# docker container cp my-fore1-web:/home .

[root@docker ~]# docker diff my-fore1-web 
C /root
A /root/.bash_history

 

도커에서 이미지를 받아 컨테이너로 올리는 방법에 대해서 알아봤습니다.

이미지와 컨테이너에 대한 이해가 확실히 잡히시면 될 것 같습니다.

 

Good Day!

반응형

'Container > Docker' 카테고리의 다른 글

[Docker] Dockerfile 작성  (0) 2021.03.26
[Docker] Docker Registry  (0) 2021.03.25
[Docker] 이미지 태깅 및 압축 파일 만들기  (0) 2021.03.24
[Docker] 도커 설치  (0) 2021.03.23
[Docker] What is Docker?  (0) 2021.03.23
Comments