3.1 파일 compose.yaml
파일 compose.yaml
(또는 다음과 같은 다른 옵션들: docker-compose.yaml
, docker-compose.yml
, compose.yml
) — 이건 Docker Compose에서 멀티컨테이너 어플리케이션을 정의하고 관리하기 위해 사용하는 주요 설정 파일이야. 이 파일은 어떤 컨테이너들(서비스들)을 실행해야 하는지, 서로 어떻게 상호작용하는지, 그리고 어떤 자원이 필요한지 설명하고 있어.
강의에서는 일관성을 위해 compose.yaml
형식을 사용할 건데, 이게 최신 Docker Compose 버전에서 추천되고 있어.
compose.yaml
파일의 구조
compose.yaml
파일은 여러 섹션으로 나뉘어져 있는데, 각각 어플리케이션 설정의 다양한 측면을 설명하고 있어. 주요 섹션에는 다음이 포함돼:
- version: Compose 파일의 버전을 지정 (예시:
'3.9'
). - services: 컨테이너(서비스), 그 설정과 종속 관계를 설명.
- volumes: 컨테이너와 호스트 간의 데이터 저장을 위한 볼륨 정의.
- networks: 서비스들이 서로 통신할 네트워크를 설정.
3.2 주요 지시어들
1. version
version 지시어는 compose.yaml
파일에서 사용된 Docker Compose 문법의 버전을 정의해. 이 글을 작성할 당시에는 버전 3이 가장 최신이고, 특히 3.8이랑 3.9 같은 업데이트가 있어.
version: '3.9'
2. services
services 섹션은 Compose가 생성하고 실행해야 하는 컨테이너들을 정의해. 각각의 서비스는 특정 설정을 가진 개별 컨테이너를 나타내.
예시:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
이 예시에서는 두 개의 서비스가 정의되어 있어: web
이랑 db
. web
서비스는 nginx:latest
이미지를 사용하고, 포트 80을 열어. db
서비스는 mongo:latest
이미지를 사용하고, 데이터 저장을 위한 볼륨을 연결해.
3. volumes
volumes 섹션은 데이터를 저장하기 위해 컨테이너에 연결될 수 있는 볼륨을 정의하는 데 사용돼. 이건 컨테이너를 다시 시작할 때 데이터를 유지하는 데 유용해.
예시:
volumes:
mongo-data:
4. networks
networks 섹션은 컨테이너가 작동할 커스텀 네트워크를 정의할 수 있어. 이건 격리랑 네트워크 연결 설정을 가능하게 해. 만약 네트워크가 지정되지 않으면, Docker Compose는 기본 네트워크를 생성하고, 모든 서비스가 거기에 연결돼.
예시:
networks:
front-end:
back-end:
3.3 서비스 설정을 위한 디렉티브
서비스 설정을 위한 주요 디렉티브:
1. image
image 디렉티브는 컨테이너를 생성하는 데 사용되는 이미지를 지정해 줘.
예제:
services:
web:
image: nginx:latest
2. build
build 디렉티브는 이미지를 빌드하는데 사용되는 Dockerfile의 경로를 지정하는 데 사용돼.
예제:
services:
app:
build: ./app
3. ports
ports 디렉티브는 호스트 머신에서 컨테이너로 열리고 전달될 포트를 정의해 줘.
예제:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
volumes 디렉티브는 볼륨을 컨테이너에 마운트해서 컨테이너를 재시작해도 데이터를 유지할 수 있게 해줘.
예제:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
environment 디렉티브는 컨테이너의 환경 변수를 설정할 수 있어.
예제:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
depends_on 디렉티브는 특정 서비스가 다른 서비스에 의존하며, 그 서비스가 실행된 후에 실행되어야 한다는 것을 알려줘.
중요!
당신의 서비스를 실행할 때, 모든 필요한 서비스가 완전히 준비되었다는 100% 보장은 없어. 그들은 실행되겠지만, 이후 올바르게 작동하는지에 대한 보장은 없어. 이 문제는 health-check로 해결되지만, 이건 나중에 살펴보기로 하자.
예제:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
command 디렉티브는 컨테이너가 시작될 때 실행될 명령을 재정의할 수 있어.
예제:
services:
app:
image: myapp:latest
command: python app.py
8. networks
networks 디렉티브는 서비스를 하나 이상의 네트워크에 연결해 줘.
예제:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 전체 예제
전체 파일 compose.yaml
의 예제
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
이 예제에서:
- 세 가지 서비스가 정의됨:
web
,app
,db
. -
web
은 Nginx 이미지를 사용하고, 설정 파일을 마운트하며,app
서비스에 종속됨. -
app
은 로컬 Dockerfile에서 빌드되고, 애플리케이션 소스 코드를 마운트하며 환경 변수를 사용함. -
db
는 MongoDB 이미지를 사용하며 데이터를 저장하기 위한 볼륨을 마운트함. - 서비스 간 상호작용을 격리하고 관리하기 위해 두 개의 볼륨과 두 개의 네트워크가 생성됨.
참고: 하나의 볼륨은 mongo-data
이고, 다른 하나는 호스트 머신의 디렉토리가 마운트된 것(예: ./app
)임.
GO TO FULL VERSION