환경 일관성과 데이터 관리의 용이성 때문에 온프레미스로 구현되고 있는 서비스의 서버에 database 를 Docker 를 이용하여 배포하고 운영하고 있습니다.
해당 Postgres 의 컴포즈 파일을 설정하다가, 계속적인 부팅 이슈가 발생하길래 그것을 수정하여 개선해보려 합니다.
postgres:
image: ${POSTGRES_IMAGE:-postgres:15}
container_name: ${POSTGRES_SERVICE_NAME:-postgres}
env_file: .env.postgres
ports:
- "${POSTGRES_PORT:-5432}:5432"
volumes:
- ${ROOT_HOST}/postgres-data:/var/lib/postgresql/data
command: >
bash -c "
apt-get update &&
apt-get install -y locales tzdata &&
sed -i 's/# ko_KR.UTF-8 UTF-8/ko_KR.UTF-8 UTF-8/' /etc/locale.gen &&
locale-gen &&
dpkg-reconfigure --frontend=noninteractive tzdata &&
exec docker-entrypoint.sh postgres
"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
networks:
- ${DOCKER_NETWORK_NAME}
restart: unless-stopped
postgres-backup:
image: ${POSTGRES_IMAGE:-postgres:15}
container_name: ${POSTGRES_BACKUP_SERVICE_NAME:-postgres-backup}
restart: "no"
depends_on:
postgres:
condition: service_healthy
env_file: .env.postgres
environment:
PGPASSWORD: password
volumes:
- /home/{name}/postgres-backups:/backups
- ./scripts:/scripts:ro
networks:
- ${DOCKER_NETWORK_NAME}
profiles:
- backup
기본적으로 설정한 것들은 다 설정해뒀다 생각을 하고 있었는데,
막상 확인을 해보니 문제가 많더라구요
1) 컨테이너 시작할 때마다 apt-get install
도커는 이미지 빌드 시점에 고정을 하고, 런타임에 그 이미지를 실행하는 모델입니다.
하지만, 해당 도커 컴포즈 설정 파일은
- 재시작이 느려짐: DB는 재시작이 빨라야 하는데, 매번 패키지 설치로 몇 분씩 걸릴 수 있음
- 외부 네트워크 의존: apt repository가 일시 장애나 DNS 이슈 나면 → DB 컨테이너가 부팅 실패
- 환경이 매번 달라질 수 있음: apt로 “오늘 받아오는 패키지 버전”이 바뀌면,
- 같은 postgres:15 이미지라도 컨테이너 내부 상태가 달라짐 → 재현성 깨짐
- 보안 업데이트 통제 불가: 런타임에 즉석 업데이트되니, 어떤 패키지가 깔렸는지 추적/검증이 어려움
의 문제를 야기할 수 있겠더라구요.
command 에 설정 되어있는 기본적인 값들 때문에...
2) dpkg-reconfigure tzdata 같은 “인터랙티브/상태성” 작업은 컨테이너에 안 맞음
컨테이너는 기본적으로
- “짧고 빠른 프로세스 실행”
- “환경변수/파일로 설정 주입” 에 최적화되어 있음.
dpkg-reconfigure는 원래 시스템(호스트 OS)에서 돌리는 전제라,
- 파일 시스템에 설정을 남기고
- 패키지 상태 DB를 바꾸고
- 때론 interactive prompt를 전제로 함
지금은 --frontend=noninteractive로 눌러놨지만, 여전히 컨테이너를 OS처럼 다루는 방식이라 운영에서 리스크가 큽니다.
즉, ENV TZ=Asia/Seoul + /etc/localtime 링크 세팅을 이미지 빌드 단계에서 처리해야 된다!
3) 런타임 상태가 이미지에 남지 않는다
도커에서 중요한 개념 하나
컨테이너는 버리고 이미지는 남긴다
지금 구조에서는
- locales / tzdata 설치
- locale-gen 실행
이 모든 작업이 컨테이너 실행 중에만 존재 합니다.
컨테이너를 지웠다가 다시 띄우면?
→ 또 다시 같은 작업을 반복한다.
이건 “이미지를 쓰는 것”이 아니라 매번 새 서버에 Postgres를 설치하는 것과 다르지 않게 된 것
4) DB 백업 컨테이너에서도 같은 문제가 반복된다
- 서버 이미지
- locales/tzdata 설치
- 불필요한 구성
을 백업 작업 하나 하자고 또 띄우고 있습니다.
도커의 장점은 “필요한 것만 가진 최소 컨테이너”인데,
여기서는 그 장점을 전혀 살리지 못하고 있는 거 같습니다.
그래서 이제 해당 Postgres 도커 설정을 좀 더 실무에 적합하게 바꾸어 새로 올려보려 합니다.
'DevOps > Docker' 카테고리의 다른 글
| [docker-compose]온프렘 도커 배포 실전 삽질기 (네트워크, 쿠키, 헬스체크 해결편) (0) | 2025.12.31 |
|---|---|
| [docker-compose]온프레미스 환경에서 Docker Compose로 서비스 구성하기 (0) | 2025.12.31 |
| [Docker] 실행 방법 (0) | 2025.12.11 |
| [docker] 개념 정리 (0) | 2025.12.10 |
| [BuildX & 서버 이전] FastAPI + PaddleOCR 서버 이전기: "exec format error"와 Docker Buildx 완벽 가이드 (0) | 2025.12.07 |