단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구
Docker Compose가 필요한 이유
하나의 어플리케이션이 여러 개의 컨테이너를 가진다면 이미지를 하나씩 빌드하고 컨테이너를 하나씩 실행시켜야한다. 하지만, docker-compose를 사용하면 이를 테스트하거나 실행하기 위해 각각의 컨테이너를 수동으로 생성하고 실행하는 번거로움을 줄일 수 있다.
예를 들어, 웹 서버와 데이터베이스로 구성된 어플리케이션을 실행할 때, docker-compose를 사용하면 두 컨테이너를 하나의 설정 파일로 정의하여 관리할 수 있다. 이를 통해 컨테이너들 간의 연결 관계를 쉽게 설정하고, 복잡한 다층 구조의 어플리케이션을 간편하게 운영할 수 있다. doker-compose를 활용하면 컨테이너들을 하나의 네트워크로 묶어 관리할 수 있어서 작업의 효율성을 높일 수 있다.
docker-compose는 YAML 파일을 사용하여 각 컨테이너가 어떻게 상호작용하는지, 어떤 네트워크와 볼륨을 사용하는지 정의할 수 있다.
docker-compose.yml
docker-compose.yml 파일 구조
version
Docker Engine과 호환되는 Docker Compose 파일의 버전을 명시한다.(예를 들어, version:"3.8"과 같이 명시)
# docker-compose.yml
version: "3.8"
services
애플리케이션의 서비스를 정의한다. 이 서비스는 컨테이너의 집합으로, 독립적으로 확장하거나 교체할 수 있는 컴퓨팅 자원을 나타내며, 각 서비스는 Docker 이미지와 실행을 위한 설정을 포함한다.
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./web:/usr/share/nginx/html
networks:
- my_network
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example_password
MYSQL_DATABASE: my_database
MYSQL_USER: my_user
MYSQL_PASSWORD: my_password
networks:
- my_network
networks:
my_network:
Docker Compose 서비스를 정의하기 위한 옵션
# docker-compose.yml 파일에 정의된 서비스들의 이미지를 빌드(이미지를 새로 빌드하여 업데이트된 코드를 반영)
$ docker-compose build
# docker-compose.yml 파일에 정의된 모든 서비스 시작(이미지가 없는 경우 이미지를 빌드하고 컨테이너 생성)
# -d 옵션: 백그라운드에서 실행
$ docker-compose up [-d]
# 정의된 서비스들을 시작(이미지를 새로 빌드하지 않고, 중지된 서비스를 다시 시작)
$ docker-compose start
# 정의된 서비스들을 중지(컨테이너를 중지하지만 제거는 하지않음)
$ docker-compose stop
# 정의된 서비스들을 재시작(이미지를 새로 빌드하지 않고, 중지된 서비스를 다시 시작)
$ docker-compose restart
# 정의된 서비스들을 중지하고 컨테이너 제거
$ docker-compose down
# 정의된 서비스들의 상태 확인(실행 중인 컨테이너와 포트 매핑 정보)
$ docker-compose ps
# 정의된 서비스들의 로그 확인
$ docker-compose logs
# 중지된 컨테이너를 제거(종료된 서비스의 컨테이너를 정리)
$ docker-compose rm
# 프로젝트 내 이미지 목록
$ docker-compose images
# 프로젝트 내 실행중인 프로세스 목록
$ docker-compose top
[참고자료]
도커 컴포즈1
도커 컴포즈2
도커 컴포즈 파일 구조1
도커 컴포즈 파일 구조2
도커 컴포즈 명령어
도커 컴포즈 실습