여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 컨테이너로 묶어서 관리하고 실행하는 도구 입니다.
지금까지는 Docker에서 컨테이너를 개별적으로 관리해왔습니다.
하지만 애플리케이션이 복잡해지면서 여러 컨테이너를 관리하는 것은 어려워졌죠.
이러한 문제를 보안하기 위해 2014년도에 구조화된 파일, 즉 시스템 구축에 필요한 명령어의 설정을 정의해주는 Docker compose 파일인
'YAML'(야믈 혹은 야멜)이라는 이름의 파일이 생겼습니다.
이는 전체 시스템 일괄 실행(run) 또는 일괄 종료 및 삭제(down)를 실행할 수 있는 도구와 같습니다.
여러 개의 명령어를 하나의 정의 파일로 합쳐서 실행할 수 있는 것이죠!
🔷 현재 Docker Desktop은 Docker compose가 함께 설치되기 때문에
추가로 설치할 필요가 없습니다 !
개발 프로덕션 환경에서 여러 서비스로 구성되어있는 프로젝트를 빠르게 실행하고 관리하기 위함입니다.
만약 대규모 프로젝트에서 Docker를 사용하게 될 경우,
수많은 컨테이너들을 관리하게 된다면 테스트 단계에서 각 컨테이너에 들어가서 하나하나 명령어를 입력하는 작업을 반복하는 것을 방지하기 위해 쓰입니다.
#docker-compose.yml
services:
mysql: # 식별 가능한 이름 ex) web-db, server-db ..
image: mysql:latest
environment: # 환경 변수 설정 (.env의 내용과 동일)
MYSQL_ROOT_PASSWORD: mydb
MYSQL_DATABASE: USER_DB
volumes: # 데이터가 저장되는 경로 (docker desktop이 있다면 volumes에서 확인 가능)
- mysql_data:/var/lib/mysql
ports:
- '3306:3306' # 개인 환경에 맞춰주기
game-server:
build:
context: ./app_SERVER # 해당 디렉토리를 docker이미지로 빌드하는 경로로 사용 ex) .
dockerfile: Dockerfile # dockerfile 경로 ex) ./web/dockerfile
ports:
- '3306:3000' # 서버 포트 개인 환경에 맞춰주기
environment:
- PORT=3000 # 내부 포트
- HOST=0.0.0.0 # IPv4를 사용하는 주소는 전부 허용
- CLIENT_VERSION=1.0.0
- DB1_HOST=mysql
- DB1_PORT=3306
- DB1_USER=root
- DB1_PASSWORD=mysb
- REDIS_HOST=redis # 의존하는 이미지의 HOST를 공유
- REDIS_PORT=6379
depends_on: # 의존하고자 하는 이미지 ex) web-db, server-db ..
- mysql
- redis
위와 같은 구조로 환경에 맞게 작성하고 'docker-compose up --build' 명령어를 실행했을 때 오류 없이 컨테이너가 잘 생성이 되고 실행이 된다면 일단 성공한 것이다.
docker-compose up -d 명령어는 기존에 생성된 컨테이너 이미지를 그대로 사용하기 때문에 이미지 재시작의 의미로 사용됩니다.
새로운 컨테이너로 빌드하고 싶다면 docker-compose up --force-recreate 명령어를 실행해주세요 !
docker compose 파일 명칭은 'docker-compose.yml'로 고정으로 한 폴더에 하나만 존재해야 합니다.
프로젝트의 루트경로에 존재해야 원하는 구조의 컨테이너로 빌드가 가능합니다.
만약 여러개를 사용하고 싶다면 그 수만큼 폴더를 추가로 생성하여 보관을 분리해야 합니다. (해당 방법은 지양합니다.)
도커 컴포즈의 옵션을 다 사용해보진 못하겠지만
그래도 어떤 것들이 있는지 살펴보자 !
1. services : 실행할 컨테이너 목록
services: # 무조건 상단에 선언해주기
container1: # 첫 번째 컨테이너 서비스 ex) db, web ...
image: nginx:latest
...
container2:
...
2. build : 설정해준 Dockerfile의 내용대로 이미지 빌드
container:
build: . # 같은 경로에 있을 때 예시
# 경로가 다를 경우 - ./app/Dockerfile
3. image : 실행할 이미지
container:
image: redis:latest
4. command : 컨테이너에서 실행할 명령어
container:
command: sh -c "yarn init -y && yarn install"
5. port : 외부와 통신하기 위한 컨테이너 포트
container:
port:
- 8080:3306
6. expose : 연계된 컨테이너끼리 통신하기 위한 포트로 컨테이너 내부 포트에 액세스 할 수 있도록 해주는 컨테이너 포트
- port와 달리 호스트 시스템에 게시하지 않습니다.
container:
expose:
- 3306
7. volumes : 도커에 의해 관리되는 독립적인 데이터 저장 공간으로 할당해주는 가상 하드 디스크의 개념
container1:
volumes:
- db_data:/var/lib/mysql
container2:
volumes:
- wp_data:/var/www/html
volumes:
db_data: {} # docker-compose에 의해 새로 생성될 볼륨 / {}: 추가적인 설정이 없음
wp_data:
external: true # 이미 생성된 볼륨을 사용함
8. environment : 환경 변수 정의 (.env의 내용과 동일)
container:
environment:
PASSWORD: P@ssW0Rd
9. restart : 컨테이너가 종료될 때 적용할 실행 정책
container:
# no: 안 함
# always: 수동으로 끄기 전까지 항상 재시작
# on-failure: 오류 있을 시 재시작
restart: no | alywas | onfailure
직접 확인해볼 수는 없지만 restart를 always로 설정해주면
pc를 껐다 켜도 실행이 계속 되어있는 것을 볼 수 있다.
10. context : Dockerfile을 빌드하기 위해 필요한 파일 경로
container2:
build:
context: . # 보통 루트 경로에 지정하지만 환경에 맞게 설정
# ex) ./web
dockerfile: Dockerfile # ex) ./app/Dockerfile
11. depends_on : 컨테이너 간의 종속성 정의. 해당 서비스를 실행하기전에 먼저 동작해야 할 서비스를 명시해줍니다.
db:
image: mysql:latest
container2:
build:
context: .
depends_on:
- db
명시해줄 서비스는 먼저 선언해줍니다.
수많은 도커 컴포즈 설정 문법이 있지만
종종 쓰이는 문법들로 간단하게 docker compose에 대해 알아보았습니다.
이런 편리한 플랫폼을 사용해볼 때마다 신기하다는 느낌을 많이 받는데
이번에 사용한 도커는 "이게 왜 되는걸까?, 어떻게 작동하는거지?" 라는 생각을 자주 들게 만들었던 것 같습니다. 정말 알다가도 모를 요술램프같은 플랫폼이랄까요. 😃
그만큼 개발 프로덕션을 테스트 하는 단계에서는 너무나 편리한 것 같습니다!
그럼 모두 Happy hacking ! 🥳