docker system df
docker system df -v
이미지 · 컨테이너 · 볼륨 · 빌드 캐시 중 어디가 부풀었는지에 따라 손댈 명령이 다르다. 무턱대고 system prune -a 부터 치면 다시 내려받아야 할 이미지까지 사라진다.
| 명령 | 지우는 것 |
|---|---|
docker container prune |
중지된 컨테이너 |
docker image prune |
태그 없는(dangling) 이미지 |
docker image prune -a |
컨테이너가 쓰지 않는 모든 이미지 |
docker volume prune |
어떤 컨테이너도 참조하지 않는 볼륨 |
docker network prune |
쓰이지 않는 사용자 정의 네트워크 |
docker builder prune |
빌드 캐시 |
docker system prune |
위의 컨테이너 · 네트워크 · dangling 이미지 · 빌드 캐시 |
-f 를 붙이면 확인 질문을 건너뛴다. docker system prune 은 기본적으로 볼륨을 지우지 않으므로, 볼륨까지 지우려면 --volumes 를 명시해야 한다. 데이터가 든 볼륨이 날아가는 사고가 여기서 나오므로 습관적으로 붙이지 않는다.
빌드 캐시만 기간으로 잘라내려면 필터를 쓴다.
docker builder prune --filter "until=168h"
개별 이미지는 이름이나 ID 로 지운다.
docker images
docker rmi myapp:1.0
docker rmi -f <IMAGE_ID>
-f 는 태그가 여럿 붙었거나 중지된 컨테이너가 참조하는 이미지를 강제로 지운다. 실행 중인 컨테이너가 쓰는 이미지는 강제로도 지워지지 않으므로, 컨테이너를 먼저 정리한다.
이미지에 굽는다. Dockerfile 의 ENV 는 이미지 메타데이터에 남고 실행 시 기본값이 된다. 비밀 값은 이미지 레이어에 그대로 남으므로 넣지 않는다.
FROM eclipse-temurin:17-jre
ENV APP_PROFILE=prod
실행할 때 준다. 같은 이미지를 환경마다 다르게 띄울 때 쓴다.
docker run -e APP_PROFILE=stage -e "DB_HOST=db.example.com" -d myapp
파일로 준다. 개수가 많으면 파일로 묶는다. 이 파일은 KEY=VALUE 한 줄씩이고 따옴표를 해석하지 않는다.
docker run --env-file ./env.list -d myapp
Compose 로 준다.
services:
web:
image: myapp
environment:
APP_PROFILE: prod
env_file:
- .env
우선순위는 docker run -e 가 env_file 보다, 그 둘이 이미지의 ENV 보다 앞선다.
Dockerfile 의 EXPOSE 는 "이 컨테이너는 이 포트를 쓴다" 는 선언을 이미지 메타데이터에 남기는 것이고, 포트를 호스트로 열지 않는다.
EXPOSE 8080
EXPOSE 53/udp
실제로 여는 것은 실행 시점의 -p 다.
docker run -p 8080:8080 myapp
-P(대문자) 는 EXPOSE 로 선언된 포트를 호스트의 임의 포트에 자동으로 매핑한다. 이것이 EXPOSE 의 유일한 기능적 효과다.
docker run -P myapp
docker ps
EXPOSE 가 없어도 -p 로 포트를 열 수 있다. 이미지가 무엇을 선언했는지는 다음으로 본다.
docker inspect --format '{{json .Config.ExposedPorts}}' myapp
Compose 의 expose: 도 같은 성격이라 호스트로 열리지 않는다. 호스트에 노출하려면 ports: 를 쓴다. Kubernetes 의 containerPort 도 마찬가지로 선언용이며, 실제 접근은 Service 가 정한다.