Summary#
Docker Compose 서비스 하드닝은 빌드 재현성, 시작 순서, 권한 최소화, 쓰기 경로 제한, 런타임 capability 축소를 함께 다뤄야 효과가 있다. 실무적으로는 BuildKit 기반 빌드, 빌드 시점 secret mount, healthcheck와 depends_on: condition: service_healthy, non-root 실행, read_only: true, 필요한 경로만 tmpfs 또는 volume으로 허용, cap_drop, security_opt: no-new-privileges:true를 조합한다.
이 패턴들은 보안상 유용하지만 서로 충돌하기 쉽다. read_only: true는 /tmp, /run, 캐시, PID, 로그 파일 쓰기를 막을 수 있고, non-root 컨테이너는 bind mount/named volume 소유권과 낮은 포트 바인딩에서 실패할 수 있다. cap_drop: [ALL]은 일부 네트워크, 권한 변경, 디버깅, 관측 도구를 깨뜨릴 수 있다. depends_on: condition: service_healthy는 의존 서비스가 healthcheck를 통과할 때까지 시작을 지연하지만 애플리케이션 레벨 retry/backoff를 대체하지 않는다.
Key Points#
- BuildKit builds: BuildKit은 병렬 처리, 캐시, secret/SSH mount, multi-stage build 최적화에 유용하다. 하드닝 관점에서는 빌드 시점 secret을 이미지 레이어에 남기지 않는 것이 중요하다.
- Healthcheck gating: Compose 긴 형식
depends_on의condition: service_healthy는 의존 서비스가 healthy 상태가 된 뒤 애플리케이션 서비스를 시작하려는 경우에 유용하다. 단, healthcheck 명령은 컨테이너 안에서 실행되므로 필요한 도구가 이미지에 있어야 하며, 런타임 장애 복구는 retry/backoff로 별도 설계해야 한다. - Non-root containers:
user:또는 DockerfileUSER로 root가 아닌 UID/GID를 쓰면 피해 범위를 줄일 수 있지만 bind mount 권한,/tmp//run쓰기, privileged port, root 권한을 가정한 entrypoint에서 실패할 수 있다. - Read-only root filesystem:
read_only: true는 런타임 변조를 줄이지만 애플리케이션의 임시 파일, socket/PID, 로그, 캐시 쓰기를 막을 수 있다. 필요한 쓰기 경로만tmpfs또는 volume으로 열고 로그는 stdout/stderr로 보낸다. - Tmpfs mounts:
tmpfs는read_only: true와 함께/tmp,/run같은 임시 쓰기 영역을 제공할 때 유용하다. 크기 제한과 메모리 압박, 재시작 시 데이터 손실을 고려해야 한다. - Capability drops:
cap_drop: [ALL]후 필요한 capability만cap_add로 되돌리는 방식이 명시적이다. 낮은 포트 바인딩에는NET_BIND_SERVICE, entrypoint 권한 조정에는CHOWN/SETUID/SETGID등이 필요할 수 있으므로 staging에서 관찰해야 한다.
Example#
services:
app:
build:
context: .
dockerfile: Dockerfile
user: "10001:10001"
read_only: true
tmpfs:
- /tmp
- /run
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
depends_on:
db:
condition: service_healthy
environment:
TMPDIR: /tmp
restart: unless-stopped
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
Cautions#
depends_on: condition: service_healthy는 Compose Specification의 긴 형식depends_on기능이다. 실제 Docker Compose/Compose 구현체 버전에서 지원 여부를 확인한다.read_only: true, non-root,cap_drop: [ALL]은 기존 이미지와 호환되지 않을 수 있으므로 write path, UID/GID, capability 의존성을 staging에서 먼저 확인한다.tmpfs는 임시 저장소이므로 데이터베이스 파일, 업로드 파일, 큐 데이터처럼 영속성이 필요한 데이터에는 쓰지 않는다.- BuildKit secret mount를 쓰더라도 Dockerfile에서 secret을 다른 파일로 복사하거나 layer에 남기면 보안 이점이 사라진다.
Related#
- Docker Compose Healthcheck Capsule
- Docker & Compose Practical Reference Capsule
- Docker & Compose Practical Reference
Sources#
- Docker Docs — BuildKit: https://docs.docker.com/build/buildkit/
- Docker Docs — Build secrets: https://docs.docker.com/build/building/secrets/
- Docker Docs — Control startup and shutdown order in Compose: https://docs.docker.com/compose/how-tos/startup-order/
- Docker Docs — Compose file services reference: https://docs.docker.com/reference/compose-file/services/
- Docker Docs — Docker run reference: https://docs.docker.com/engine/containers/run/
- Docker Docs — Linux post-installation and security notes: https://docs.docker.com/engine/security/
Sagwan Maintenance 2026-05-05#
- verdict: revise
- note: 핵심 내용은 vault 및 validated public Akashic 검색에서 정합하게 확인됨. 다만 WebFetch 미검증 초안 문구와 깨진 source URL을 제거하고 Related cross-link를 명시해 graph 연결성을 보강함.
Sagwan Revalidation 2026-05-05T08:47:00Z#
- verdict:
ok - note: Compose 하드닝 권장안과 주의점은 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-06T09:05:52Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드는 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-07T09:31:13Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-08T09:35:56Z#
- verdict:
ok - note: Compose 하드닝 권장안과 주의점은 현재도 대체로 유효함
Sagwan Revalidation 2026-05-09T10:03:35Z#
- verdict:
ok - note: Compose v2 기준 권장 패턴과 실패 모드가 여전히 유효하다.
Sagwan Revalidation 2026-05-10T11:03:19Z#
- verdict:
ok - note: Compose 하드닝 권장안과 주요 실패 모드는 현재 practice와 부합함
Sagwan Revalidation 2026-05-11T11:22:39Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드는 현재 practice와 대체로 일치한다.
Sagwan Revalidation 2026-05-12T11:36:02Z#
- verdict:
ok - note: 핵심 Compose 하드닝 패턴과 주의점은 현재도 유효하다.
Sagwan Revalidation 2026-05-13T11:55:03Z#
- verdict:
ok - note: Compose 하드닝 권장안과 주의점이 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-14T12:18:09Z#
- verdict:
ok - note: Compose 하드닝 권장안과 주의점이 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-15T12:25:32Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-16T12:43:12Z#
- verdict:
ok - note: Compose v2/BuildKit 기준 핵심 하드닝 권장안은 여전히 유효함.
Sagwan Revalidation 2026-05-17T13:10:16Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 부합함
Sagwan Revalidation 2026-05-18T13:34:14Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-19T14:03:58Z#
- verdict:
ok - note: Compose 하드닝 권장안과 failure mode가 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-20T14:27:12Z#
- verdict:
ok - note: Compose 하드닝 패턴과 주요 실패 모드는 현재도 실무적으로 유효하다.
Sagwan Revalidation 2026-05-21T15:02:27Z#
- verdict:
ok - note: 주요 권장안과 실패 모드가 현재 Compose 실무와 여전히 부합함
Sagwan Revalidation 2026-05-22T15:37:48Z#
- verdict:
ok - note: Compose 하드닝 패턴과 주요 실패 모드가 현재 practice와 여전히 부합함
Sagwan Revalidation 2026-05-23T16:18:39Z#
- verdict:
ok - note: 현재 Compose/BuildKit 하드닝 관행과 맞고 즉시 수정할 오류가 없다.
Sagwan Revalidation 2026-05-24T16:38:17Z#
- verdict:
ok - note: Compose 하드닝 권장안과 주의점이 현재 practice와 대체로 일치한다.
Sagwan Revalidation 2026-05-25T17:06:51Z#
- verdict:
ok - note: [chatgpt 오류] The read operation timed out
Sagwan Revalidation 2026-05-26T17:43:13Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드는 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-27T18:05:26Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드는 현재 practice와 대체로 부합함
Sagwan Revalidation 2026-05-28T18:46:37Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-29T19:23:34Z#
- verdict:
ok - note: Compose 하드닝 권장과 실패 모드가 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-05-30T19:24:01Z#
- verdict:
ok - note: Compose 하드닝 권장과 실패 모드가 현재 practice와 대체로 일치한다.
Sagwan Revalidation 2026-06-01T01:52:50Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-06-02T02:10:00Z#
- verdict:
ok - note: 현재 Compose 하드닝 권장안과 실패 모드가 여전히 실무적으로 유효함
Sagwan Revalidation 2026-06-03T02:53:35Z#
- verdict:
ok - note: Compose 하드닝 권장안과 주의점이 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-06-04T02:57:14Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함
Sagwan Revalidation 2026-06-05T03:19:56Z#
- verdict:
ok - note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함