이전 포스팅에서 했던 docker network
를 이용한 컨테이너 연결을 docker compose
를 이용하여 컨테이너들을 한번에 생성한다.
여러개의 컨테이너가 하나의 애플리케이션으로 동작할 때 이전까진 하나씩 생성해서 연결하고 사용했다.
테스트 단계에서는 이렇게 매번 여러개의 컨테이너를 생성하고 테스트하는게 번거롭다.
여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리할 수 있다면 좀 더 편리할 것이다. 이는 Docker Compose로 해결할 수 있다.
Docker Compose는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있는 작업 환경을 제공한다.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker compose -v
AWS EC2 환경인
ubuntu 16.04
기준입니다. 다른운영체제는 공식문서를 참고해주세요.
도커 컴포즈는 정의된 YAML 파일을 읽어 도커 엔진을 통해 컨테이너를 생성한다. 따라서 YAML 파일을 먼저 작성해야한다.
예시는 nodejs 샘플 프로젝트로 직접 생성한 디렉토리에서 진행합니다.
목표의 그림처럼 nodejs
와 mongo
컨테이너 2개를 생성할 것이고, nodejs 컨테이너
는 샘플프로젝트 내부의 Dockerfile
을 통해 빌드한 이미지로 실행하도록, mongo 컨테이너
는 mongo:latest
이미지를 사용할 예정이다.
Dockerfile 작성은 Docker 시작하기 #04에서 했기에 넘어가고 바로 docker-compose.yml
파일을 작성하도록 한다.
docker-compose.yml
파일은 Dockerfile
과 마찬가지로 프로젝트의 루트 디렉토리에 위치에서 생성, 작성한다.
version: '3.5'
services:
nodejs:
container_name: nodejs
build: .
ports:
- "3000:3000"
mongo:
image: mongo
container_name: mongo
networks:
default:
external:
name: network-prac
version: '3.5' #docker compose 버전
services:
nodejs:
# nodejs 컨테이너 설정
mongo:
# mongo 컨테이너 설정
networks:
# 네트워크 설정
services:
nodejs:
container_name: nodejs
build: .
ports:
- "3000:3000"
mongo:
image: mongo
container_name: mongo
Dockerfile
에서 이미지를 빌드해 서비스의 컨테이너를 생성하도록 한다.Dockerfile
을 불러오도록 설정되어있다.docker run
명령의 -p
옵션과 같은 역할을 한다.project_name_default
이름의 브리지 네트워크를 생성하고 연결한다.networks:
default:
external:
name: network-prac
다른 많은 옵션들이 존재한다. 공식문서에서 확인할 수 있다.
docker-compose.yml
파일이 위치하는 곳에서 아래의 명령을 실행한다.$ docker-compose up -d
docker run
명령 두번으로 실행했던것과 똑같이 실행중인것을 확인할 수 있다.docker-compose.yml
파일에 설정했던것 처럼 두 컨테이너가 network-prac
네트워크에 연결되어있는 것을 확인할 수 있다.docker-compose up -d
로 실행하고 docker-compose down
명령으로 종료시킬 수 있다.