Docker
배포 직전 Dockerfile 한 번 더 보는 것들
같은 Dockerfile도 프로덕션 환경에서는 전혀 다르게 동작한다. 배포 전 체크리스트.
환경 변수가 실제로 전달되는가
Dockerfile에서 정의한 ENV와 런타임에 주입되는 환경 변수는 별개다.
# 컨테이너 실행 중인 환경 변수 확인
docker exec <container_id> env | sort
# 이미지에 빌드 타임 정의된 값
docker inspect <image_id> | grep -A10 '"Env"'
로컬에선 docker-compose.yml에서 주입한 변수가 제대로 보이는데, 운영에선 Dokploy나 Swarm에서 다르게 처리할 수 있다.
볼륨 마운트 경로
# 실제로 마운트된 볼륨 확인
docker inspect <container_id> | grep -A20 'Mounts'
# 컨테이너 내부에서 경로 확인
docker exec <container_id> ls -la /data
로컬에선 ./data:/data로 마운트되지만, Swarm 환경에선 노드별로 경로가 다를 수 있다. 특히 여러 노드에 걸쳐 실행되면 데이터가 일관되지 않을 수 있다.
포트 매핑 확인
docker ps --format "table {{.ID}}\t{{.Ports}}\t{{.Names}}"
# 네트워크 상태 확인
docker inspect <container_id> | grep -A20 'NetworkSettings'
내부 포트 8080에서 듣고 있는 애플리케이션이 외부 80으로 제대로 노출되는가. Traefik 같은 리버스 프록시 뒤에 있다면 더 주의해야 한다.
로그 드라이버 설정
Docker 컨테이너가 systemd 저널로 로그를 보내는지 파일로 쓰는지 확인한다.
# 마지막 100줄 로그
docker logs --tail=100 <container_id>
# 실시간 로그
docker logs -f <container_id>
Dockerfile에서 정의한 CMD나ENTRYPOINT가 로그를 제대로 출력하지 않으면, 컨테이너가 조용히 죽을 수 있다.
이미지 레이어 최소화
빌드 속도와 이미지 크기는 배포 안정성에 영향을 미친다.
# 이미지 크기 확인
docker images <image_name>
# 레이어별 크기
docker history <image_id>
base 이미지를 최소화하고, RUN 명령을 적절히 병합하면 레이어가 줄어든다.
최종 확인 루틴
배포 전에 다음을 한 번씩 확인한다.
- 컨테이너가 정상적으로 시작되는가
- 헬스체크 엔드포인트가 200 OK를 반환하는가
- 데이터 볼륨이 제대로 마운트되었는가
- 환경 변수가 모두 적용되었는가
이 네 가지가 통과되면 배포해도 무방하다.