Docker Compose?

간단히 말하면 Dockerfile을 이용하여 생성한 Docker Image를 Services로 묶어 구성을 작성한 Yaml파일을 관리 도구
추가적으로 작성하자면, Dockerfile를 이용하여 구축 시 Docker Run에 상당히 많은 옵션값들을 작성해야 한다
Docker Compose를 이용하면 해당 옵션들을 작성 후 간단한 명령줄로 Docker Container를 생성 할 수 있다

요소들

설정할 수 있는 것들이 너무 많아 모든 것을 정리하지는 않음.
e.g blkio_config, cpu, mem

Expose

컨테이너 간 Port 노출
Host에게 노출되는 것은 아님

port

Host에게 Port 노출

Network

Container 에서 사용할 Docker Networks 지정

Network_mode

Container의 Network 모드 설정

None : Network 미사용
Host : Host의 Network 사용
service:{Name} : 특정 Service에만 접근 허용

CheatSheet


version: "3.7" # compose file format설정.

servies : # services 정의, 클러스터 정의라고 봐도 무관할듯
	container_name : # 생성할 container 명
		image : Image_Name #사용할 Image
        attach : true # 서비스 로그 수집 여부 
		build  :  # 아래 옵션을안 쓰고 경로를 작성해도 무관
		  context: . # Docker file 경로
	      dockerfile : Dockerfile # Docker file 명
		container_name: my-web-container # 컨테이너에 부여할 이름
		labels:
	      # 방식 1
		  com.example.description: "Accounting webapp"
		  # 방식 2
		  - "com.example.description=Accounting webapp"
		# 환경 변수
		env_file: # 환경 변수 파일 추가
			- a.env
			- b.env
		environment: #환경변수 추가
			# 방식 1
			EVN_VAL1: VAL1
			EVN_VAL2: VAL2
			EVN_VAL3
			# 방식 2
			- EVN_VAL1=VAL1
			- EVN_VAL2=VAL2
			- EVN_VAL3
		restart : unless-stop # 재시작 여부
		
		# 실행
		command : # dockerfile CMD Overrides 
			# 방법 1
			sh -c "/script1.sh &&/script2.sh"
			
			# 방법 2
			sh -c "
			/script1.sh &&
			/script2.sh
			"
			
			# 방법 3
			- sh
		    - -c
			- |
			  /script1.sh
			  /script2.sh
		entrypoint : # dockerfile entrypoint Overrides 
  
		# 종속
		depends_on : # 종속관계 추가
			containerName : # 종속될 컨테이너
				restart : true/false # 종속된 컨테이너 업데이트 시 재 시작
				condition : service_healthy # 상태
		healthcheck:
		  test: ["CMD", "curl", "-f", "http://localhost"]
		  interval: 1m30s
		  timeout: 10s
		  retries: 3
		  start_period: 40s
		  start_interval: 5s
		# 네트워크
		expose :
			"8080"
		port :
			8080:8080
		network_mode : "host"
		networks:
	      - bapa-network
	      - bapa2-network

Network

Host 에서 생성한 네트워크 혹은 Docker 내부의 네트워크를 사용하기 위해 사용

services :
	....

networks :
	networName : 
		driver : driver Name
		driver_opts:
			driver_val : driver_val # Driver의 옵션 추가
		external : true #외부 네트워크 사용
		internal : false # 외부와 격리된 독립 네트워크
		label : metadata # 해당 네트워크의 메타 정보 저장
		name : network name # 특수 문자를 포함한 네트워크 잠조 시 사용
		ipam :
			driver : ipam DriverName
			config :
			  - subnet: 172.28.0.0/16
	          ip_range: 172.28.5.0/24
	          gateway: 172.28.5.254
	          aux_addresses:
	            host1: 172.28.1.5
		    options :
			    driver_val1: driver_val

Volumes

docker에 추가 volumes을 사용하고 싶으면 아래와 같이 정의하여 사용할 수 있다.

services :
	....
volumes:
	volumes_name : # 볼륨 명
		name : "volumes_name" # volume의 다른 이름을 붙여 사용하고 싶다면 사
		driver : drive_name # 사용할 docker volume driver
		driver_opts :  # docker volume driver 설정, key-value 로 사
			key : value
		    ...
			
	    external: true/false # 외부 volume 여무, 즉 기존에 생성한 volumes를 사용 할 것인가 ?
	    labels : # key-values로 구성된 volume의 메타데이터 설정
		    key : value
		    ...

그 외

# Extension
# 간단히 생각하면 변수 선언이라고 보면된다.
# x-{name} : &{name}
# Superset 예시
x-superset-image: &superset-image apachesuperset.docker.scarf.sh/apache/superset:${TAG:-latest-dev}
x-superset-common: &superset-common
  image: apachesuperset.docker.scarf.sh/apache/superset:${TAG:-latest-dev}
  depends_on:
    - db
    - redis

# Fragments
# 간단히 말하면 Extension을 사용하는 것.
# $를 이용하여 생성, *를 이용하여 사용
services :
  superset :
    <<: *superset-common # superset-common에 선언된것을 모두 사용하겠다는 의미
    image: *superset-image # 이와같이 1개만 가져와서 사용할 수 있다.

# interpolation
# 변수를 사용할 대 Default값을 설정하는 느낌이다.
# Trino 이미지 가져오는 예시
# TRINO_IMAGE_NAME 이 변수에 값이있으면 TRINO_IMAGE_NAME를 사용하고 없으면 trinodb/trino:433를 사용하겠다
image: ${TRINO_IMAGE_NAME:-trinodb/trino:433}

# 아래와 같이 작성하면 TRINO_IMAGE_NAME값이 없으면 Compose가 실패한다
image: $$TRINO_IMAGE_NAME

[ Reference ]


개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

'프로그래밍 및 IT > docker' 카테고리의 다른 글

docker  (0) 2023.11.22

+ Recent posts