데브코스 49일차 - Docker Compose (2)

Pori·2023년 12월 21일
0

데엔

목록 보기
42/47

Docker Compose 사용해보기 (2)

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

Airflow Docker의 docker-compose.yml 리뷰

  • version : 버전 명시, 지금은 통합되어 기술하지 않아도 된다.
  • x-airlow-common
    • airflow-common이라는 별칭을 정의한다.
    • 여러 서비스에서 공유하는 공통 구성을 말함
    • anchor라 부르면서 yml을 계승이라는 형태로 재사용하게 해준다.
    • version,services,volumes,networks를 제외한 최상위 레벨 키워드는 anchor이다.
  • services
  • volumes
  • networks : 없기 떄문에 모든 컨테이너들이 하나의 네트웤에 묶여있음을 의미한다.

x-airflow-common

  • &airflow-common : 별칭 정의
  • image: $(AIRFLOW_IMAGE_NAME:-apache/airflow:2.5.1) : 같은 airflow이미지가 기본 이미지로 사용된다.
  • environment : 환경 정의 &airflow-common-env 를 통해서 별칭을 정의한다.
  • depends_on redis와 postgres가 정상동작할 때까지 대기한다.
  • volumes: airflow와 관계된 볼륨을 공유
    • ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
  • _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-} : pip 모듈 설치가 필요한 경우에 작성

airflow-scheduler 서비스 보기

  • <<: *airflow-common : airflow-common이라는 별칭을 상속
  • airflow-init: condition: service_completed_successfully : airflow-init이 정상동작 후 종료되면 scheduler가 실행된다.

Dockerignore

  • Image build할 때 추가하지 않을 파일이나, 폴더를 지정한다.
  • .git, logs/ , cache 같은 폴더를 굳이 이미지에 넣지 않아도 된다.
  • COPY 명령 시에 디테일하게 적어주면서 같이 사용하면 좋다.

Mac port 5000 error

  • MacOS Monterey에서는 시스템에서 해당 포트를 사용중이기 때문에 5001번등 다른 포트를 사용하는 것이 좋다.

0개의 댓글