Docker-compose 사용 이유
하나의 어플리케이션을 동작하기 위해 여러 컨테이너 기반 서비스가 실행 되어야 함
컨테이너 간 의존성, 네트워크, 볼륨 등을 정의하며 컨테이너를 순차적으로 생성 할 필요 존재
Docker-compose 작동 구조
Docker-compose 파일은 yaml 형태로 작성, 각 컨테이너의 Dockerfile들을 순차적으로 실행
Docker-compose yaml 파일 구성
Docker Compose 주요 항목
📁 1. 버전 정의
- Version: ‘3.0’ : YAML 파일의 버전
- ex) version : "3.5"
📁 2. 서비스 정의
큰 서비스 목록 (services) 아래의 서비스 들 존재.
- Image : 서비스의 컨테이너 생성 이미지
- build : 서비스의 컨테이너 Dockerfile 기반 빌드용 이미지 path 지정 (yml 파일 위치부터 relative path)
- depends_on : 서비스의 특정 컨테이너 의존 관계 명시 (명시 항목 우선 실행)
- labels : 메타 데이터 추가
- container_name : 서비스 내 컨테이너 이름
- networks : 서비스 네트워크 설정
- volumes : 서비스 볼륨 설정
- volumes_from : 다른 서비스(컨테이너)의 모든 볼륨 마운트
- environment : 서비스의 내부 컨테이너에서 사용할 환경변수 (ex. name:value , -name=value)
- env_file : 서비스의 내부 컨테이너에서 사용할 환경변수 파일로부터 추가
- command : 서비스 컨테이너가 실행될 때 수행 명령어 (디폴트 command를 덮어씀)
- ports : 서비스의 개방 포트
- expose : 호스트 머신상에만 포트 노출. 링크된 서비스만 엑세스 가능
- Links : 컨테이너를 다른 서비스에 링크함 (유사 external_links , compose 밖 서비스에 링크)
- extra_hosts : 호스트명의 맵핑 추가 (docker의 --add-host 옵션과 동일, /etc/hosts에 추가됨)
- extends : 현재 파일을 다른 서비스 파일(.yaml) 의 옵션으로 설정을 덮는 것
- log_driver : 로그 기록용 드라이버 지정
- dns : dns 서버 설정 (ex. dns:8.8.8.8)
- dns_search : DNS의 Search 도메인 설정 (ex. webexample.com)
예시 ex)
services:
service_a:
image : img1:latest
container_name : con_a
networks:
- all_network1
volumes:
- all_volume1:/share
ports:
- 80:8000
- 5432:5432
environment:
- PUBLIC_KEY=1234
service_b:
image : img2:latest
container_name : con_b
networks:
- all_network1
volumes_from:
- service_a
ports:
- 3306:3306
depends_on:
- service_a
environment:
PRIVATE_KEY:4321
📁 3. 기타 docker run과 같은 옵션들
- working_dir : 작업중인 디렉토리 이동 (=cd)
- entrypoint : 컨테이너 생성시 실행되는 명령어
- memlit : 메모리 제한
- privileged : 시스템 내 주요 자원에 접근하기 위해 도커 컨테이너를 권한 모드(privileged 모드)로 실행하는 것
- restart : 재시작
- tty : 터미널 입력 대기 상태로 유지하기 (기본적으로 터미널 인터랙티브 입력이 없다는 상황을 가정하여 프로세스가 바로 종료 되기 때문)
services:
service_a:
image : img1:latest
container_name : con_a
working_dir : /be
entrypoint: /be/start.sh
mem_limit: 10000000
privileged: true
restart: always
tty: true
📁 4. 네트워크 및 볼륨 정의
Docker compose는 기본적으로 실행시 하나의 default network에 모든 container를 연결하며, default network의 이름은 yml이 위치한 디렉토리 이름 뒤에 _default가 붙게 됨. (ex. yaml위치한 디렉토리 이름이 my_temp라면 network이름은 my_temp_default가 됨)
네트워크
- driver : 기본 브리지 타입의 네트워크 생성
- Ipam : IP Address Mananger를 위해 사용하며, subnet, ip 범위 등 설정 가능
- External : 새로운 네트워크를 생성하는 것이 아닌 기존의 네트워크를 사용하게 하는 것
볼륨
- External : volume, volumes-from 등을 사용하여 프로젝트마다 볼륨을 사용 및 연결
- 새로운 볼륨을 사용하는 것이 아닌 기존의 볼륨을 사용하게 되는 것
services:
service_a:
image : img1:latest
container_name : con_a
networks:
- all_network1
volumes:
- all_volume1:/share
networks:
my_network_all:
driver: overlay
driver_opts:
subnt: "255.255.255.0"
IDAdress: "10.0.0.2"
volumes:
my_volume:
driver: flocker
driver_opts:
'DevOps > Docker' 카테고리의 다른 글
[Docker] Multi-stage Build (for Python Docker) (0) | 2023.03.21 |
---|---|
[Docker] Docker Network 종류 (0) | 2022.08.17 |
[Docker] Docker Volume 3가지 구성 방법 (0) | 2022.08.16 |
[Docker] Dockerfile 빌드 과정, 문법 정리, Docker Layer (0) | 2022.08.16 |
[Docker] Docker, Docker-compose 명령어 (0) | 2022.08.16 |