본문으로 바로가기
Docker 기초 10편: Compose 기본 구조와 이미지 빌드
LinkedInGitHub
WORKSPACE

EXPLORER

157 POSTS
BLOG
면접질문
해야하는 거
AI 시대, 개발자는 사라지는가?
Python Counter, 빈도수를 쉽게 세는 방법
정렬
1. 투 포인터
DFS와 BFS
알고리즘 논리
코딩 테스트 핵심 알고리즘 정리파이썬 딕셔너리와 코딩 테스트 활용
예시로 살펴보는 AXAX 프로젝트, 문제 정의부터 확산까지AX 시대의 가치 정의와 현장 리딩
MSA
1. Singleton PatternSOLID
Kafka의 핵심 설계 원리Kafka 메시징 시스템의 구성과 동작 방식Kafka 기본 개념과 EC2 Docker 구성
쿠버네티스 입문
Modular Monolith1. MonolithMSA, 서비스 분리와 운영의 원리
Socket이란 무엇인가
네크워크 참조 모델
전체 데이터 구조REST API의 개념과 설계 원칙2. Field/ Parameter / Argument/ this
Actuator 란?EntityManagerJPA 연관관계 매핑JPA 트랜잭션(Transaction)입력값 검증Java의 AOP(Aspect Oriented Programming)Async : AsynchronousBeanJPA(Java Persistence API)Proxy 패턴Spring MVCdocker container1. Spirng 필요컴포넌트 스캔
Spring 컨테이너
application.yamlLombok
이번 강의는 무엇을 노리고 있을까?Spring AI를 배우기 전에 정리할 것23
1. 기술 스택
개발 문서를 읽기 위한 핵심 기술 용어
Docker를 이해하기 위한 운영체제 기초
sigterm
6. 설정과 저장소, 앱을 운영할 수 있는 상태로 만들기5. Service와 Ingress, 요청은 어디로 흐를까4. 직접 실험하는 Kubernetes, Pod 복구부터 롤백까지3. kubectl과 Pod, 상태에서 원인을 찾는 법2. 클러스터는 명령을 어떻게 Pod로 바꿀까1. 쿠버네티스, 원하는 상태와 컨테이너 이미지Calico쿠버네티스 입문, 원하는 상태를 유지하는 시스템
Psql JSONB, 행 잠금, 멱등성Psql 함수,프로시져,트리거
머신러닝 입문딥러닝 학습 기본 개념데이터 시각화기초 통계와 ML 파이프라인 연결분석 자동화와 파이프라인 설계
CNN 아키텍처 발전 과정이미지 세그멘테이션 모델과 핵심 개념객체 탐지 모델과 핵심 개념
딥러닝 데이터셋 엔지니어링
딥러닝 학습 문제 진단과 디버깅
도메인 적응 방법현대 LLM 워크플로의 패턴
Transformer에서 LoRA 적용 대상 정하기LoRA (Low-Rank Adaptation)
LLM 양자화와 QLoRA
분산 학습과 MLOps딥러닝 모델 경량화와 추론 최적화딥러닝 기본 학습 테크닉딥러닝 중급 학습 테크닉
Mixture of Experts(MoE) 핵심 개념멀티모달 파운데이션 모델 핵심 개념State Space Model과 MambaTransformer와 Vision Transformer
Latent Space
1Chunking?
DevOps 기초 1편
실습에서는?Agile 개요, 왜 필요한가?
CI/CD 기초 4편: 배포 전략과 운영CI/CD 기초 3편: Jenkins와 Argo CD를 이용한 GitOps 배포CI/CD 기초 2편: Docker 이미지와 배포 파이프라인CI/CD 기초 1편: 개념과 GitHub Actions
OCI: 컨테이너 이미지와 런타임의 공통 표준Docker 기초 13편: Compose Healthcheck와 실전 구성Docker 기초 12편: Compose 네트워크와 VolumeDocker 기초 11편: Compose 명령어와 환경 변수Docker 기초 10편: Compose 기본 구조와 이미지 빌드Docker 기초 9편: Docker 및 Kubernetes 네트워크Docker 기초 8편: 컨테이너 런타임과 격리Docker 기초 7편: 이미지 Layer와 tar 내부 구조Docker 기초 6편: 이미지 Layer와 빌드 최적화Docker 기초 5편: 컨테이너 기본 명령어와 VolumeDocker 기초 4편: 가상화와 컨테이너 이미지 생명주기Docker 기초 3편: CI/CD 연결과 배포 원칙Docker 기초 2편: Layer, Registry, Volume과 NetworkDocker 기초 1편: Dockerfile, Image와 Container
NginxNginx 로드 밸런싱과 HTTPSNginx 리버스 프록시와 Spring Boot 연결Nginx 기초와 동작 구조
05. Pinia 상태 관리: store 설계와 사용법04. Vue 컴포넌트 설계: props, emit, slot과 생명주기03. Vue Composition API 정리02. Vue 기초 문법 점검: JavaScript, 템플릿01. Vue.js 입문: 핵심 구조와 렌더링
Java 심화 Part 3: 함수형 프로그래밍과 LambdaJava 심화 Part 2: AnnotationJava 심화 Part 1: Reflection
Java 기초 Part 5: Stream APIJava 기초 Part 4: 제네릭Java 기초 Part 3: 제어문Java 기초 Part 2: 주석과 JavadocJava 기초 Part 1: 백엔드 배경과 Java 실행 구조
Java 디버깅 Part 1: 자주 헷갈리는 핵심 개념Java 디버깅 Part 2: VS Code 자동 컴파일과 프로젝트 구조
Java 실행과 JVM Part 3: ClassLoader와 JVM 메모리Java 실행과 JVM Part 2: 메모리와 데이터 흐름Java 실행과 JVM Part 1: Java와 Python 컴파일 비교
Java 객체지향 Part 5: static 메서드와 중첩 클래스Java 객체지향 Part 4: 상속과 인터페이스Java 객체지향 Part 3: 좋은 설계와 OOP 4대 특성Java 객체지향 Part 2: OOP 핵심 문법Java 객체지향 Part 1: 클래스, 객체, 필드와 생성자
Spring 기초 Part 11: Actuator와 애플리케이션 모니터링Spring 기초 Part 10: 비동기 처리와 @AsyncSpring 기초 Part 9: JPA 트랜잭션과 동시성 제어Spring 기초 Part 8: AOP와 공통 관심사 분리Spring 기초 Part 7: Proxy 패턴과 Spring ProxySpring 기초 Part 6: JPA 연관관계 매핑Spring 기초 Part 5: EntityManager와 영속성 컨텍스트Spring 기초 Part 4: JPA, Entity와 RepositorySpring 기초 Part 3: REST API 요청값과 입력값 검증Spring 기초 Part 2: Spring MVC 요청 처리 흐름Spring 기초 Part 1: IoC, Bean, DI와 주요 Annotation
DNS = Domain Name System
Spring Boot, WebSocket, Vue, Docker 로 Raspberry Pi 실시간 모니터링 프로젝트 만들기 - 1편1. Spring Boot 구현
1. GitHub Project 만들기
Python 코드 품질: 디버깅부터 테스트와 자동화까지Python 01. 실행 구조와 실무 기초
sLLM 핵심 기술과 전체 구조제한된 자원에서 sLLM 구축하기
시대 단상에 대한 주저리주저리
WORKSPACE

SEARCH

제목, 카테고리와 태그로 검색하세요.

VERSION CONTROL

SOURCE CONTROL

masterGitHub Pages
저장소 열기
BUILD STATUS

RUN AND DEBUG

게시물은 GitHub Actions에서 검증하고 정적 페이지로 빌드합니다.

Actions 열기
WORKSPACE

MANAGE

홈 열기전체 게시물태그 보기블로그 소개
Docker 기초 10편: Compose 기본 구조와 이미지 빌드●
workspace>posts>devops>docker>docker-10-compose-basics-and-build.md
DevOps / Docker2026.08.171 min read6 tags

Docker 기초 10편: Compose 기본 구조와 이미지 빌드

Docker Compose의 핵심 개념, compose.yaml 구조, 이미지 빌드와 command 및 entrypoint를 정리한다.

Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 하나의 YAML 파일로 정의하고, 한 번의 명령으로 함께 실행,중지,관리하는 도구.

flowchart LR
    Y["compose.yaml<br/>애플리케이션 구성도"] -->|docker compose up| D["Docker Engine"]
    D --> F["frontend container"]
    D --> B["backend container"]
    D --> DB["database container"]
    D --> N["network"]
    D --> V["volume"]

docker run이 가전제품을 하나씩 직접 설치하는 일이라면, Docker Compose는 집 전체의 가전제품,배선,수도 연결을 설계도 한 장으로 한꺼번에 설치하는 작업.

Compose는 여러 컨테이너를 편리하게 조율하지만, Kubernetes처럼 여러 노드에 컨테이너를 스케줄링하고 장애 시 자동으로 재배치하는 완전한 클러스터 오케스트레이터는 아니고. 로컬 개발, 교육, 통합 테스트, 단일 Docker 호스트 애플리케이션에 특히 적합하다.


1. Docker Compose 핵심 개념

먼저 알아둘 단어

단어뜻쉬운 비유
Compose file서비스,네트워크,볼륨 구성을 선언한 YAML 파일건물 설계도
Service동일한 설정으로 실행할 컨테이너의 논리적 정의식당의 주방,홀,창고 역할
Project하나의 Compose 애플리케이션에 속한 리소스 묶음건물 단지 이름
Network서비스끼리 통신하는 가상 네트워크건물 내부 통로
Volume컨테이너가 사라져도 데이터를 보존하는 저장소별도 창고
Declarative원하는 최종 상태를 파일에 선언하는 방식작업 순서 대신 완성 도면 전달

1.1 Compose가 필요한 이유

Compose 없이 세 개의 컨테이너를 실행하려면 네트워크와 볼륨을 만들고, 각 컨테이너에 환경 변수와 포트를 반복해서 지정해야 한다.

docker network create ...
docker volume create ...
docker run ... database
docker run ... backend
docker run ... frontend

Compose에서는 이 구성을 compose.yaml에 저장한 뒤 다음 명령으로 실행한다.

docker compose up -d

Compose가 관리하는 대표 항목은 다음과 같다.

  • 컨테이너 이미지 또는 빌드 방법
  • 환경 변수와 Secret
  • 서비스 간 네트워크
  • 호스트에 공개할 포트
  • Volume과 Bind Mount
  • 시작 의존 관계와 Healthcheck
  • 재시작 정책

1.2 서비스와 컨테이너의 관계

서비스는 컨테이너 그 자체가 아니라 컨테이너 실행 설정이다. 기본적으로 서비스당 컨테이너 하나가 만들어지지만, 필요하면 같은 서비스의 컨테이너 수를 늘릴 수 있다.

docker compose up -d --scale worker=3
flowchart TD
    S["worker service<br/>공통 실행 설정"] --> C1["worker container 1"]
    S --> C2["worker container 2"]
    S --> C3["worker container 3"]

고정된 호스트 포트를 사용하는 서비스를 여러 개로 확장하면 포트 충돌이 발생할 수 있다. 여러 복제본 앞에는 별도의 프록시나 로드 밸런서가 필요할 수 있다.


2. compose.yaml 구조

먼저 알아둘 단어

단어뜻쉬운 비유
services실행할 서비스 정의입주 업체 목록
image컨테이너를 만들 이미지완제품 주문
build이미지를 직접 만드는 방법현장에서 제품 제작
ports호스트 포트와 컨테이너 포트 연결대표번호를 내선에 연결
environment컨테이너 프로세스에 전달할 환경 변수작업자에게 전달하는 업무 메모
volumes데이터 또는 파일 마운트외부 창고 연결
networks서비스가 참여할 네트워크출입 가능한 통로 지정
depends_on서비스 생성,시작 의존 관계선행 작업 확인표

쉬운 비유: 최상위 services, networks, volumes는 각각 입주자, 도로, 창고를 정의하는 설계도 영역.

2.1 최소 예제

services:
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: postgres
    volumes:
      - db-data:/var/lib/postgresql/data

  backend:
    image: my-backend:1.0
    environment:
      DB_HOST: db
      DB_PORT: "5432"
    depends_on:
      - db

  frontend:
    image: my-frontend:1.0
    ports:
      - "8080:80"

volumes:
  db-data:

들여쓰기가 구조를 결정하므로 Tab 대신 공백을 사용해야 한다. 최신 Compose Specification에서는 최상위 version 필드가 필요하지 않다.

2.2 전체 구조

flowchart TD
    C["Compose Project"] --> S["services"]
    C --> N["networks"]
    C --> V["volumes"]
    C --> SEC["secrets"]
    S --> DB["db"]
    S --> API["backend"]
    S --> WEB["frontend"]

Compose는 별도로 지정하지 않으면 현재 디렉터리 이름을 프로젝트 이름으로 사용한다. 생성되는 리소스에는 일반적으로 프로젝트 이름이 접두사로 붙는다.

myapp_default
myapp-db-1
myapp_db-data

실제 이름은 Compose 버전, 설정한 container_name, 리소스 종류에 따라 달라질 수 있다. 서비스 검색에는 컨테이너 이름보다 서비스 이름을 사용하는 것이 좋다.


3. 이미지 빌드와 실행 명령

먼저 알아둘 단어

단어뜻쉬운 비유
Build Context이미지 빌더에 전달할 파일 범위공장에 보내는 재료 상자
Dockerfile이미지를 만드는 절차제품 조립 설명서
Build Argument이미지 빌드 중에만 사용하는 값제조 공정용 임시 지시사항
ENTRYPOINT컨테이너의 기본 실행 프로그램반드시 실행할 본체
CMD기본 명령 또는 기본 인자본체에 전달하는 기본 옵션
commandCompose에서 이미지의 CMD를 대체하는 값기본 옵션 교체
entrypointCompose에서 이미지의 ENTRYPOINT를 대체하는 값실행 본체 교체

쉬운 비유: ENTRYPOINT가 커피 머신이라면 CMD는 기본 메뉴인 아메리카노. command는 메뉴를 라테로 바꾸고, entrypoint는 커피 머신 자체를 다른 기계로 교체한다.

3.1 기존 이미지 사용과 직접 빌드

Registry의 이미지를 그대로 사용할 때는 image를 지정한다.

services:
  web:
    image: nginx:alpine

로컬 Dockerfile로 이미지를 만들 때는 build를 지정한다.

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        APP_ENV: production
    image: myapp:1.0
    ports:
      - "8080:8080"
project/
├── compose.yaml
└── app/
    ├── Dockerfile.prod
    └── app.jar
FROM eclipse-temurin:17-jre

ARG APP_ENV
ENV APP_ENV=${APP_ENV}

COPY app.jar /app/app.jar
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
  • context: ./app: 빌더에 전달할 디렉터리.
  • dockerfile: Context를 기준으로 사용할 Dockerfile 경로.
  • args: Dockerfile의 ARG에 전달할 빌드 시점 값.
  • image: 빌드 결과에 붙일 이미지 이름과 태그.

Build Argument는 비밀값 전달 수단이 아니다. 이미지 이력이나 빌드 캐시에 남을 수 있으므로 비밀번호와 토큰을 넣지 않아야 한다.

3.2 command와 entrypoint

이미지에 다음 설정이 있다고 가정합니다.

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

command만 지정하면 이미지의 CMD를 대체하고 ENTRYPOINT는 유지한다.

services:
  web:
    image: nginx:alpine
    command: ["nginx", "-g", "daemon off;"]

entrypoint를 지정하면 이미지의 ENTRYPOINT를 대체한다. Compose에서는 이미지의 기본 CMD도 무시되므로 필요한 인자를 command로 명시해야 한다.

services:
  web:
    image: nginx:alpine
    entrypoint: ["/custom-entrypoint.sh"]
    command: ["nginx", "-g", "daemon off;"]
flowchart LR
    I["Image 설정"] --> EP["ENTRYPOINT<br/>실행 파일"]
    I --> CMD["CMD<br/>기본 명령,인자"]
    CE["Compose entrypoint"] -. 대체 .-> EP
    CC["Compose command"] -. 대체 .-> CMD
    EP --> RUN["최종 실행 명령"]
    CMD --> RUN

배열 형태는 Shell의 문자열 해석 차이를 줄여 주므로 실행 파일과 인자가 명확할 때 유용하다.


TAGS#Docker#Docker Compose#Service#YAML#Build#Entrypoint
PREVIOUSDocker 기초 9편: Docker 및 Kubernetes 네트워크NEXTDocker 기초 11편: Compose 명령어와 환경 변수
DISCUSSION

COMMENTS

GitHub 계정으로 로그인하여 댓글을 남길 수 있습니다. 댓글은 GitHub Discussions에 공개 저장되며, 작성 내용과 GitHub 프로필 정보가 다른 방문자에게 보일 수 있습니다.

GitHub 로그인 후 댓글 쓰기Discussion 열기
DOCUMENT STRUCTURE

이 문서에는 목차가 없습니다.

DOCUMENT INFO
TYPE
Markdown
DATE
2026.08.17
READ
1 min read
WORDS
0
CATEGORY
DevOps / Docker
RELATED DOCUMENTS
Docker 기초 13편: Compose Healthcheck와 실전 구성Docker 기초 12편: Compose 네트워크와 VolumeDocker 기초 11편: Compose 명령어와 환경 변수Docker 기초 2편: Layer, Registry, Volume과 NetworkOCI: 컨테이너 이미지와 런타임의 공통 표준Docker 기초 9편: Docker 및 Kubernetes 네트워크
main DevOps / Docker
1 min readUTF-8Markdown
본문 글씨 크기
RECENTLY OPENED1
Docker 기초 10편: Compose 기본 구조와 이미지 빌드recently opened