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

Docker?

서비스를 패키징 및 배포를 하는데 유용한 오픈소스 프로그램
즉 , 컨테이너를 모듈식 가상 머신처럼 사용 가능하게 만들어주는 프로그램
카카오 컨퍼런스 이것을 보면 너무 컨테이너 관련 설명을 잘해주신다

기존 Linux Container과 차이점

Pasted image 20231122151223.png
Red Hat

위 사진을 보면 LXC는 간단히 설명하면 VM과 같은 머신을 이용하여 가상 환경을 띄우는 것 인데,
VM은 각 환경마다 OS 를 구축을 해야하지만, Docker은 Docker Engine 상에 프로세스를 띄워 사용하는 방식이기 때문에 보다 가벼워 졌다고 볼 수 있다.
과거에 Vagrant로 Hadoop EchoSystem을 구축해본 경험이 있는데 상당이 느리게 구축하였다, 하지만 Docker를 이용하니 상당히 빠른시간에 Build 및 구축이되서 상당히 당황스러웠다.

장점

  • 위와 같이 각각의 App, Service? 단위로 독립된 공간에 존재하여 서로 충돌이 발생하지 않게 구성하기 용이하다.
    • 마이크로 아키텍쳐 구성을 하기 용이하다.
  • 배포 시 이미지를 그대로 운영 서버에 배포하면 된다.
  • 같은 이미지를 사용하면, 같은 환경이라 봐도 무방하기 때문에 환경에 대한 제약이 적어져 배포, 확장이 용이해진다.

기본 준비 사항

window 기본적으로 Docker는 linux kernel 기반으로 동작을 하는 것으로 알고 있다.
Window에서 wsl 설정을 하여 우분투 환경을 구축 하고 docker desktop을 설치 혹은 docker를 설치하여 사용할 수 있다.
Docker Doc 혹은 MS Doc에 들어가서 따라하면 쉽게 할 수 있을 것 이다.

Docker 를 설치하였다면, Dockerfile혹은 docker-compose을 이용하여 이미지 빌드, 배포를 하여 사용할 수 있다.

[ Reference ]


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

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

docker-compose  (1) 2023.11.27

+ Recent posts