개발 기록장

04. Docker Compose 본문

데브코스(DE)/Docker & K8S

04. Docker Compose

jxwxnk 2024. 5. 30. 23:00
반응형

학습 주제: 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

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