Docker Compose란?

: 다수의 Container가 소프트웨어로 구성되는 경우에 사용가능한 툴과 설정파일 모음

  • docker-compose.yml이나 docker-compose.yaml 파일로 환경설정을 수행한다.
  • Docker Desktop의 일부로 설치된다.
  • docker-compose —version으로 버전확인

docker-compose.yml 작성

: v2와 v3가 합쳐진 버전 사용 → 1.27 버전 이후 docker 명령으로 compose가 추가되었다.

  • services : 프로그램을 구성하는 서비스들을 지정
    • 각 서비스는 별개의 image 지정과 container 실행으로 구성된다.
    • 각 서비스는 자신의 Dockerfile을 갖고 있어야한다.
    • 서비스 별 포트번호, 환경변수, 디스크 볼륨등을 지정해야한다.
  • volumes : 사용된 docker volume들을 지정
  • networks: 사용된 networks 지정

예시

services:
	frontend:
		build: ./frontend
		ports:
			- 3000:3000
	backend:
		build: ./backend
		ports:
			- 3001:3001
		environment:
			DB_URL: mongodb://database/vidly
	database:
		image: mongo:4.0-xenial
		ports:
			-27017:27017
		volumes:
			-vidly: /data/db
	volumes:
		vidly:

docker-compose 관련 명령어 정리

  • docker-compose build : build 키로 지정된 것들 대상을 build
  • docker-compose pull : docker-hub에서 이미지를 읽어오려고 한다.
  • docker-compose images : docker-compose로 실행된 컨테이너들 대상으로 이미지를 보여준다.
  • docker-compose push : docker-hub로 푸시
  • docker-compose up, down, stop, rm : 실행, 종료, 중지, 삭제
    • docker-compose up : build→ create → start 순서
  • docker-compose ps : 프로세스를 보여준다.
  • docker compose 로 사용해도 된다.
  • 빌드 시 yml파일을 직접 입력하고 싶은 경우 : docker-compose -f compose_file.yml build

docker-compose networking

: docker들끼리 네트워크 연결이 필요한 경우

  • service에 준 이름으로 호스트 이름이 생성된다, 내부에 DNS서버가 생성되어 이름을 내부 IP로 변환해준다.
  • docker network ls

Voting application을 docker-compose로 실행

5개의 컨테이너를 일일히 실행했을 때의 문제점

  • postgres 실행이 정상적으로 동작하지 않았다.

이 문제 해결을 위해 Container 실행 시 2개의 환경변수를 넘겨주어야한다.

  • POSTGRES_USER: “postgres”
  • POSTGRES_PASSWORD: “postgres”
  • docker-compose.yml을 통해 환경설정을 넘겨준다.

docker-compose.yml로 포팅하기

# docker-compose.yml 간단한 버전
services:
	redis:
		image: redis:alpine
	db:
		imgae: postgres:15-alpine
	vote:
		image: ./vote
		ports:
			-5001:80
	result:
		build: ./result  # dockerfile의 위치, build위치.
		ports:
			-5002:80
	worker:
		build: ./worker

실습 수행

  • docker compose -f docker-compose.mac.yml up
  • 결과
  • down : yml을 명시하지않고 down하게되면 network가 유지된다.

: 따라서 다음과 같이 docker-compose -f compose_name.yml down 을 사용한다.

docker-compose.yml 개선하기

networks 정의하기

: networks를 지정하지않으면 호스트 이름으로 하나의 네트웤이 형성된다. 이를 분리해본다.

networks:
	back-tier: (redis,worker,db,vote,result)
	front-tier: (vote,result)
  • frontend도 back에 접근해야하기 때문에 back-tier에 연결해준다.
  • 모든 서비스에 네트워크 키를 설정해준다.
# docker-compose.yml network-upgrade
services:
	redis:
		image: redis:alpine
		netwokrs:
			-back-tier
	db:
		imgae: postgres:15-alpine
		netwokrs:
			-back-tier
	vote:
		image: ./vote
		ports:
			-5001:80
		netwokrs:
			-back-tier
			-front-tier
	result:
		build: ./result  # dockerfile의 위치, build위치.
		ports:
			-5002:80
		netwokrs:
			-back-tier
			-front-tier

	worker:
		build: ./worker
		netwokrs:
			-back-tier

volumes 정의

: db의 내용이 유지되어야하기 때문에 볼륨을 지정해준다.

services:
	...
	db:
		volumes:
		- db-data:/var/lib/postgresql/data
	...

command & entrypoint

  • command : 이미지 Dockerfile의 CMD를 덮어쓴다.
  • entrypoint: 이미지 Dockerfile의 ENTRYPOINT를 덮어쓴다.

healthcheck

: 컨테이너가 정상적으로 동작하는지 체크한다. Dockerfile에서 기술 가능하며, docker-compose에서 덮어쓰기가 가능하다. volumes로 지정해주면 정보 유지가 가능하다.

예제 코드

healthcheck:
	test: ["CMD","curl","-f","http://localhost"]
	interval: 1m30s
	...

depends_on

: 서비스의 의존성 체크. 먼저 실행되어야하는 서비스들을 기술한다.

  • short form
depends_on:
	-db
	-redis
  • long form
depends_on:
	db:
		condition: service_healthy
	redis:
		condition: service_started
  • condition의 종류
    • service_started
    • service_healthy
    • service_completed_successfully: 해당 컨테니어가 성공한 후에 작동

environment

: 컨테이너 안에서 실행될 때 환경변수들을 지정 (ENV)

  • Map 문법
environment:
	RACK_ENV: development
	SHOW: "true"
		USER_INPUT:
  • Array 문법
environment:
	- RACK_ENV: development
	- SHOW: "true"
		- USER_INPUT:

최종 파일 : https://github.com/learndataeng/example-voting-app/blob/main/docker-compose.yml

+ Recent posts