docker compose 는 docker 에서 제공하는 추가 도구로 다중 컨테이너의 자동화/관리를 하며 단일 컨테이너에 환경에서도 사용할 수 있다. 즉 멀티 컨테이너 환경에서 구축을 단순화한다.(컨테이너 빌드, 시작, 중지 등)
docker network create shop
docker build -t shop-node .
docker run -v logs:/app/logs --network shop --name shope-web shop-node
docker build -t shop-database
docker run -v data:/data/db --network shop --name shop-db shop-database
도커 명령어를 일일히 사용하면 위처럼 하나하나 입력하여야 한다.
굉장히 번거롭고 추후 옵션을 빠트리거나 다중 컨테이너 환경에서 생각해야할 부분이 너무나 많다. -> 이런 명령어를 자동화하고 다중 컨테이에서 설정을 단순화 하자!
mongoDB, react, express 를 활용하는 프로젝트로 DB, frontend, backend 를 컨테이너화 하여 다중 컨테이너 환경에서 서로 통신한다.
version: "3.8"
services:
mongodb:
image: 'mongo'
volumes:
- data:/data/db
env_file: ./env/mongo.env
backend:
build: ./backend
ports:
- '80:80'
volumes:
- logs:/app/logs #명명 볼륨
- ./backend:/app #바인드 마운트
- /app/node_modules #익명 볼륨
env_file:
- ./env/backend.env
depends_on:
- 'mongodb' #순서를 정하기 위해
frontend:
build: ./frontend
ports:
- '3000:3000'
volumes:
- ./frontend/src:/app/src #바인드 마운트
depends_on:
- 'backend' #순서를 정하기 위해
stdin_open: true #개방형 표준 입력
tty: true #터미널 생성 이 두개 합쳐서 -it
#services 에서 사용중인 명명된 볼륨 나열
volumes:
data:
logs:
version: docker-compose 의 버전을 명시
services: 서비스란 곧 컨테이너를(단일, 다중) 의미한다.
image: 로컬에 이미지가 없을 경우 해당 이미지를 도커 허브에서 pull 한다.
volume: 해당 컨테이너에서 사용할 볼륨을 명시한다. 네임드 볼륨을 사용할 경우 맽밑에 volumes: 하위에 이름을 명시한다.
env_file: 해당 컨테이너의 환경변수를 정의한 경로를 표시한다.
MONGODB_USERNAME=max
MONGODB_PASSWORD=secret
.env 파일을 이런식으로 구성되어 있다. 재사용성을 위해 파일화하여 사용한다.
build: 로컬에서 이미지를 빌드하여야 할 경우 Dockerfile 이 있는 경로를 명시한다.
ports: 외부와 도커 환경에서 통신에 사용할 포트를 적는다.
depends_on: 해당 컨테이너가 다른 컨테이너에 의존성을 맺을 경우 해당 컨테이너의 service 이름을 명시한다.
stdin_open: 개방형 표준 입력
tty: 터미널 생성
stdin_open, tty 는 리액트에서 표준입력과 터미널을 필요로 하기 때문에 입력해주어야 한다.
docker-compose up: docker-compose 파일에서 언급된 서비스들을 모두 실행한다.
docker-compose down: 모든 컨테이너와 서비스를 중지한다.