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
실습 수행
- git clone : https://github.com/learndataeng/example-voting-app
- 이미지 생성
- docker compose -f docker-compose.mac.yml build
- docker-compose -f docker-compose.mac.yml pull (redis,postgres때문에 수행)
- 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
'Infra & Container > Docker' 카테고리의 다른 글
Docker - 간단한 docker compose 만들어보기(zoomcamp) (0) | 2024.03.21 |
---|---|
Docker - 명령어 정리 & Volume (0) | 2024.03.21 |
Docker - Postgres > Data Ingestion (0) | 2024.03.21 |
Docker - Postgres > pgadmin (0) | 2024.03.20 |
Docker - Postgres (0) | 2024.03.20 |