[Infra] 도커(docker)(10) 도커 관련 각종 문제 해결

업데이트:

도커(docker)(10) 도커 관련 각종 문제 해결

참고링크

운영체제 프론트엔드 백엔드 데이터베이스 인프라
리눅스구조 js필터 아파치에러로그 행삭제 아파치스쿱
프로세스 헬로월드 웹서버개념 ES기초 로그분석
네임스페이스 프로젝트생성 아파치설치 MySQL기초 beeline
디렉토리 헤더생성 flask연동 큐브리드 하둡기초
리다이렉션 async-get 장고MsSQL연결 null공백 나이파이
쓰레드 async-post 장고MySQL연결 MySQL설치(win) 백본
라즈베리파이설치 로그인페이지 장고inpectdb MySQL테이블생성 제플린
OSI7계층소개   장고read   SSL인증
OSI1계층   장고insert   커버로스
OSI2계층   장고put   도커개념
OSI3계층   장고del   도커설치
OSI4계층   flask한글요청   도커기초
OSI5,6,7계층       도커이미지
DNS서버       컨테이너네트워크
DHCP       도커API
bashrc       도커컴포즈
bash       도커볼륨
ifconfig       장고이미지
소켓프로그래밍       도커postgre
리눅스유저생성       도커이미지삭제
netstat포트열기       도커Redis
컴파일러       k8s구조
운영체제vs커널       k8s설치
작업스케쥴링       k8s서비스배포
디스크추가       POD네트워크
aws유저추가       퍼시스턴트볼륨
기초명령어       k8s에러
포트번호        

참고 링크

사례0) 도커 서비스를 재시작하고 싶을때

0-1. 문제 상황 설명

도커 서비스를 재시작하고 싶어요

0-2. 해결 방법

$ service docker restart
또는
$ systemctl restart docker 

사례1) 도커 이미지가 안지워질때

1-1. 문제 상황 설명

간만에 도커 이미지 좀 정리하려고 image 리스트를 출력했습니다. 다음은 제 도커 이미지 리스트 입니다.

$ docker image ls
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
my-ubuntu-02         0.1       9c36e432fe81   12 days ago     119MB
ubuntu               latest    cdb68b455a14   2 weeks ago     77.8MB
mytest-django-test   latest    35fa5d40cf1c   5 weeks ago     976MB
mytest-nginx-test    latest    b2631854b239   5 weeks ago     142MB
nginx-test           latest    61408ccf33f5   5 weeks ago     142MB
practice-test        latest    66f88db0ac1d   5 weeks ago     972MB
my-ubuntu            0.1       38cc32eea570   6 weeks ago     116MB
postgres             latest    75993dd36176   8 weeks ago     376MB
mytest-psql-test     latest    ad451517b273   8 weeks ago     376MB
nginx                latest    2d389e545974   8 weeks ago     142MB
ubuntu               <none>    2dc39ba059dc   2 months ago    77.8MB
python               3.10.4    e4ccc57bca82   5 months ago    920MB
hello-world          latest    feb5d9fea6a5   13 months ago   13.3kB
django               latest    eb40dcf64078   5 years ago     436MB

저는 위 이미지 중 아래에서 네번쨰에 있는 ubuntu 이미지를 지우려고 했습니다. 그랬더니 다음과 같은 에러 메시지가 출력됩니다.

$ docker image rm 2dc39ba059dc
Error response from daemon: conflict: unable to delete 2dc39ba059dc (cannot be forced) - image has dependent child images

위 메시지를 보면 해당 이미지는 dependent child image를 가지고 있으므로 삭제 할 수 없다는 것을 알 수 있습니다.

1-2. 해결 방법

따라서 해당 이미지를 삭제하고 싶다면 먼저 의존성 있는 이미지가 뭔지부터 알아야합니다.

$ docker inspect --format=' ' $(docker images --filter since={이미지ID} -q)

위 커맨드를 이용해 의존성 있는 이미지를 모두 검색합니다. since 옵션은 해당 id로부터 만들어진 이미지를 출력하라는 뜻입니다. 그리고 -q는 –quiet와 같은 옵션으로 이미지ID만 출력하라는 뜻입니다. 그 결과는 다음과 같습니다.

$ docker inspect --format=' ' $(docker images --filter since=2dc39ba059dc -q)
sha256:9c36e432fe81f3188a2e71fd81ffd69f0d952ca1453ee3967616ee2c5b5e3e40 sha256:cdb68b455a141ed921945f6d39a8c0694a7e21a37b2b030488d73e38875a26cc
sha256:cdb68b455a141ed921945f6d39a8c0694a7e21a37b2b030488d73e38875a26cc
sha256:35fa5d40cf1ca01f0375f4a57cba48315eea1f38e8b46594b40e59ace946efc8
sha256:b2631854b2391bfadd1b47ec501e6b3446635f11836aa1a3555fbb691bf4cb51
sha256:61408ccf33f58c2918096acbf956eb91277686928ef248b23b8b7028966231a5 sha256:2d389e545974d4a93ebdef09b650753a55f72d1ab4518d17a30c0e1b3e297444
sha256:66f88db0ac1d917b46714d00d2ee82210af48afa55376953c6b2af38cdc62ea6 sha256:1df04f456aba3908f6b19ce91f9cab7c530dab8f4ca175efa2bcd3dfe32c3688
sha256:38cc32eea5700d59e0f6a171f896242c1a1ab79d426ad15acd8d41ab3c8c91f8 sha256:2dc39ba059dcd42ade30aae30147b5692777ba9ff0779a62ad93a74de02e3e1f
sha256:75993dd36176c7d4be8c1e6d88a115f1fb35a85451088699dbdc80659ad688ed
sha256:ad451517b273d74c080edd5fbcd3bccbb5e6b3bce5be8c002512f5656b957f79
sha256:2d389e545974d4a93ebdef09b650753a55f72d1ab4518d17a30c0e1b3e297444

위 결과를 보면 아래에서 4번째 줄을 보면 38cc32로 시작하는 이미지가 우리가 2dc39ba 이미지의 자식임을 알 수 있습니다. 따라서 해당되는 두개의 이미지를 같이 지워주면 다음과 같이 이미지를 지울 수 있습니다.

$ docker image rm 38cc32eea570 2dc39ba059dc
Untagged: my-ubuntu:0.1
Deleted: sha256:38cc32eea5700d59e0f6a171f896242c1a1ab79d426ad15acd8d41ab3c8c91f8
Deleted: sha256:e8bb83840f3339c0e86348cf01a2eb1340488186c34e430addab31f05778bf7c
Untagged: ubuntu@sha256:20fa2d7bb4de7723f542be5923b06c4d704370f0390e4ae9e1c833c8785644c1
Deleted: sha256:2dc39ba059dcd42ade30aae30147b5692777ba9ff0779a62ad93a74de02e3e1f
Deleted: sha256:7f5cbd8cc787c8d628630756bcc7240e6c96b876c2882e6fc980a8b60cdfa274

그리고나서 마지막으로 image 목록을 확인하면 다음과 같이 결과를 확인할 수 있습니다.

$ docker image ls
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
my-ubuntu-02         0.1       9c36e432fe81   12 days ago     119MB
ubuntu               latest    cdb68b455a14   2 weeks ago     77.8MB
mytest-django-test   latest    35fa5d40cf1c   5 weeks ago     976MB
mytest-nginx-test    latest    b2631854b239   5 weeks ago     142MB
nginx-test           latest    61408ccf33f5   5 weeks ago     142MB
practice-test        latest    66f88db0ac1d   5 weeks ago     972MB
postgres             latest    75993dd36176   8 weeks ago     376MB
mytest-psql-test     latest    ad451517b273   8 weeks ago     376MB
nginx                latest    2d389e545974   8 weeks ago     142MB
python               3.10.4    e4ccc57bca82   5 months ago    920MB
hello-world          latest    feb5d9fea6a5   13 months ago   13.3kB
django               latest    eb40dcf64078   5 years ago     436MB

사례2) docker compose를 통한 이미지 빌드가 안될때(rpc error)

2-1. 문제 상황 설명

도커 컴포즈를 이용해 빌드를 하는데 다음과 같은 에러 메시지가 발생합니다.

$ docker compose up -d --build
[+] Building 0.0s (4/5)
 => [ai_portal_dl_ai_solution internal] load build definition from Dockerfile  
 => => transferring dockerfile: 32B  
 => [ai_portal_nginx internal] load build definition from Dockerfile  
 => => transferring dockerfile: 2B                                                                                                         
 => [ai_portal_dl_ai_solution internal] load .dockerignore   
 => => transferring context: 2B   
 => CANCELED [ai_portal_dl_ai_solution internal] load metadata for docker.io/library/python:3.9.7  
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount161974054/Dockerfile: no such file or directory

위 메시지를 보면 해당 도커 파일이 존재하지 않거나 경로가 존재하지 않는다는 것을 알 수 있습니다.

2-2. 해결 방법

위 문제의 해결 방법은 docker compose가 빌드하는 하위 폴더들의 Dockerfile의 이름을 확인해보면 문제의 원인을 알 수 있습니다. Dockerfile의 이름은 Dockerfile이어야지 DockerFile이면 안됩니다. 따라서 DockerFile로 잘못이름 붙여진 파일의 이름을 다시 Dockerfile로 고쳐주면 잘 돌아가는 것을 볼 수 있습니다.

사례 3) docker compose를 통한 이미지 빌드가 안될때(용량 부족)

3-1. 문제 상황 설명

도커 컴포즈를 이용해 빌드를 하려는데 no space on device라며 용량이 부족하다는 메시지가 뜹니다.

3-2. 해결 방법

위와 같이 용량이 부족한 경우에는 docker service prune명령어를 이용해 필요없는 것들을 모두 지웁니다.

$ docker system prune

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y

위와 같이 쓸데없는것을 지우면 용량이 늘어나서 빌드가 잘 되는 것을 볼 수 있습니다.