Docker 운영 팁과 문제 해결

Docker를 오래 굴리다 보면 설치 이후에 만나는 자잘한 운영 이슈들이 쌓입니다. 실무에서 자주 쓴 것들을 모아뒀어요.

버전 변경 (다운그레이드 포함)

특정 버전에서 버그가 있거나 호환성을 맞춰야 할 때 버전을 바꿉니다.

docker -v                      # 현재 버전 확인
apt-cache policy docker-ce     # 설치 가능한 버전 확인

apt-get remove docker-ce docker-ce-cli   # 현재 버전 제거

# 원하는 버전으로 설치 (--allow-downgrades 로 하위 버전도 허용)
apt-get install -y docker-ce=[버전] docker-ce-cli=[버전] --allow-downgrades

service docker restart

docker-cedocker-ce-cli 의 버전을 서로 맞춰야 한다는 점이 포인트입니다.

데이터 저장 경로 변경

기본 저장 경로(/var/lib/docker)의 디스크가 부족할 때, 새 디스크로 옮깁니다.

service docker stop
mv /var/lib/docker /docker-data        # 기존 데이터 이동

vim /etc/docker/daemon.json
{
  "data-root": "/docker-data/docker"
}
service docker restart
docker pull [이미지]   # 새 경로에 저장되는지 확인

컨테이너 시간대 변경

컨테이너 로그 시각이 UTC로 찍혀 헷갈릴 때, 시간대를 한국으로 맞춥니다.

dpkg-reconfigure tzdata
# Asia(6) → Seoul(69) 선택

용량·캐시 정리

docker system df       # 도커가 차지한 용량 확인
docker image prune     # 태그 없는 댕글링 이미지 삭제
docker builder prune   # 빌드 캐시 삭제
docker rmi [이미지]     # 특정 이미지 삭제

자주 만나는 오류

alpine + nginx 컨테이너가 바로 꺼짐

Dockerfile로 alpine에 nginx를 올렸는데 웹 접속이 안 되고, 들어가 보면 nginx가 꺼져 있는 경우입니다. Nginx는 데몬으로 동작하는데, Docker는 지정한 명령이 끝나면 컨테이너를 종료해버리기 때문이에요. 포그라운드로 실행되도록 설정하면 해결됩니다.

CMD ["nginx", "-g", "daemon off;"]

docker.sock 충돌

docker.socket: Failed to create listening socket (/run/docker.sock): Address already in use

소켓이 충돌한 경우입니다. 소켓 파일을 지우고 재시작하면 됩니다.

rm -rf /var/run/docker.sock
service docker restart

nodemon: too many open files

[nodemon] Internal watch failed: EMFILE: too many open files

Node 개발 컨테이너에서 파일 감시 한도를 넘겨 발생합니다. nodemon을 전역으로 설치하거나 Dockerfile에 추가해 해결했습니다.

npm install -g nodemon

이런 오류들은 원인을 알고 나면 대처가 간단하지만, 처음 만나면 한참 헤매기 쉽습니다. 로그부터 차분히 보는 습관이 결국 제일 빠른 길이에요.