docker compose
Docker Compose는 여러 개의 컨테이너를 사용하는 애플리케이션을 정의하고 실행하기 위한 컨테이너 관리 도구 입니다.
복잡한 컨테이너 환경을 YAML 파일 하나로 구성하고 docker-compose 명령어 하나로 서비스 전체의 실행/관리를 진행할 수 있습니다.
docker-compose.yml
설정 파일을 통해 컨테이너의 구성, 네트워크, 볼륨, 환경 변수 등을 선언적으로 정의가 가능하며 명령어 한줄로 모든 서비스를 한번에 관리가 가능합니다.
docker-compose.yml 구조
services:
CONTAINER_NAME1:
image: IMAGE_NAME1
ports:
- 내컴퓨터포트:컨테이너포트
environment:
- 환경변수1=값
- 환경변수2=값
- 환경변수3=${외부파일값}
networks:
- NETWORK_NAME1
- NETWORK_NAME2
CONTAINER_NAME2:
image: IMAGE_NAME2
ports:
- 내컴퓨터포트:컨테이너포트
environment:
- 환경변수1=값
- 환경변수2=값
- 환경변수3=${외부파일값}
depends_on:
- CONTAINER_NAME1
networks:
- NETWORK_NAME1
CONTAINER_NAME3:
image: IMAGE_NAME3
ports:
- 내컴퓨터포트:컨테이너포트
deploy:
mode: replicated
replicas: 3
networks:
- NETWORK_NAME2
volumes:
- VOLUME_NAME:path
restart: always
build: .
command: ["arg1", "arg2"]
develop:
watch:
- action: sync
path: 내컴퓨터경로
target: 컨테이너경로
ignore:
- 반영안할아이템
- action: rebuild
path: package.json
networks:
NETWORK_NAME1:
NETWORK_NAME2:
volumes:
VOLUME_NAME:
external: true
기본 명령어
컨테이너 생성 및 실행
docker compose up -d
컨테이너(서비스) 중지
docker compose stop
컨테이너, 네트워크 중지 및 삭제
docker compose down
docker compose
네트워크
- docker compose의
service:
하위 항목에 있는 컨테이너들은 자동으로 하나의 네트워크로 묶이게 된다. - 별도의 네트워크를 선언하고 서비스 별로 네트워크를 지정하면 네트워크를 더 세부적으로 분리할 수 있다.
컨테이너간 dependency
- 컨테이너들을 생성할 때 실행 순서나 컨테이너간의 종속성을 가지게 되는 경우가 있다.
그럴 경우
depends_on:
하위 항목으로 다른 서비스의 이름을 기재하게 되면 기재된 서비스 컨테이너가 먼저 생성 및 실행하고 다음으로 생성된다.
Deploy
- 서비스 배포 전략, 리소스, 복제 등을 설정한다.
volume
- docker compose 환경에서
volume:
설정을 활용하여 컨테이너 별 volume을 관리 할 수 있다
restart
- 컨테이너가 이슈로 인해 종료 되었을 경우 자동으로 재 시작 하기 위해서 설정한다. 다만 docker 명령어나 컨테이너를 직접 정지시켰을 경우에는 자동 재시작은 작동하지 않는다.
빌드 자동화
- 개발 환경을 컨테이너에 구축하고 프로젝트를 진행하는 경우가 자주 있는데 이 경우
down
->image build
->up
과정을 자동화 할 수 있다. - 서비스 내부에
build:도커파일경로
를 입력하면docker compose up
할 때마다 해당 경로에 있는 도커 파일을 자동으로 build 하여 이미지를 생성하고 컨테이너를 생성한다. - 하지만 자동으로 build를 진행하기 위해서는
docker compose up --build
명령어를 사용하여야 한다.
watch
- watch 기능은 특정 파일 및 폴더가 변경될 때 마다 연결된 컨테이너 경로에 동기/비동기적으로 반영한다.
action:
- sync<+restart> : 동적으로 반영, +restart 는 반영 후 자동 재시작
- rebuild : 반영 후 재 빌드
path
: 내 컴퓨터의 감지랗 폴더 경로target
: 반영할 컨테이너의 경로ignore
: 변동사항을 적용할 필요가 없는 파일이나 아이템을 작성. dockerignore파일로 대체 가능
command
- compose 파일 내부에
command
명령을 사용하면 Dockerfile의 CMD 명령어를 덮어 쓸수 있다.