다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구입니다.
Docker Compose
를 이용하면 여러 개의 컨테이너(container)
로 구성된 애플리케이션
을 하나의 파일에 정의해놓고 한 번에 올리거나 내릴 수 있습니다. Docker Compose
는 특히 로컬 개발 환경이나 테스트 자동화 환경에서 간단한 컨테이너 오케스트레이션(Container Orchestration) 도구로 많이 사용되고 있는데요. : Redis?
Docker Compose
는 기본적으로 docker-compose.yml
파일을 설정 파일로 사용하는데 일반적으로 프로젝트의 최상위 디렉토리에 위치시킵니다. : YAML - ain't markup language
: 일반적으로 구성 파일 및 데이터가 저장되거나 전송되는 응용 프로그램에서 사용됩니다.
: 원래는 XML이나 json 포맷으로 많이 쓰였지만, 조금 더 사람이 읽기 쉬운 형태로 나타낸게 yaml입니다.
docker-compose.yml
파일은 대략적으로 다음과 같은 구조를 갖습니다.
version: "3.5" services: web: # 웹 애플리케이션 설정 db: # 데이터베이스 설정 networks: # 네트워크 설정 volumes: # 볼륨 설정
- 맨 위에 Docker Compose 규격의 어떤 버전을 사용하는지 명시하고, 그 아래에 각각 서비스, 네트워크, 볼륨 영역에 대한 설정을 할 수 있습니다.
- Docker Compose에서 서비스는 독립된 컨테이너에서 돌아가는 애플리케이션의 구성 요소라고 생각하면 됩니다.
- 가장 먼저 프로젝트에서 개발하고 있는 애플리케이션 자체가 서비스가 될 것이고, 그 밖에 해당 애플리케이션이 의존하는 데이터베이스나 캐시 등도 서비스가 될 수 있습니다.
- 쉽게 말해, 메인 애플리케이션 뿐만 아니라 정상적으로 구동되기 위해서 필요한 기반 시스템까지 Docker Compose로 설정한다고 보시면 됩니다.
- 그렇게 때문에 로컬에 별도로 데이터베이스를 셋업하는 등의 추가 작업이 필요없이 바로 Docker Compose 커맨드 하나로 애플리케이션을 올릴 수 있는 것이지요.
build
항목은 해당 서비스의 이미지를 빌드하기 위한 Dockerfile
이 위치하는 경로를 지정하기 위해 사용됩니다. 예를 들어,
docker-compose.yml
파일과 동일한 디렉토리에 위치한Dockerfile
을 사용해서web
서비스의 이미지를 빌드하려면 다음과 같이 설정합니다.services: web: build: .
Dockerfile
이 아닌 다른 이름의 파일로 빌드를 하고 싶거나, 빌드 인자를 넘겨야 하는 경우에는 다음과 같이 하위 항목을 사용해서 좀 더 구체적으로 설정을 해줄 수 있습니다.services: web: build: context: ./app dockerfile: Dockerfile-dev args: env: "development"
build
항목은 이미지 저장소로 부터 내려받을 이미지의 이름과 태그를 명시하는데 사용됩니다.services: db: image: postgres:13 cache: image: redis
ports
항목은 외부로 노출시킬 포트의 맵핑을 명시합니다. services: web: ports: - "8000:8000" db: ports: - "5432:5432"
volumes
항목은 볼륨 설정을 위해 쓰입니다. services: web: volumes: - .:/web
depends_on
항목은 서비스 간 의존 관계를 지정하기 위해서 사용됩니다. 예를 들어, 웹 애플리케이션이 올라오기 전에 데이터베이스가 먼저 올라와야 한다면 다음과 같이 설정합니다.
services: web: depends_on: - db
command
항목은 해당 서비스가 올라올 때 Dockerfile
의 CMD
명령문을 무시하고 실행할 명령어를 설정하기 위해서 사용됩니다.services: web: command: node .
environment
항목은 환경 변수를 설정하기 위해서 사용됩니다.environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres
version: "3" services: redis-server: image: "redis" node-app: build: . ports: - "5000:8080"
- version : 도커 컴포즈의 버전
- services : 이곳에 실행하려는 컨테이너들을 정의
- redis-server : 컨테이너 이름
- image : 컨테이너에서 사용하는 이미지
- node-app : 컨테이너 이름
- build : 현재 디렉토리에 있는 Dockerfile 사용
- ports : 포트 맵핑 - 로컬포트 : 컨테이너 포트
docker-compose up
커맨드는 아마도 Docker Compose에서 가장 자주 사용되는 커맨드입니다.
Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 생성하고 실행하기 위해서 사용합니다.
보통 -d
옵션을 사용하여 백그라운드에서 컨테이너를 띄우는 경우가 많습니다.
>>> docker-compose up -d
Creating network "django-app_default" with the default driver
Creating django-app_db_1 ... done
Creating django-app_web_1 ... done
>>>
-d
옵션을 사용하지 않으면 현재 터미널이 컨테이너의 로그가 출력되고 Ctrl + C를 눌러서 탈출하는 순간 컨테이너가 모두 정지되기 때문입니다.>>> docker-compose up -d
docker-compose down
커맨드는 docker-compose up
커맨드와 정반대의 동작을 합니다.>>> docker-compose down
Stopping django-app_web_1 ... done
Stopping django-app_db_1 ... done
Removing django-app_web_1 ... done
Removing django-app_db_1 ... done
Removing network django-app_default
Docker Compose
는 기본적으로 커맨드가 실행하는 디렉토리에 있는 docker-compose.yml
또는 docker-compose.yaml
를 설정 파일로 사용합니다. -f
옵션으로 명시를 해줍니다.>>> docker-compose -f docker-compose-local.yml up
>>> docker-compose -f docker-compose.yml -f docker-compose-test.yml up
docker-compose start
커맨드는 내려가 있는 있는 특정 서비스 컨테이너를 올리기 위해서 사용합니다. docker-compose up
커맨드를 사용해도 내려간 서비스를 알아서 올려주므로 무방합니다.>>> docker-compose start web
Starting web ... done
docker-compose stop
커맨드는 docker-compose start
커맨드와 정반대의 동작을 합니다. >>> docker-compose stop web
Stopping django-app_web_1 ... done
docker-compose ps
커맨드는 Docker Compose에 정의되어 있는 모든 서비스 컨테이너 목록을 조회할 때 사용합니다.>>> docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------
django-app_db_1 docker-entrypoint.sh postgres Up 5432/tcp
django-app_web_1 python manage.py runserver ... Up 0.0.0.0:8000->8000/tcp
docker-compose logs
커맨드는 서비스 컨테이너의 로그를 확인하고 싶을 때 사용하며, 보통 -f
옵션을 붙여서 실시간 로그를 확인합니다.>>> docker-compose logs -f web
Attaching to django-app_web_1
web_1 | Watching for file changes with StatReloader
web_1 | Performing system checks...
web_1 |
web_1 | System check identified no issues (0 silenced).
web_1 |
web_1 | May 30, 2020 - 22:16:29
web_1 | Django version 3.0.6, using settings 'our_project.settings'
web_1 | Starting development server at http://0:8000/
web_1 | Quit the server with CONTROL-C.
docker-compose exec
커맨드는 실행 중인 서비스 컨테이너를 대상으로 어떤 명령어를 날릴 때 사용합니다.>>> docker-compose exec db psql postgres postgres
psql (12.2 (Debian 12.2-2.pgdg100+1))
Type "help" for help.
postgres=#
docker-compose run
커맨드는 서비스 컨테이너의 특정 명령어를 일회성으로 실행할 때 사용합니다.>>> docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=10757eb6642e
TERM=xterm
LANG=C.UTF-8
GPG_KEY=E3FF2839C048B25C084DEBE9B26995E310250568
PYTHON_VERSION=3.8.2
PYTHON_PIP_VERSION=20.1
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/1fe530e9e3d800be94e04f6428460fc4fb94f5a9/get-pip.py
PYTHON_GET_PIP_SHA256=ce486cddac44e99496a702aa5c06c5028414ef48fdfd5242cd2fe559b13d4348
PYTHONUNBUFFERED=1
HOME=/root
docker-compose config
커맨드는 Docker Compose 설정을 확인할 때 사용합니다. -f
옵션으로 여러 개의 설정 파일을 사용할 때, 최종적으로 어떻게 설정이 적용되는지 확인해볼 때 유용합니다.>>> docker-compose config
services:
db:
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
image: postgres
web:
build:
context: /Users/dale/temp/django-app
command: python manage.py runserver 0:8000
depends_on:
- db
ports:
- 8000:8000/tcp
volumes:
- /Users/dale/temp/django-app:/web:rw
version: '3.0'