Docker 디버깅

우야·2021년 6월 30일

Docker 디버깅 상황

  • 이미지 자체를 확인 (run)
  • 살아 있는 컨테이너 상태 확인 (exec)
    • 컨테이너 변경사항 확인 (diff)
  • 이미 죽어버린 컨테이너 확인 (commit)

이미지 자체를 확인 (run)

  • docker run
    • 컨테이너보다는 이미지를 검증하고 탐색하기 위한 용도로 사용
    • 컨테이너를 실행하여, 이미지 내부의 상태를 점검
$ docker run -it ubuntu:latest bash
root@a8747c46330d:/#
## find로 찾아보기
root@a8747c46330d:/# find / -name "*lsb-release*"
/etc/lsb-release

## apt-get으로 패키지 install
root@a8747c46330d:/# apt-get update
root@a8747c46330d:/# apt-get -y dnsutils

## network dns 확인
root@a8747c46330d:/# nslookup google.com
Server:         192.168.65.1
Address:        192.168.65.1#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.25.110
Name:   google.com
Address: 2404:6800:4004:809::200e
  • docker run 안될때
    • bash나 sh가 안먹는경우가 있음.
    • 이럴때는 아래와 같이 docker inspect를 사용하여 cmd를 확인해본다.
      • 환경변수 env에 /bin/bash, /bin/sh...등이 있는지 확인
      • $ docker run -it alpine /bin/sh 와 같이 직접 입력
    • cmd에 ENTRYPOINT가 있는경우
      • --entrypoint옵션으로 빈값을 넘겨 실행
      • $ docker run -it --entrypoint '' ubuntu:ls bash
  • docker inspect으로 이미지의 설정 확인
    • 이미지 inspect로 확인
    • imageName, Tag, Digest, OverlayFS, config, parent, GraphDriver, Environment 등 확인
[
    {
        "Id": "sha256:3064f4ae383a01f8b67578e168d7abd7941786fad0f996f4a1311f498593e",
        "RepoTags": [
            "a_baseimage:latest",
            "docker:5000/a_baseimage:latest"
        ],
        "RepoDigests": [
            "docker:5000/a_baseimage@sha256:f0a3cea1b30009c2f4b88893c0c0ebc57baab02dc425cfec2325ecf918f0"
        ],
        "Parent": "sha256:f8aaeeeead956d9d77bbe2c5537fb345c3311696ad656b317eb9a0a86da9",
        "Comment": "",
        "Created": "2021-05-1T08:45:55.33510559Z",
        "Container": "137e26398e4a1acb43d509f7e534e149a691e6c58eef10e9a54a60155fb8",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "http_proxy=http://0.0.0.0:8080",
                "https_proxy=http://0.0.0.0:8080",
                "LC_ALL=en_US.UTF-8",
                "PIP_CONFIG_FILE=/pip.ini"
            ],
            "Cmd": [
                "|2",
                "BUILD_HTTPS_PROXY=http://0.0.0.0:8080",
                "BUILD_HTTP_PROXY=http://0.0.0.0:8080",
                "/bin/sh",
                "-c",
                "pip3 install --upgrade pip setuptools"
            ],
            "Image": "sha256:f8aaeeeead956d9d77bbede2c5bc537fb5c3311696ad656b317eb9a0a86da9",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "20.10.3",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "http_proxy=http://0.0.0.0:8080",
                "https_proxy=http://0.0.0.0:8080",
                "LC_ALL=en_US.UTF-8",
                "PIP_CONFIG_FILE=/pip.ini"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:f8aaeeeead956d9d77bbede2c5bc5b3453311696ad656b317eb9a0a86da9",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 607623913,
        "VirtualSize": 607623913,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/e89c65c0108a0d9fa2680aa5dd179a48389edf4cabb2df81b6acf40b2b278c/diff:/var/lib/docker/overlay2/1efed0805bc7a051bb7df90d49d32ec4e4502c9703788b896ae2ddd61cac67/diff:/var/lib/docker/overlay2/462e9905c673ec06a866f01c6e693b583015283760b6c948fbe6705b8b3/diff:/var/lib/docker/overlay2/1c72dbb5cb7f76553249234ae9840f1b3f627f01abc980f5191654c1b2b761/diff:/var/lib/docker/overlay2/21c49bf9362deca22f6d1223ee3b5aed70c7620eae75a6e361d1e7132a87f/diff:/var/lib/docker/overlay2/7934e13465f23db633b2d1bfe5d45ac98352042860a044cf1549ae3626d96/diff:/var/lib/docker/overlay2/3bb4eae01beccadfdbe0926297acee510ebd12852af04edf90ac1cef141d0/diff:/var/lib/docker/overlay2/6cbbf1aae6b1c626a920131205230bf8592730b6cb41b8a496046dd4eab59/diff:/var/lib/docker/overlay2/3b543f75056f50772315acdf75ef10be75b7d535cc59324e8b96227a23ec8/diff:/var/lib/docker/overlay2/e0db69a6e1608f62d8cc0508b228f6d414821199320f49f0a4886f4ab8bdb/diff:/var/lib/docker/overlay2/d478f3bcf81d259fb692914dd46d088b7da34c7e39b8f2df9e6a5dff9cf52/diff:/var/lib/docker/overlay2/3d92d2c82a00e964e22df048aec18efd4fa8a0a46dc82f40678d421ec0d04/diff:/var/lib/docker/overlay2/b0d72e6d8b544bdea28f7c12608b79592b41868dd770da392511294e5/diff:/var/lib/docker/overlay2/0d111a8f7e3ce761fd065f35d93c3f32fdc65065ee3bdc4bd545fda1d922f/diff:/var/lib/docker/overlay2/3833b9749cfd579cf7f23f9c7ef85143dec2b9839f5f632300e580c530cae/diff:/var/lib/docker/overlay2/58739caaf9d32aeb2e7424d8904a8e8a2a547554f206bca572d1d0a022779/diff:/var/lib/docker/overlay2/df2ba263f47c0904309a2acf3e746dd70754b3a1d2f4ee9f7c107fe515650/diff",
                "MergedDir": "/var/lib/docker/overlay2/ffd26c2770f1bd8e5dbe47c0dfc29a7cc1b88e10c35cf76dcdc94dddd9bd8/merged",
                "UpperDir": "/var/lib/docker/overlay2/ffd26c2770f1bd8e5db3a3e0dfc29a7cc1b88e10c35cf76dcdc94dddd9bd8/diff",
                "WorkDir": "/var/lib/docker/overlay2/ffd26c2770f1bd8e5db3a3e0dfc29a7cc1b88e10c35cf76dcdc94dddd9bd8/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:16012e0c1d35cf9bd845b5be586fea29507f3804307f097caec52046cfef7",
                "sha256:31dda91e27a1883299aaf7269092fdb1bef7753c469e4083fe2300b1ef8d8",
                "sha256:fbb91e31093e0bc3538a50665826af65be77ff354cc2bc52eb8950d0e80f3",
                "sha256:1d5d9edd4bbc93c92cdae8b3956b739e0ea8e3e20f8aa9924e38a9926e309",
                "sha256:f9d7ef1b472094f0359a9d390212075148646451c35e5c2c9a1ba297a56cf",
                "sha256:3528561f33b7fde42c24e9079c40c93310a7c4933f81295d8c419b5ea177e",
                "sha256:71dff01a27caf466a3e92551bffab555380d427798d3703c43836221a280f",
                "sha256:7b4721aad8a8fa947fc434cf2ac207658a3b8c20788de4d2b830d0ed3a3e7",
                "sha256:8b1683938a0b078c96868d6ee86fd7be2fb93f0a9a0bc363761e5925540e5",
                "sha256:c1e8a6e87b44b3e78338cf76f07b90577a0b39ce29209fb222a7b46f90e86",
                "sha256:0dfb4cf0888d6428329e89c09ed4558705f1a7c63f8cd97bfb0f49e61182",
                "sha256:c4f7c03c8e91dd1e49bc9107e76f03b5a670a94c96ccd85cfc5862fac3695",
                "sha256:313b4ef352d3f7fd5dfd5fe3f491865d65c323db3b1c3807208f02d13d68d",
                "sha256:bbdc29f119fc3f13ae659cca1c17ae079cd875ef226f18b264ebd703d23de",
                "sha256:e77db829d62923031e90972e37d5965d9d5d65504c3554a7a629a62a511a6",
                "sha256:081fd1951b716c4d2212880caf8bf03126fad4dc02d9346b061c0a99c2d5f",
                "sha256:a5b81b4baf0ee6d13e3ac00923c8d06a9de7c55c31094fcd1b1f367e2fa47",
                "sha256:5e4812554734ed6ced8eb0f674aea6999dcc7bb966e41aec3019eb24fba675e5"
            ]
        },
        "Metadata": {
            "LastTagTime": "2021-05-1T17:45:56.750353201+09:00"
        }
    }
]

살아 있는 컨테이너 상태 확인 (exec)

  • docker exec
    • 실제로 실행중인 컨테이너에 또 다른 명령어를 실행하는 방법
## 테스트를 위해 컨테이너를 하나 실행

$ docker run -d -p 8000:80 --name nginx nginx
80ff0d0c4752d82f55ecafddfac94966644b96df62288ef49d9c03fb1b0157a0

## 확인
$ docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
80ff0d0c4752        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        0.0.0.0:8000->80/tcp   nginx
  • 컨테이너 변경사항 확인 (diff)
    • 컨테이너 실행후 최초 이미지에서 변경된 내용을 확인
    • '/run/nginx.pid'파일등 여러 파일이 생성, 변경된 것을 확인
$ docker diff 80ff0d0c4752
C /run
A /run/nginx.pid
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
## 이미 실행중인 컨테이네에 들어가서 확인 할 수 있음

$ docker exec -it 80ff0d0c4752 bash
root@80ff0d0c4752:/# cat /run/nginx.pid
1
root@80ff0d0c4752:/#

이미 죽어버린 컨테이너 확인 (commit)

  • docker commit
    • 컨테이너가 죽었을때, restart로 재실행하더라도 죽어버리는 경우가 많음
    • Docker build과정에서 사용되며, 컨테이너의 특정 상태를 그대로 이미지로 만들어주는 명령어
## 실행중인 컨테이너 강제로 죽여서 테스트 시작
$ docker kill 80ff0d0c4752
80ff0d0c4752

$ docker exec -it 80ff0d0c4752 bash
Error response from daemon: Container 80ff0d0c4752 is not running


## commit 명령을 통해서 새로운 이미지 생성
$ docker commit 80ff0d0c4752 nginx:killed
sha256:67edfba59ed618badfe5dde7105e25473f68cb28f50608aaca3e39bcc824eb20

$ docker images | grep nginx
nginx            killed              67edfba59ed6        32 seconds ago      126MB

## 생성된 이미지를 실행하여 실행중에 생긴 log, file 확인
### nginx가 실행되다가 강제로 종료되었기때문에 컨테이너 실행시 생성된 /run/nginx.pid가 그대로 남아 있는것을 확인할 수 있음

docker run -it nginx:killed bash
root@621c34ab41ee:/# cat /run/nginx.pid
1
root@621c34ab41ee:/#

https://www.44bits.io/ko/post/docker-container-trouble-shooting-by-exec-and-commit

profile
Fullstack developer

0개의 댓글