1. 도커 컴포즈 개념
컨테이너를 관리하다 보면 여러 컨테이너를 동시에 실행하거나 설정을 관리해야 하는 경우가 자주 생길 것이다. 지금까지 강의에서 배운바에 따를때, 이러한 경우 컨테이너를 하나씩 실행하고 환경을 맞춰주어야 할 것이다. 이는 생각보다 귀찮은 작업이 될텐데, 여기서 도커 컴포즈(Docker Compose)를 활용할 수 있다.
도커 컴포즈를 한 문장으로 표현하면 여러 컨테이너를 정의하고 한꺼번에 실행할 수 있게 도와주는 도구라고 할 수 있는데, 위 그림에서 이러한 도커 컴포즈의 역할을 직관적으로 보여주고 있다. YAML 형식의 설정 파일 하나만 있으면 복잡한 환경을 쉽게 구성할 수 있다는 점이 도커 컴포즈의 큰 의의이다.
실습 명령어 정리
- docker compose up (-d) : YAML 파일에 정의된 서비스 생성 및 시작
- docker compose up -d --build : 로컬에 이미지가 있어도 해당 이미지를 제거하고 다시 이미지를 빌드
- docker compose ps : 현재 실행중인 서비스 상태 표시
- docker compose build : 현재 실행중인 서비스의 이미지만 빌드
- docker compose logs : 실행중인 서비스의 로그 표시
- docker compose down : YAML 파일에 정의된 서비스 종료 및 제거
2. 도커 컴포즈 파일
(1) 기본적인 구성
도커 컴포즈의 YAML 파일에 대해 예시를 통해 알아보자.
version: '3.8'
services:
web:
image: nginx
ports:
- "80:80"
networks:
- app-network
app:
build: ./app
ports:
- "5000:5000"
depends_on:
- database
networks:
- app-network
database:
image: postgres
environment:
POSTGRES_USER: example_user
POSTGRES_PASSWORD: example_password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-network
restart: always
volumes:
db-data:
networks:
app-network:
도커 컴포즈 YAML파일은 크게 두 가지 불록으로 구성된다. 1) version은 파일에서 사용하는 도커 컴포즈의 버전을 지정하는 블록이고, 2) services는 컨테이너를 정의하는 블록이다. 추가로, volumes, networks 블록을 선택적으로 구성할 수 있다. 참고로 예시에서 세 컨테이너 모두 networks를 app-network로 지정하고 있는데, 사실 도커 컴포즈에서는 networks 항목을 굳이 추가하지 않아도 모든 컨테이너를 기본 네트워크에 포함시킨다고 한다. 이하에서는 가장 중요해 보이는 services 블록을 중심으로 살펴보자.
예시의 services 블록 하위에서 web, app, database 블록들을 확인할 수 있는데 이들이 바로 실행할 컨테이너들이다. web 컨테이너의 경우 Dockerhub에서 Nginx 이미지를 가져와 사용하고 있고, 로컬 컴퓨터의 80번 포트를 컨테이너의 80번 포트에 매핑하며, app-network라는 사용자 정의 네트워크에 연결된다. 해당 부분은 다음 명령어와 동일한 동작을 한다.
docker run -d --name web --network app-network -p 80:80 nginx
app 컨테이너의 경우 로컬 디렉토리 ./app 에서 Dockerfile을 찾아 이미지를 빌드하고 있다. 만약 build 명령어와 함께 image 명령어를 사용하게 되면, image 이름으로 명시된 이미지가 이미 존재할 시 해당 이미지를 사용하고 존재하지 않으면 build 명령어를 기반으로 이미지를 빌드하여 이를 이미지이름으로 태깅후 사용하게 된다. depends_on 명령어의 경우 컨테이너의 종속성을 정의하는데, 예제의 app 컨테이너는 database 컨테이너가 먼저 시작된 후 실행하게 된다. 다만 실제로 database가 준비되었는지 여부를 확인하지는 않는다고 한다.
database 컨테이너의 경우 환경변수와 도커 볼륨울 활용하고 있음을 알 수 있다. database컨테이너 부분에는 restart 명령어가 있는데, 이는 컨테이너의 재시작 정책을 정의하는 부분이다. always 옵션은 컨테이너가 정상적으로 종료되더라도 항상 재시작하도록 하고, 이외에 기본값인 no옵션, 비정상 종료시 재시작하는 on-failure 옵션이 있다.
(2) 공통환경변수
도커 컴포즈 버전3부터는 공통환경변수기능을 지원한다. 예시에서는 database 컨테이너에서만 환경변수를 지정하고 있는데, 이와 달리 환경변수가 여러 서비스에서 반복적으로 사용될 경우가 있을 것이다. 공통환경변수기능은 이러한 환경변수를 한 곳에서 정의하고 필요한 서비스에 쉽게 적용할수 있도록 한다.
version: '3.8'
x-common-env: &common-env
environment:
APP_ENV: production
LOG_LEVEL: info
API_ENDPOINT: https://api.example.com
services:
web:
image: nginx
<<: *common-env
ports:
- "80:80"
app:
build: ./app
<<: *common-env
ports:
- "5000:5000"
위 예시에서 알 수 있듯이, x- 접두사를 사용하여 공통 환경변수를 정의하고, YAML 앵커(&)를 붙여 이후에 이를 별칭(*)으로 참조할 수 있게 한다. <<:는 YAML 병합 키로, 지정된 앵커의 내용을 병합하여 포함시키는 구문이다. 이를 통해, web 컨테이너와 app 컨테이너는 x-common-env에서 정의된 환경변수를 병합하여 적용받을 수 있다.
'공부 > 개발자를 위한 쉬운 Docker' 카테고리의 다른 글
[Docker] 도커 볼륨 (0) | 2024.11.20 |
---|---|
[Docker] 도커 네트워크 (0) | 2024.11.19 |
[Docker] 이미지 빌드 (0) | 2024.11.17 |
[Docker] 도커 이미지 (0) | 2024.11.17 |
[Docker] 가상화 기술과 도커 (0) | 2024.11.11 |