- Docker Compose 소개
- Docker Compose 파일(yaml 형식) 작성 방법
- Docker Volume 설정을 위한 공유폴더 생성
- Docker Compose 작성 예시
Docker Compose 는 Docker 컨테이너 기반 애플리케이션을 정의하고 실행하기 위한 도구이다. Docker Compose를 사용하면 여러 개의 독립적인 Docker 컨테이너를 하나의 서비스로 구성하고, 컨테이너 간의 연결 및 설정을 쉽게 관리할 수 있다. 이를 통해 복잡한 멀티 컨테이너 애플리케이션을 쉽게 관리하고 실행할 수 있다.

Docker Compose를 사용하여 애플리케이션을 정의하는 데에는 YAML 파일을 사용한다. 이 파일에서는 다음과 같은 내용을 정의할 수 있다:
- 서비스 (Services): 각각의 독립된 컨테이너를 정의한다. 예를 들어, 웹 서버, 데이터베이스, 백엔드 서버 등의 서비스를 개별적으로 정의할 수 있다.
- 네트워크 (Networks): 서비스 간 통신을 위한 네트워크를 정의할 수 있다. 이를 통해 컨테이너들 사이의 통신을 쉽게 구성할 수 있다.
- 볼륨 (Volumes): 데이터를 저장하기 위한 볼륨을 정의할 수 있다. 이를 통해 컨테이너 내부의 데이터를 컨테이너 외부로 유지하거나 공유할 수 있다.
Docker Compose를 사용하는 기본적인 절차는 다음과 같다:
docker-compose.yml파일 작성: Docker Compose를 사용하여 애플리케이션을 정의하는 YAML 파일을 작성한다. 이 파일에는 서비스, 네트워크, 볼륨 등을 정의한다.- 애플리케이션 실행: 작성한
docker-compose.yml파일을 이용하여 애플리케이션을 실행한다. 이때,docker-compose up명령을 사용하면 설정에 따라 정의된 모든 서비스와 컨테이너들이 시작된다. - 애플리케이션 정지:
docker-compose down명령을 사용하여 애플리케이션을 정지하고, 모든 관련된 리소스들을 삭제할 수 있다.
Docker Compose를 사용하면 개발 환경에서 간단하게 여러 컨테이너를 실행하고, 테스트하고, 애플리케이션을 배포하기 위한 설정과 작업들을 쉽게 관리할 수 있다. 이를 통해 개발과 운영 프로세스를 간소화하고 일관성을 유지할 수 있다.
2. Docker Compose 파일(yaml 형식) 작성 방법
-첫 줄에 Version 기재 (현재는 생략 가능)
-주 항목 services, networks, volumes 작성
-항목 간의 상하관계는 공백을 사용한 들여쓰기로 작성
-들여쓰기는 같은 수의 배수만큼의 공백을 사용
-이름은 주 항목 아래에 들여쓰기한 다음 기재
-컨테이너 설정 내용은 이름 아래에 들여쓰기한 다음 기재
-여러 항목을 기재하려면 줄 앞에 “-”를 추가
-이름 뒤에는 콜론(:)을 추가
-콜론 뒤에는 반드시 공백이 와야 한다. 바로 줄바꿈하는 경우는 예외
-# 뒤의 내용은 주석으로 처리됨
-문자열은 작은 따옴표(‘) 또는 끈 따옴표 (“)로 처리

3. Docker Volume 설정을 위한 공유폴더 생성
Volumes의 설정은 다음과 같다.
Synology NAS의 공유폴더 경로: Docker 이미지에서 사용되는 폴더의 경로
여기에서 Synology NAS의 공유폴더의 경로를 Docker Compose 파일의 경로와 일치시켜야 한다.

4. 작성 예시 (Redmine + PostgreSQL + pgAdmin)
Rev. 2025-11-26 : 도커 이미지 업데이트를 위해 버전을 지정하여 사용하도록 수정
version: "3.9" services: db: image: postgres:18.1 # 필요에 따라 15/16 등 고정 container_name: redmine-db hostname: redmine-db environment: POSTGRES_DB: redmine POSTGRES_USER: "Postgres DB Username" POSTGRES_PASSWORD: "Postgres DB Password" TZ: Asia/Seoul volumes: - /volume1/docker/redmine/db:/var/lib/postgresql:rw ports: - "55432:5432" restart: always redmine: image: redmine:6.1.0 # ★ Redmine 버전 고정 container_name: redmine hostname: redmine environment: REDMINE_DB_POSTGRES: redmine-db REDMINE_DB_DATABASE: redmine REDMINE_DB_ENCODING: utf8 REDMINE_DB_USERNAME: "Postgres DB Username" # 위 POSTGRES_USER와 동일 REDMINE_DB_PASSWORD: "Postgres DB Password" # 위 POSTGRES_PASSWORD와 동일 REDMINE_PLUGINS_MIGRATE: "true" depends_on: - db volumes: - /volume1/docker/redmine/data/files:/usr/src/redmine/files:rw - /volume1/docker/redmine/data/plugins:/usr/src/redmine/plugins - /volume1/docker/redmine/data/themes:/usr/src/redmine/public/themes ports: - "53000:3000" restart: always pgadmin: image: dpage/pgadmin4:9.10.0 # 예시 버전, 실제 최신 안정 버전으로 조정 container_name: pgadmin hostname: pgadmin environment: PGADMIN_DEFAULT_EMAIL: "pgadmin login id" PGADMIN_DEFAULT_PASSWORD: "pgadmin loigin password" PGADMIN_LISTEN_PORT: 80 volumes: - /volume1/docker/redmine/pgadmin:/var/lib/pgadmin:rw ports: - "55050:80" restart: on-failure
작성 주의사항
“postgresql user name”과 “postgresql password”를 개인에 맞게 수정하여 작성하십시오.
volumes:
– 시놀로지 공유 폴더 경로(개인에 맞게 수정하여 작성): 도커 이미지의 절대 경로 (변경 불가)port:
– “외부 접속포트(개인에 맞게 수정하여 작성): 내부 포트(변경 불가)
5. Docker Compose 작성 예시 (Redmine + MySQL)
https://mariushosting.com/how-to-install-redmine-on-your-synology-nas/
version: "3.9"
services:
db:
image: mariadb:jammy
container_name: Redmine-DB
hostname: redmine-db
security_opt:
- no-new-privileges:true
environment:
- TZ=Asia/Seoul
- MYSQL_ROOT_PASSWORD=superstrangepass
- MYSQL_DATABASE=redmine
- MYSQL_USER=redmineuser
- MYSQL_PASSWORD=redminepass
volumes:
- /volume1/docker/redmine/db:/var/lib/mysql:rw
restart: always
redmine:
image: redmine:latest
container_name: Redmine
hostname: redmine
security_opt:
- no-new-privileges:true
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:3000/ || exit 1
user: 1026:100
environment:
REDMINE_DB_MYSQL: redmine-db
REDMINE_DB_DATABASE: redmine
REDMINE_DB_USERNAME: redmineuser
REDMINE_DB_PASSWORD: redminepass
volumes:
- /volume1/docker/redmine/data:/usr/src/redmine/files:rw
ports:
- 3434:3000
restart: always
depends_on:
db:
condition: service_started
