도커 컴포즈는 docker build
, docker run
명령을 대채할 수 있는 도구로, 하나의 구성 파일만으로도 다중 컨테이너를 실행하도록 해준다. docker-compose.yaml
이라는 설정 파일을 작성해주기만 하면, 도커 컴포즈가 해당 파일을 바탕으로 이미지를 빌드하고 네트워크, 볼륨, 포트, 환경변수까지 설정하여 컨테이너를 실행하고 관리해준다. 단 Dockerfile
을 대체하는 것은 아니다. 커스텀 이미지를 생성하는 경우에는 여전히 작성된 Dockerfile
의 내용을 기반으로 이미지를 생성한다.
도커 컴포즈를 사용하기 위해서는 모든 어플리케이션을 감싸고 있는 폴더에, docker-compose.yaml
파일을 생성해야 한다.
그리고 docker-compose.yaml
파일에 어플리케이션을 실행하기 위해 필요한 이미지, 컨테이너, 네트워크, 볼륨 등의 설정을 명시해주어야 한다. 또한 다중 컨테이너 간의 의존성을 설정하기 위해서는 docker-compose.yaml
파일을 작성할 때 depends_on
또는 links
키워드를 사용해주어야 한다. 도커 컴포즈는 설정이 끝나면 docker-compose up
명령을 사용하여 모든 컨테이너를 시작할 수 있다. docker-compose up
명령은 기본적으로 또한 docker-compose down
명령을 사용하여 모든 컨테이너를 중지하고, 리소스를 정리할 수도 있다.
version
: 도커 컴포즈 설정 파일의 구문 버전을 설정해주는 역할을 한다.
services
: 컨테이너로 실행할 어플리케이션 및 도커 이미지, 네트워크, 볼륨, 환경변수 등의 설정을 기술해준다. 각 서비스는 해당 이름을 가지고 있으며, 각각의 서비스는 각각의 도커 이미지를 실행하게 된다.
image
: 도커 허브를 통해, 해당 이름의 템플릿 이미지를 가져온다. Dockerfile
을 통한 커스텀 이미지 생성은 build
를 통해 할 수 있다.
volumns
: 컨테이너 생성 시 사용할 볼륨을 작성한다. 명명된 볼륨의 경우, 다른 컨테이너가 공유할 수도 있기 때문에, 명명된 볼륨을 사용하는 경우에는 services
와 동일한 레벨에서 (top 레벨에서) volumns
를 작성하여, 해당 명명된 볼륨의 이름을 작성해줘야 한다.
environment
: 환경 변수를 작성한다. 환경 변수는 -
를 통해 커맨드와 같이 작성하거나 혹은 key:value
형식으로 작성하는 것이 가능하다.
env_file
: environment
로 설정하는 것 외에도, 환경 변수 파일을 만든 후, 파일의 정보를 가져오는 것이 가능하다. env_file
을 사용하는 경우에는 해당 파일의 경로를 작성해주면 된다.
build
: Dockerfile
경로를 작성하여, 해당 내용을 기반으로 빌드하도록 도와줍니다.
depends_on
: 다른 컨테이너가 먼저 실행되고 나서 해당 컨테이너를 실행해야할 경우 사용한다.
container_name
: 해당 컨테이너의 이름을 직접 설정하는 것이 가능하다. 컨테이너 이름을 설정하지 않는 경우, 폴더이름_서비스이름_증가하는숫자
형태로 자동으로 설정된다. 만약 도커 네트워크를 통해 해당 컨테이너의 IP 주소를 가져오는 경우에 폴더이름_서비스이름_증가하는숫자
를 쓰지 않고, 서비스 이름만 작성해도 가져오는 것이 가능하다.
version: 'version'
services:
mongodb:
image: "mongo"
volumes:
- data:/data/db
# container_name: mongodb
# environment:
# MONGO_INITDB_ROOT_USERNAME: xxx
# MONGO_INITDB_ROOT_PASSWORD : xxxxxx
# - MONGO_INITDB_ROOT_PASSWORD=xxxxxx
env_file:
- ./env/mongo.env
backend:
# image: "goals-node"
build: ./backend
# build:
# context: ./backend
# dockerfile: Dockerfile
# args:
# some-arg:1
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
# -it 설정, react-script 버전 최신으로 해서 나는 안해도됨
# stdin_open: true
# tty: true
depends_on:
- backend
volumes:
data:
logs:
docker-compose up
: docker-compose.yaml
내용을 바탕으로, 설정파일을 읽어들여 도커 이미지를 빌드하고, 네트워크를 구성하고, 볼륨을 연결하고, 환경변수를 설정하고 컨테이너를 실행하는 단계를 수행한다. 기본적으로는 attached mode
로 실행이 된다.
—d
: docker-compose up
의 전체 실행과정이 detached mode
로 실행된다.—build
: 이미지가 존재하여도, 강제적으로 리빌드 한다.docker-compose down
: 명령을 사용하여 모든 컨테이너를 중지하고, 리소스를 정리한다.
-v
: 관련된 볼륨을 삭제한다.docker-compose build
: docker-compose.yaml
내용을 바탕으로, 도커 이미지를 빌드한다. (컨테이너는 실행되지 않는다.)
네트워크 설정이 필요없다. yaml
파일에 의해 실행되는 모든 컨테이너는 하나의 네트워크로 연결이 된다. networks
를 통해 특정 네트워크를 직접 설정하는 것도 가능하다.
다수의 이미지와 컨테이너를 설정만 한다면, 하나의 커맨드만으로 정파일을 읽어들여 도커 이미지를 빌드하고, 네트워크를 구성하고, 볼륨을 연결하고, 환경변수를 설정하고 컨테이너를 실행하는 단계를 수행한다.
동일하게 하나의 커맨드만으로, 컨테이너를 종료하는 것이 가능하다.