- image build 시 추가하지 말아야 할 파일들이나 폴더들 지정
- 앞선 다수의 컨테이너인 voting-application인 경우
*.pyc, project.lock.json, bin/, obj/, .vs/, node_modules/
- 이외 고려사항
.git, .cache, logs/, *.md, **/*.class
- dockerfile에서 COPY명령으로 불필요한 파일, 정보들이 이미지로 빌드되는 걸 막기위해 COPY명령으로 폴더별 일일이 작성하는 것도 좋은 해결 방법. (dockerignore 내용 보강)
추가로 타 플랫폼의 관련 예시로는 .gitignore, .npmignore, .eslintignore, .hgignore 등이 존재
다수의 container로 SW가 구성되는 경우 사용할 수 있는 Tool + 환경설정 파일.
-> 개별 관리보다 훨씬 생산성이 높음.
-> 환경설정 파일명은 docker-compose.yaml or .yml
-> 단 복잡도 상승하는 문제 (커맨드 수, 관리 등등)yaml파일은 3개의 section으로 구성된다.
- services : 프로그램 구성하는 서비스 지정 (각 서비스는 별개의 image, container실행), 각 서비스는 개별 dockerfile 가지거나 docker hub에서 이미지 다운로드되며 서비스 별 포트번호, 환경변수, 디스크 볼륨 등 지정 필요
- volumes : 앞서 학습한 volumes (데이터 저장)
- networks : 앞서 학습한 network
아래 코드는 docker-compose.yml 작성예시이다.
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 command
image 빌드 생성 및 관리
docker-compose build : build 키로 지정된 것들 대상
docker-compose pull : hub에서 이미지 읽어옴
docker images : 각 개별 이미지 앞에 폴더이름을 prefix로 생성 (hub에서 읽은 것 제외)
docker-compose images : 컨테이너에 의해 실행되고 있는 이미지들 보여줌
docker-compose push : hub로 이미지 푸시
docker-compose up : #build->create->startpostgres 실행 시 아래 2개의 환경변수를 넘겨주어야 함
- POSTGRES_USER: 'postgres'
- POSTGRES_PASSWORD: 'postgres'
docker-compose.yaml로 voting-application 작성
# v2 and v3 are now combined!
# docker-compose v1.27+ required
# % docker-compose version
# Docker Compose version v2.15.1
services:
vote:
build: ./vote
# use python rather than gunicorn for local dev
command: python app.py
ports:
- "5001:80"
result:
build: ./result
# use nodemon rather than node for local dev
entrypoint: nodemon server.js
ports:
- "5002:80"
worker:
build: ./worker
redis:
image: redis:alpine
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
# 데이터 저장 volumes 추가
volues:
- db-data:/var/lib/postgrsql/data
# 각 서비스 별 네트워크 지정해 보안 높이기
networks:
back-tier: (redis, worker, db, vote, result)
front-tier: (vote, result)
# 컨테이너 서비스의 데이터가 계속 persistent되도록 지정
volumes:
db-data:
# version is now using "compose spec"
# v2 and v3 are now combined!
# docker-compose v1.27+ required
services:
vote:
build: ./vote
# use python rather than gunicorn for local dev
command: python app.py
# 먼저 실행되어야 하는 요소 (서비스)
depends_on:
redis:
condition: service_healthy
# 해당 서비스의 건강 체크
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 15s
timeout: 5s
retries: 3
start_period: 10s
volumes:
- ./vote:/app
ports:
- "5000:80"
networks:
- front-tier
- back-tier
result:
build: ./result
# use nodemon rather than node for local dev
# 진입점 기록
entrypoint: nodemon server.js
depends_on:
db:
condition: service_healthy
volumes:
- ./result:/app
ports:
- "5001:80"
- "5858:5858"
networks:
- front-tier
- back-tier
worker:
# 더 많은 빌드관련 정보 넘겨주기 가능
build:
context: ./worker
depends_on:
redis:
condition: service_healthy
db:
condition: service_healthy
networks:
- back-tier
redis:
image: redis:alpine
volumes:
- "./healthchecks:/healthchecks"
healthcheck:
test: /healthchecks/redis.sh
interval: "5s"
networks:
- back-tier
db:
image: postgres:15-alpine
# postgres DB 환경 설정
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
# Host volume과 named volume 사용
volumes:
- "db-data:/var/lib/postgresql/data"
- "./healthchecks:/healthchecks"
healthcheck:
test: /healthchecks/postgres.sh
interval: "5s"
networks:
- back-tier
# this service runs once to seed the database with votes
# it won't run unless you specify the "seed" profile
# docker compose --profile seed up -d
seed:
build: ./seed-data
profiles: ["seed"]
depends_on:
vote:
condition: service_healthy
networks:
- front-tier
restart: "no"
volumes:
db-data:
networks:
front-tier:
back-tier: