일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- yarn
- snowflake
- docker
- Serializer
- AWS
- Hive
- 데이터마트
- airflow.cfg
- 웹 크롤링
- spark
- 알고리즘
- Django Rest Framework(DRF)
- dag
- 데이터레이크
- selenium
- redshift
- Django
- 데이터파이프라인
- 웹 스크래핑
- dag 작성
- ETL
- Kafka
- docker-compose
- docker hub
- 데이터 웨어하우스
- SQL
- 컨테이너 삭제
- truncate
- airflow
- ELT
Archives
- Today
- Total
개발 기록장
04. Docker Compose 본문
반응형
학습 주제: Docker Compose
Docker-Compose로 다수 Container로 실행해보기
Docker-Compose란?
- 다수의 Container로 소프트웨어가 구성되는 경우 사용할 수 있는 툴 + 환경설정 파일
- docker-compose.yml로 설정
- 여기서 다양한 테스트도 수행가능
- 다양한 버전을 만드는 것도 일반적(dev,test, prod 등)
- 개별 Container를 따로 관리하는 것보다 훨씬 더 생산성이 높음
- 환경설정 파일의 이름은 docker-compose.yml이나 docker-compose.yaml
- 사용법이 간단함: 소프트웨어를 구성하는 모든 컨테이너에게 적용됨
- Docker Desktop의 일부로 설치 됨
- Docker Engine을 실행하고 테이블에서 버전 확인
- 만약 docker-compose가 없다고 나오면 docker-compose 부터 실행
- Docker Compose v.1.27 + 부터 v2와 v3가 합쳐짐
- docker-compose 버전 확인: docker-compose --version
Docker-Compose 작성
- services: 다음으로 프로그램을 구성하는 서비스들을 지정
- 각 서비스는 별개의 Docker Image 지정과 Docker Container 실행으로 구성
- 즉, 각 서비스는 자신의 Dockerfile을 갖고 있어야 함. 아니면 docker hub등에서 이미지 다운로드
- 서비스별로 포트번호, 환경변수, 디스크 볼륨 등을 지정해야 함
- 서비스 이름은 아무 이름이나 가능
- volumes: docker volume들을 지정
- networks: network들을 지정
- network은 지정하지 않으면 같은 docker-compose 그룹 내에서는 모두 연결됨
- "default"라는 이름으로 기본 네트워크가 만들어짐
기억할 것
docker-compose vs. docker compose
- v1: docker-compose
- v2: docker compose
- Docker 1.27부터 docker 명령으로 compose가 추가됨
- docker-compose 보다는 "docker compose" 를 쓰는 것이 더 좋음
- 별도로 docker-compose를 설치할 필요 없음. 하지만 아직까지 대부분의 문서가 docker-compose 중심으로 작성되어 있음
docker-compose.yaml/ docker-compose.yml
- docker compose 명령의 위 둘 중의 하나를 찾음
- 만약 두 개 다 존재한다면 에러 발생
- 다른 이름의 파일을 사용하고자 한다면 -f 옵션 사용
- 뒤의 이름 사용: docker-compose -f docker-compose.mac.yml up
- 다른 이름의 파일을 사용하고자 한다면 -f 옵션 사용
- 만약 두 개 다 존재한다면 에러 발생
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로 이미지 생성과 관리
- docker-compose build: build 키로 지정된 것들 대상
- docker-compose pull: docker hub에서 이미지들을 읽어옴
- docker images: 이미지 리스트, 각 개별 이미지 앞에 폴더 이름을 prefix로 붙임(docker hub에서 읽어온 것 제외)
- docker-compose images: 컨테이너에 의해 실행되고 있는 이미지들만 보여줌(docker-compose)
- docker-compose push: docker hub으로 이미지를 push 함
- docker-compose up: build -> create -> start 한번에
- docker-compose create: 컨테이너 생성
- docker-compose start: 컨테이너 시작
- docker-compose down: 컨테이너 중지와 삭제 한번에
- docker-compose stop: 컨테이너 중지
- docker-compose rm: 컨테이너 삭제
- docker-compose ls: docker-compose를 그룹별로 보여줌
docker-compose 네트워킹
- docker끼리 네트워크 연결이 필요한 경우
- services에 준 이름으로 호스트 이름이 생성됨
- 내부에 DNS 서버가 하나 생성되어 이름을 내부 IP로 변환해 줌
- 별도로 네트워크를 구성하고 싶다면
- network에 네트워크를 나열하고 네트워크를 적절하게 서비스에 지정해줘야 함
- docker network ls: 네트워크 목록
docker-compose로 실행: voting application
5개의 Container를 따로 실행했을 때의 문제점
- Postgres를 실행하는 부분이 제대로 동작하지 않음
- docker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgres
- 이 문제를 해결하려면 Container를 실행할 때 2개의 환경변수를 넘겨줘야 함
- POSTGRES_USER: "postgres"
- POSTGRES_PASSWORD: "postgres"
- docker-compose 환경 설정 파일을 통해 해결
docker-compose.yml로 포팅
services 정의
redis:
image: redis:alpine
db:
image: postgres:15-alpine
vote:
build: ./vote
ports:
- 5001:80
result:
build: ./result
ports:
- 5002:80
worker:
build: ./worker
networks 정의: 2개로 나누기(back-tier/front-tier)
- back-tier: redis, worker, db, vote, result
- front-tier: vote, result
프론트 단 컨테이너는 데이터 저장을 위해 데이터를 백엔드 단으로 전달해야 하므로 back/front 모두 접근 가능해야 함
- services들에 네트워크 지정
services:
redis:
...
networks:
- back-tier
db:
...
networks:
- back-tier
vote:
...
networks:
- back-tier
- front-tier
result:
...
networks:
- back-tier
- front-tier
worker:
...
networks:
- back-tier
volumes 정의
- 어느 컨테이너 서비스의 데이터가 영구 저장되어야 하는가
- PostgreSQL
- volumes: db-data; db의 내용이 persistant 해야 함
services:
redis:
db:
volumes:
- db-data:/var/lib/postgresql/data
vote:
result:
worker:
volumes:
db-data:
vote 서비스 개선
- command: 이미지 Dockerfile의 CMD를 덮어쓰는데 사용
- entrypoint: 이미지 Dockerfile의 ENTRYPOINT를 덮어쓰는데 사용
- healthcheck: Dockerfile에 작성 가능한 내용으로 docker-compose에서 덮어쓰기 가능
- depends_on: 해당 서비스가 실행되기 위해 먼저 실행되어야 하는 서비스들을 작성
기타
.dockerignore란?
- Image build할 때 추가하지 말아야할 파일들이나 폴더들 지정
- 앞서 살펴보았던 voting-application의 경우 .dockerignore의 내용은 아래와 같음
*.pyc
project.lock.json
bin/
obj/
.vs/
node_modules/
- 이외에 고려해야할 내용
.git
.cache
logs/
*.md
**/*.class
- Dockerfile에서 COPY 명령
- 실수로 불필요한 파일/민감한 정보가 들어있는 파일들이 이미지로 들어가는 것을 막기 위해서는 COPY 명령을 처음 또는 파일/폴더 별로 일일이 적어주는 것이 좋음. 동시에 .dockerignore 내용 보강
FROM ...
# Copy our code from the current folder to /app inside the container
COPY . .
- .dockerignore와 비슷한 파일들
- .gitignore
- .npmignore
- .eslintignore
- .hgignore
반응형
'데브코스(DE) > Docker & K8S' 카테고리의 다른 글
05. Kubernetes(K8s) (0) | 2024.05.31 |
---|---|
03. Docker Volume과 다수 컨테이너 SW 다루기 (0) | 2024.05.29 |
02. Docker에서 웹 서비스 실행 (0) | 2024.05.28 |
01. Docker (0) | 2024.05.28 |