docker-compose.yaml 파일에 있는 애플리케이션들은 모두 같은 네트워크에 자동으로 연결된다. 이렇게 하면 복잡한 네트워크 설정 없이도 여러 컨테이너가 서로 쉽게 통신할 수 있다.설정도 간편하고, 빠르게 실행할 수 있고, 컨테이너들끼리의 연결도 쉽게 할 수 있기에 Dockfile Compose 는 개별장 여러 컨테이너를 관리하고 실행하는 데 정말 편리한 도구이다.
docker compose up 명령어로 이 모든 것을 한 번에 시작할 수 있다.docker compose up -d
./run_tests
docker compose downdocker compose up 으로 실행하기키-값 쌍: 키와 값으로 이루어진 쌍으로 구성된다. 키와 값은 콜론(:)으로 구분한다.
리스트: 쉼표(,)로 구분된 값들의 리스트로 구성된다.
딕셔너리: 중괄호({})로 둘러싸인 키-값 쌍의 리스트로 구성된다.
불린 값: true, false, yes, no 등의 값으로 표현된다.
문자열: 큰 따옴표("")나 작은 따옴표('')로 둘러싸인 문자열로 표현된다.
주의사항
version: '3' # Docker Compose의 버전을 정의
services: # 4개(web,api,redis,mysql)의 서비스 정의
web: # 이름 지정 가능, `web` 서비스는 Nginx 이미지를 사용하며, 포트 80번을 호스트 머신에 노출
image: nginx:latest
ports: # 앞 포트에서 뒤 포트로 연결
- 80:80
volumes: # `web` 서비스는 현재 디렉토리 내 `web` 디렉토리를 컨테이너에 연결
- ./web:/usr/share/nginx/html
depends_on: # 각 서비스 간의 의존성을 정의, `web` 서비스는 `api`서비스에 의존
- api
links: # 각 서비스 간의 링크를 정의, `web` 서비스는 `api`서비스에 링크됨
- api:api
api: # `api` 서비스는 Java 이미지를 사용하며, 포트 8080번을 호스트 머신에 노출
image: java:latest
volumes: # `api` 서비스는 현재 디렉토리 내 `api` 디렉토리를 컨테이너에 연결
- ./api:/app
ports:
- 8080:8080
environment:
- REDIS_HOST=redis
- MYSQL_HOST=mysql
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=test
depends_on: # 각 서비스 간의 의존성을 정의, #`api` 서비스는 `mysql`과 `redis` 서비스에 의존
- mysql
- redis
links: # 각 서비스 간의 링크를 정의, # `api` 서비스는 `mysql`과 `redis` 서비스에 링크됨
- mysql:mysql
- redis:redis
redis: # `redis` 서비스는 Redis 이미지를 사용하며, 포트 6379번을 호스트 머신에 노출 (volumes 없음)
image: redis:latest
ports:
- 6379:6379
mysql: # `mysql` 서비스는 MySQL 이미지를 사용하며 포트 3306번을 호스트 머신에 노출
image: mysql:latest
ports:
- 3306:3306
volumes: # `mysql` 서비스는 현재 디렉토리 내 `mysql` 디렉토리를 사용하여 MySQL 데이터를 영구적으로 저장
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=test
- MYSQL_USER=root
- MYSQL_PASSWORD=password
이 예제에서는 web 서비스와 api 서비스가 각각 독립적인 컨테이너로 실행된다. web 서비스는 api 서비스에 의존하며, api 서비스는 mysql과 redis 서비스에 의존하며, redis와 mysql 서비스는 각각 독립적인 컨테이너로 실행된다.
version: "3"
services:
service1:
# ...service1 설정
service2:
# ...service2 설정
networks:
# 네트워크 설정, 선택적
volumes:
# 볼륨 설정, 선택적
참고 사이트 : https://docs.docker.com/compose/compose-file/compose-versioning/
보통 docker engine 3.8로 사용한다. 다음과 같은 형식으로 사용한다.
web (이름 지정 가능) :
build
context
dockerfile
이거 대신에 만들어진 image pull해서 사용 ok
services:
web:
build:
context: . # Dockerfile 의 위치
dockerfile: Dockerfile # Dockerfile 파일명
container_name: testapp_web_1 # 생략하는 경우 부여되는 이름, 애초에 지정해서 이름변경 가능
# 자동으로 부여 docker run 의 --name 옵션과 동일
ports: "8080:8080" # docker run 의 -p 옵션으로 docker run 한 것과 동일
expose: "8080" # 호스트머신과 연결이 아니라
# 링크로 연결된 서비스 간 통신이 필요할 때 사용되는 포트
networks: testnetwork # networks 를 최상위에 정의한다면 해당 이름을 사용
# docker run의 --net 옵션과 동일
volumes: .:/var/lib/nginx/html # docker run 의 -v 옵션과 동일 # 현재 디렉토리를 html에 연결
environment:
- APPENV=TEST # docker run 의 -e옵션과 동일
command: npm start # docker run 의 가장 마지막, 이 container를 실행 시 어떤 명령어를 실행할 지 작성
restart: always # docker run 의 --restart 옵션과 동일
depends_on: db # 이 옵션에 지정된 서비스가 시작된 이후에 `web`서비스가 실행
links: db # Docker가 네트워크를 통해 컨테이너를 연결하도록 정의합
# 컨테이너를 연결할 때 Docker는 환경 변수를 만들고
# 컨테이너를 알려진 호스트 목록에 추가하여 서로를 검색 가능
deploy: # 서비스의 복제본 개수 등 지정
replicas: 3
mode: replicated
volumes:docker-compose.yml 파일에 선언된 볼륨만 docker-compose.yml에서 사용할 수 있다.version: "3.9"
services:
web:
# ...
volumes:
- README.md:/docs/README.md # 호스트의 README.md 파일을 컨테이너 내부 /docs/README.md에 마운트
- logvolume01:/var/log # 선언된 도커 볼륨 logvolume01을 컨테이너 내부 /var/log에 마운트
# ...
volumes:
logvolume01: {} # 도커볼륨 logvolume01 선언
networks:healthcheckhealthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
start_interval: 5sDocker Compose 도구와 관련된 명령어를 실행할 수 있는 명령줄 인터페이스
docker-compose [COMMAND] [SERVICES...]의 형태로 지정된 서비스(컨테이너)만 제어가 가능한다. 예를 들어서 web, redis 중에 web만 기동하고 싶을 경우 docker-compose up -d web와 같이 실행한다.docker-compose up--buildd--force-recreatedocker-compose down--volume-fdocker-compose execdocker-compose exec django ./manage.py makemigrations
docker-compose exec db psql postgres postgresdocker-compose rundocker-compose exec web echo "hello world" # 이미 실행된 web 컨테이너에서 echo "hello world"를 실행
docker-compose run web echo "hello world" # web 컨테이너에서 echo "hello world"를 실행하고 컨테이너 종료