Docker Compose 사용해 보기 (2)
.dockerignore
.dockerignore 개념
- Image build를 할 때 추가하지 말아야할 파일이나 폴더 지정
- voting-application의 경우 .dockerignore의 내용은 아래와 같음
*.pyc
project.lock.json
bin/
obj/
.vs/
node_modules/
.dockerignore 주의할 점
- Dockerfile의 COPY 명령으로 불필요한 파일 혹은 민감한 정보의 파일이 이미지에 포함될 수 있음
- COPY 명령을 파일이나 폴더 별로 일일이 적어주는 것이 좋음
docker-compose로 다수의 Container 실행
docker-compose 개념
- 다수의 Container로 소프트웨어가 구성되는 경우 사용할 수 있는 툴, 환경 설정 파일
- Container를 따로 관리하는 것보다 생산성이 훨씬 높음
- Docker Desktop의 일부로 설치됨
- 환경 설정 파일 : docker-compose.yml / yaml
- 명령어 : 소프트웨어를 구성하는 모든 Container에게 적용
- docker-compose build
- docker-compose up
- docker-compose pull
- docker-compose ps
- docker-compose down
- docker-compose start
- docker-compose stop
- docker-compose rm
docker-compose.yml 작성
- services : 프로그램을 구성하는 서비스 지정
- 각 서비스는 별개의 Docker Image 지정과 Docker Container 실행으로 구성
- 각 서비스는 자신의 Dockerfile을 지님
- 서비스 별로 포트 번호, 환경 변수, 디스크 볼륨을 지정해야 함
- 서비스 이름은 아무 이름이나 가능
- volumes : docker volume 지정
- networks : network 지정
docker-compose로 이미지 생성과 관리
- docker-compose build : build 키로 지정된 것을 대상으로 함 (image X)
- docker-compose pull : image로 지정된 것을 대상으로 함 (bulid X)
- docker images : 각 개별 이미지 앞에 폴더 이름을 prefix로 붙임 (hub에서 읽어온 것은 제외)
- docker-compose images : Container에 의해 실행되고 있는 이미지만 보여줌
- docker-compose push : docker hub로 이미지를 푸시
docker-compose로 소프트웨어 시작과 중단
- docker-compose up : 컨테이너 build -> create -> start
- docker-compose down : 컨테이너 stop -> rm
- docker-compose stop : 컨테이너 중단
- docker-compose rm : stop 상태인 컨테이너 삭제
- docker-compose ls : docker-compose를 그룹 별로 보여줌
- docker-compose ps : docker-compose를 통해 실행된 컨테이너의 상태를 개별적으로 보여줌
docker-compose 네트워킹
- 별도의 network를 설정하지 않아도 docker-compose로 실행된 서비스는 자동으로 연결
- docker끼리 네트워크 연결이 필요한 경우 사용
- services에 준 이름으로 호스트 이름이 생성
- 내부에 DNS 서버가 하나 생성되어 이름을 내부 IP로 변환
- 별도의 네트워크로 구성하고 싶다면 networks에 네트워크를 나열하고 적절하게 지정
- docker network ls : docker 네트워크 상태를 보여줌
앞서 5개의 Container를 일일이 실행했을 때의 문제점
- Postgres를 실행하는 부분이 제대로 동작하지 않음
- 투표는 진행되지만 결과가 반영되지 않음
- 이 문제를 해결하기 위해 두 개의 환경 변수를 넘겨줘야 함
- POSTGRES_USER : "postgres"
- POSTGRES_PASSWORD : "postgres"
- worker/Program.cs
// worker/Program.cs
var pgsql = OpenDbConnection("Server=db;Username=postgres;Password=postgres;");
var redisConn = OpenRedisConnection("redis");
- 이전에 postgres를 실행했던 코드 : 계정 정보가 옳지 않음 -> 인증 실패
docker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgres
docker-compose 실습
- git clone
git clone https://github.com/learndataeng/example-voting-app/tree/main
- build
docker-compose -f docker-compose.mac.yml build
- pull
docker-compose -f docker-compose.mac.yml pull
- up
docker-compose up
- 페이지 접속 (localhost:5001, localhost:5002)
- db (postgres) 접속
docker exec -it --user=postgres example-voting-app-db-1 sh
sh > psql
postgres > \dt # 존재하는 테이블 확인
postgres > SELECT * FROM votes;
- down : 이미지는 삭제 X
docker-compose -f docker-compose.mac.yml down
docker-compose.yml 개선
Networks 정의
- 각 서비스에 네트워크를 지정
- back-tier : redis, worker, db, vote, result
- front-tier : vote, result
networks:
back-tier:
front-tiet:
Volumes 정의
- postgreSQL에 데이터가 저장돼야 함
volumes:
db-data:
docker-compose.yml - vote 서비스 개선
- command, entrypoint : Image Dockerfile의 CMD / ENTRYPOINT를 덮어쓰기 가능
- healthcheck : Dockerfile에서 기술가능한 기능이며 docker-compose에서 덮어쓰기 가능
- depends_on : 해당 서비스가 실행되기 위해 먼저 실행돼야 하는 서비스 기술
vote:
build: ./vote
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:
- "5001:80"
networks:
- front-tier
- back-tier
docker-compose.yml - db 서비스 개선
- environment : 해당 서비스가 컨테이너 안에서 실행될 때 환경변수 지정 (Dockerfile의 ENV)
- Map 문법 / Array 문법
# Map 문법
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
# Array 문법
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT
db:
image: postgres:15-alpine
environment: # map 문법 사용
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
volumes:
- "db-data:/var/lib/postgresql/data" # host volume
- "./healthchecks:/healthchecks" # named volume
healthcheck:
test: /healthchecks/postgres.sh
interval: "5s"
networks:
- back-tier
docker-compose.yml - redis 서비스 개선
- volume, healthcheck 설정
redis:
image: redis:alpine
volumes:
- "./healthchecks:/healthchecks"
healthcheck:
test: /healthchecks/redis.sh
interval: "5s"
networks:
- back-tier
docker-compose.yml - worker 서비스 개선
- build 방식 개선
- 바로 위치를 지정해주는 것이 아닌 context 지정
- 이 방식을 쓰는 경우 더 많은 빌드 관련 정보를 넘겨줄 수 있음
- context, dockerfile, args
worker:
build:
context: ./worker
depends_on:
redis:
condition: service_healthy
db:
condition: service_healthy
networks:
- back-tier
docker-compost.yml - result 서비스 개선
- entrypoint를 새로운 명령으로 오버라이드
result:
build: ./result
entrypoint: nodemon server.js
depends_on:
db:
condition: service_healthy
volumes:
- ./result:/app
ports:
- "5002:80"
- "5858:5858"
networks:
- front-tier
- back-tier
'[프로그래머스] 데이터 엔지니어링 데브코스 3기 > TIL(Today I Learn)' 카테고리의 다른 글
[TIL - 52일 차] Airflow 고급기능과 DBT, 데이터 디스커버리 (2) (0) | 2024.06.04 |
---|---|
[TIL - 51일 차] Airflow 고급기능과 DBT, 데이터 디스커버리 (1) (0) | 2024.06.03 |
[TIL - 49일 차] Docker & K8S 실습 (5) (0) | 2024.05.30 |
[TIL - 48일 차] Docker & K8S 실습 (3) (0) | 2024.05.29 |
[TIL - 47일 차] Docker & K8S 실습 (2) (0) | 2024.05.28 |