: 다수의 Container가 소프트웨어로 구성되는 경우에 사용가능한 툴과 설정파일 모음
docker-compose —version
으로 버전확인: v2와 v3가 합쳐진 버전 사용 → 1.27 버전 이후 docker 명령으로 compose가 추가되었다.
예시
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 build
: build 키로 지정된 것들 대상을 builddocker-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
로 사용해도 된다.docker-compose -f compose_file.yml build
: docker들끼리 네트워크 연결이 필요한 경우
docker network ls
이 문제 해결을 위해 Container 실행 시 2개의 환경변수를 넘겨주어야한다.
# 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 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
을 사용한다.
: networks를 지정하지않으면 호스트 이름으로 하나의 네트웤이 형성된다. 이를 분리해본다.
networks:
back-tier: (redis,worker,db,vote,result)
front-tier: (vote,result)
# 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
: db의 내용이 유지되어야하기 때문에 볼륨을 지정해준다.
services:
...
db:
volumes:
- db-data:/var/lib/postgresql/data
...
: 컨테이너가 정상적으로 동작하는지 체크한다. Dockerfile에서 기술 가능하며, docker-compose에서 덮어쓰기가 가능하다. volumes로 지정해주면 정보 유지가 가능하다.
예제 코드
healthcheck:
test: ["CMD","curl","-f","http://localhost"]
interval: 1m30s
...
: 서비스의 의존성 체크. 먼저 실행되어야하는 서비스들을 기술한다.
depends_on:
-db
-redis
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
: 컨테이너 안에서 실행될 때 환경변수들을 지정 (ENV)
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
environment:
- RACK_ENV: development
- SHOW: "true"
- USER_INPUT:
최종 파일 : https://github.com/learndataeng/example-voting-app/blob/main/docker-compose.yml
&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-common
: airflow-common이라는 별칭을 상속airflow-init: condition: service_completed_successfully
: airflow-init이 정상동작 후 종료되면 scheduler가 실행된다..git
, logs/
, cache
같은 폴더를 굳이 이미지에 넣지 않아도 된다.