0. Docker compose 사용 이유
여러 개의 컨테이너로 구성된 application을 단일 파일에 정의하고 이를 한 번에 올리거나 내릴 수 있다.
기존엔 여러 컨테이너를 띄워놓고 어플리케이션을 운용해야 했으나.. 이러한 과정을 간소화하여 불편함을 없앴다 할 수 있겠다.
이러한 편리함 덕에 Docker Compose는 로컬 개발 환경이나 테스트 자동화 환경에서 간단한 컨테이너 오케스트레이션 도구로 많이 사용되고 있다.
1. Docker Compose 파일 위치
프로젝트의 최상위 디렉토리에 존재해야 한다.
2. docker-compose.yml 야믈파일 구조
version: "3.5"
services:
# 웹 애플리케이션 설정
web:
# 의존성 삽입, web 어플리케이션이 올라오기 전 db가 먼저 올라와야 됨을 의미
depends_on:
- db
# 명령어 : 해당 서비스가 올라올 때 Dockerfile의 CMD를 무시하고 실행할 명령어
command: node .
# 데이터베이스 설정
db:
# Docker file이 있는 위치에서 빌드
build: ./database
# 프로젝트에서 직접 개발하지 않을 땐 image를 내려받아서 사용
image: postgres:13
#내부에서 개방할 포트 : 외부에서 접근할 포트
ports: "3306:3306"
# 항목명 = 서비스명 = 네트워크 호스트명
backend:
build: ./backend # 이곳에 Docker file이 있어야 함
# 연결할 외부 디렉토리 :컨테이너 내 디렉토리
volumes:
- ./backend:/usr/src/app
# 포트
ports:
- "5000:5000"
# 환경변수 설정
environment:
- DBHOST=db
# 항목명 = 서비스 명 = 네트워크 호스트명
frontend:
build:
- ./frontend
# 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
volumes:
- ./frontend:/home/node/app
#포트
ports: "8080:8080"
networks:
# 네트워크 설정
volumes:
# 볼륨 설정 - 서비스에서 설정한 외부 디렉토리 볼륨을 작성
backend:
frontend:
우선, YAML 형식의 파일에선 키워드를 두 개의 공백에 따라 하위 항목을 구분한다. 탭은 인식 못한다.
- version
- YAML 파일 포맷의 버전을 나타냄.
- services
- 생성될 컨테이너들을 묶어놓은 단위이다. 서비스 항목 아래에는 각 컨테이너에 적용될 생성 옵션을 지정한다.
- web, mysql
- 생성될 서비스의 이름이다.
기존 run 명령어의 옵션을 YAML파일로 변환하는 것이 docker-compose의 대부분이라고 할 수 있다.
YAML파일은 크게
- version 정의
- services 정의
- volume 정의
- network 정의
의 4가지 항목으로 구성된다.
3. Docker compose 실행
docker-compose up
컴포즈 파일에 정의된 컨테이너 및 네트워크와 같은 주변 환경 생성
docker-compose -f [file_path] -p [명시할 project name] up [option]
docker-compose up -d mysql
이렇게 하면 mysql 서비스의 컨테이너만 생성하게도 할 수 있다.
4. docker-compose down
생성 된 컨테이너와 네트워크를 종료하고 삭제
docker-compose -f [file_path] down [option]