도커 컴포즈는 여러 개의 컨테이너를 하나의 docker-compose.yml이라는 설정 파일을 이용해 관리할 수 있게하는 서비스입니다. 저는 개인적으로 도커 컴포즈를 활용해 어플리케이션 컨테이너, 데이터베이스 컨테이너 등을 묶어 한 번에 실행시키며 개발을 진행합니다. 이를 통해 빠른 개발이 가능해집니다.
최상단 프로퍼티 종류
docker.compose.yml 파일에 작성해야할 프로퍼티는 다음과 같습니다.
✅ version
해당 프로퍼티는 예전에 사용되던 프로퍼티로 도커 컴포즈 버전을 명시하도록 되어있었습니다. 하지만 현재는 해당 프로퍼티가 삭제되어 작성하면 에러가 발생합니다. 현재는 필요 없는 프로퍼티입니다.
Version and name top-level elements
Understand when and if to set the version and name top-level element
docs.docker.com
✅ name
기본적으로 도커 컴포즈는 묶어서 실행되는 컨테이너들을 하나의 프로젝트명으로 모아둡니다. 이때 사용되는 프로젝트명은 해당 도커 컴포즈 yaml 파일이 위치한 디렉토리명입니다. 이를 사용하기 싫고 "내가 직접 프로젝트명을 짓겠다!"라는 생각을 가지고 있다면 해당 name 프로퍼티를 통해 설정하면 됩니다.
myapp 이라는 프로젝트명을 사용하는 예시
name: myapp
services:
foo:
image: busybox
command: echo "I'm running ${COMPOSE_PROJECT_NAME}"
✅ services
컴포즈 파일에서 가장 핵심인 부분입니다. 서비스들(컨테이너들)을 컴포즈 파일에 나열하기 시작함을 표시하는 프로퍼티입니다. 해당 프로퍼티 하위에 여러 서비스들을 작성하시면 됩니다.
services:
1번서비스:
...
2번서비스:
...
3번서비스:
...
각 서비스 하위에 작성해야할 속성 종류는 굉장히 많습니다. 이때 제가 자주 사용하는 속성 몇 개를 소개하겠습니다.
- #️⃣ container_name
컨테이너명 직접 명시하기
도커 컴포즈 V2에서는 디폴트로 컨테이너명을 다음과 같이 지어줍니다. `{프로젝트명}-{서비스명}-{번호}`. 이때 번호는 스케일링을 사용해 여러개 띄울 때 구분하기 위한 용도입니다. auto_increment되는 PK값이라고 생각하시면됩니다. 이때 이런 컨테이너명이 마음에 들지 않을 경우 직접 명시해 수정할 수 있습니다.
services:
web:
container_name: my-web-container
- #️⃣ image
컨테이너에 사용할 도커 이미지 명시하기
컨테이너에 사용할 도커 이미지를 명시합니다. 이때 먼저 로컬에 존재하는 도커 이미지를 조회해 만약 조건에 부합하는 도커 이미지가 존재할 경우 해당 이미지를 사용해 컨테이너를 띄웁니다. 로컬에 해당 도커 이미지가 존재하지 않을 경우는 pull_policy 속성에 따라 처리가 진행됩니다. pull_policy 설정을 따로 하지 않았다면 도커 허브에서 도커 이미지를 pull 받은 후 컨테이너를 띄웁니다.
services:
redis:
image: redis
- #️⃣ build
도커 파일을 이용해 도커 이미지 만들 때 관련 설정 명시하기
build 속성 하위에도 여러 속성이 존재합니다. 이때 가장 많이 쓰는 속성 2가지는 다음과 같습니다.
- context : 도커파일 경로
- dockerfile : 도커파일명
services:
web:
build:
context: ./
dockerfile: Dockerfile_1
- #️⃣ ports
컨테이너 포트 관련 설정
단순히 컨테이너 포트 몇 개를 열 수도 있고, 특정 범위의 포트를 여러 개 열 수도 있습니다. 또한 컨테이너 포트와 호스트 포트를 매핑할 수도 있습니다. 호스트와 포트 매핑하는 경우 전자가 호스트 포트, 후자가 컨테이너 포트입니다.
services:
web:
ports:
- "3000" // 특정 포트 열기
- "3000-3005" // 범위로 포트 열기
- "8000:8000" // 호스트-컨테이너 포트 매핑하기
- #️⃣ volumes
호스트 경로 마운트 관련 설정
볼륨 옵션을 사용하면 호스트 특정 디렉토리 경로를 컨테이너 내부에 마운트할 수 있습니다. 혹은 도커 자체의 볼륨을 만든 후 이를 컨테이너 내부에 마운트하는 것도 가능합니다.
services:
web:
volumes:
- 호스트경로:컨테이너경로
- #️⃣ environment
컨테이너 내부 환경변수 설정
컨테이너 내부에서 사용할 환경변수를 직접 선언합니다. 선언 방식은 두 가지 방법이 존재합니다.
Map syntax:
services:
web:
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
Array syntax:
services:
web:
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT
- #️⃣ depends_on
컨테이너간 의존성 설정
A 컨테이너가 B 컨테이너보다 먼저 실행되면 문제가 되는 상황이 발생할 수 있습니다. 이런 의존성을 depends_on을 통해 설정할 수 있습니다. 아래는 redis와 db 컨테이너가 먼저 실행되어야 그 다음에 web 컨테이너가 실행되도록 설정한 예시입니다.
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
- #️⃣ restart
컨테이너 재시작 옵션 설정
컨테이너가 종료되었을 때 어떻게 할 지 정하는 옵션입니다. 옵션 종륜는 다음과 같습니다.
services:
web:
restart: "no"
// restart: always
// restart: on-failure
// restart: on-failure:3
// restart: unless-stopped
- #️⃣ tty
가상 터미널 할당(도커 컨테이너 실행 명령어 중 -t 옵션과 동일)
터미널 환경을 통해 콘솔에서 사람이 보기 좋게 인터렉션 가능하게 해주는 역할입니다.
services:
web:
tty: true
- #️⃣ stdin_open
입력 표준 열기(도커 컨테이너 실행 명령어 중 -i 옵션과 동일)
컨테이너 안에서 명령어를 직접 입력할 수 있도록 입력 스트림을 유지하는 옵션입니다.
services:
web:
stdin_open: true
✅ networks
서비스(컨테이너) 끼리 연결되는 네트워크를 설정하는 프로퍼티입니다. 도커 컴포즈에서 서비스에 추가적인 네트워크 설정을 명시하지 않을 경우 디폴트 네트워크가 적용됩니다. 디폴트 네트워크는 해당 컴포즈 내의 서비스들이 기본적으로 연결되는 네트워크입니다.
하지만 이때 컨테이너간 네트워크를 커스터마이징하고 싶을 수 있습니다. 이때는 아래와 같은 방식으로 설정합니다. 간단한 예제입니다.
services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
# Specify driver options
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
backend:
# Use a custom driver
driver: custom-driver
✅ volumes
볼륨 설정 시 호스트 경로를 마운트할 수도 있지만 도커 자체의 볼륨을 만든 후 해당 볼륨을 마운트할 수 도 있습니다. 이때 생성할 볼륨들을 설정하는 프로퍼티입니다. 간단한 예제입니다.
services:
backend:
image: example/database
volumes:
- db-data:/etc/data
backup:
image: backup-service
volumes:
- db-data:/var/lib/backup/data
volumes:
db-data:
✅ configs
Configs top-level elements
Explore all the attributes the configs top-level element can have.
docs.docker.com
✅ secrets
Secrets top-level elements
Explore all the attributes the secrets top-level element can have.
docs.docker.com
'데브옵스 > Docker' 카테고리의 다른 글
[Docker] Dockerfile에서 yarn install 에러 해결( .cache / unplugged 가 없다? ) (0) | 2025.01.20 |
---|---|
[Docker Compose] 도커 컴포즈로 설정한 네트워크, 볼륨 옵션이 제대로 적용이 안될 때 확인할 것들 (0) | 2025.01.20 |