[Docker] 도커 컴포즈 (Docker Compose)란?
04 Feb 2023해당 포스트는 inflearn에서 subicura님의 초보를 위한 도커 안내서의 강의를 듣고 정리한 문서입니다.
Docker-Compose
컨테이너를 하나하나 docker run
과 같은 명령어를 통해 관리를 해본다고 생각하자.
실제 서비스가 들어갔을 경우 -v
나 -f
같은 옵션들이 컨테이너마다 다를것이고, 도커에 대한 컨테이너가 다수일 경우 컨테이너에 대한 관리가 쉽지가 않다.
그래서 도커에서는 Compose 라는 기능을 제공한다.
Docker-Compose 란?
Docker-Compose란, Docker 애플리케이션을 보다 쉽게 정의하고 실행하기 위한 도구이며, YAML 파일을 사용하여 애플리케이션의 서비스를 구성한다.
YAML파일에 Docker에서 사용하는 애플리케이션에 대한 설정들을 작성하면, 하나의 명령어로 사용에 필요한 Docker 컨테이너를 띄울 수 있다.
아래는 redis에 관련된 예시 yaml 파일이다.
# redis-server.yml
version: '3.7'
services:
redis:
image: redis:alpine
command: redis-server --port 6379
container_name: redis_boot
hostname: redis_boot
labels:
- "name=redis"
- "mode=standalone"
ports:
- 6379:6379
실습
Docker-Compose 버전 확인
아래의 명령어를 사용하면 Docker-compose에 대한 버전을 확인 할 수 있다.
PS C:\WINDOWS\system32> docker-compose version
Docker Compose version v2.15.1
만약 Linux의 경우에는 Docker-compose를 설치해 주어야 한다.
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)
sudo chmod +x /usr/local/bin/docker-compose
Docker-Compose 문법
Docker-Compose의 문법에 대해 간략하게 살펴보자.
version
version: '3'
docker-compose.yml 파일을 버전을 명세하는 명령어이다. docker-compose.yml 버전에 따라 지원하는 도커 엔진 버전이 상이하다. 자세한 명세는 아래의 docs 문서에서 확인할 수 있다.
간단하게 정리하자면,
version: '1'
: 명시를 생략한다. (service 항목부터 시작)
version: '2'
: 2버전 이후부터는 2.x의 마이너 버전까지 명시해야 하며, 소수점을 명시하지 않을경우 2.0으로 적용된다. Docker 버전은 Compose 1.6.0+, Engine 1.10.0+ 버전에서 지원된다.
version: '3'
: Compose와 Docker 엔진의 스웜모드 간에 상호 호환되도록 설계 되었다.
도커 스웜이란? 여러 도커 호스트들을 클러스터로 묶어 주는 컨테이너 오케스트레이션 도구이다.
services
services:
mysql:
...
redis:
...
실행할 컨테이너를 정의한다, service 하단의 mysql는 docker run --name mysql
와 같다고 할 수 있다.
image
services:
mysql:
image: mysql:5.7
컨테이너에 사용할 이미지 이름과 태그이다, 태그를 생락하면 :latest의 이미지를 가져온다. 이미지가 없을경우 자동으로 pull을 실행한다.
port
services:
mysql:
...
ports:
- "3306:3306"
-p
옵션과 같다. 컨테이너와 연결할 포트를 정의한다
{호스트 포트}:{컨테이너 포트}
environment
services:
mysql:
...
environment:
- MYSQL_ROOT_PASSWORD=somewordpress: '3'
-e
옵션과 같다. 컨테이너에서 사용할 환경변수들을 정의한다.
- {환경변수 이름}:{값}
volumes
services:
mysql:
...
volumes:
- ./app:/app
-v
옵션과 같다. 컨테이너 디렉토리와 호스트 디렉토리를 연결해주는 옵션을 설정한다.
- {호스트 디렉토리}:{컨테이너 디렉토리}
restart
services:
mysql:
restart: always
Docker 컨테이너의 재시작 정책을 정의한다.
restart: no
: 기본 정책이며, 어떤 상황에서도 컨테이너가 다시 실행되지 않는다.
restart: always
: 컨테이너가 중지될 경우 항상 컨테이너를 다시 시작한다.
restart: on-failure
: 종료코드가 실패시 오류를 나타내는 경우 (0외 다른 종료코드) 컨테이너를 다시 실행한다.
restart: unless-stopped
: 부팅시 자동으로 컨테이너를 재시작 합니다.
build
django:
build:
context: .
dockerfile: ./compose/django/Dockerfile-dev
도커의 이미지를 자체 빌드 후에 사용한다. image 속성 대신 사용하며, 여기에 사용할 별도의 도커파일을 생성해야 한다.
이하 자세한 문법의 명세는 아래의 공식문서에서 확인 할 수 있다.
- Version 2
Compose file version 2 reference
- Version 3