CodeGym /행동 /Docker SELF /docker-compose.yml 생성하기

docker-compose.yml 생성하기

Docker SELF
레벨 15 , 레슨 2
사용 가능

3.1 파일 compose.yaml

파일 compose.yaml (또는 다음과 같은 다른 옵션들: docker-compose.yaml, docker-compose.yml, compose.yml) — 이건 Docker Compose에서 멀티컨테이너 어플리케이션을 정의하고 관리하기 위해 사용하는 주요 설정 파일이야. 이 파일은 어떤 컨테이너들(서비스들)을 실행해야 하는지, 서로 어떻게 상호작용하는지, 그리고 어떤 자원이 필요한지 설명하고 있어.

강의에서는 일관성을 위해 compose.yaml 형식을 사용할 건데, 이게 최신 Docker Compose 버전에서 추천되고 있어.

compose.yaml 파일의 구조

compose.yaml 파일은 여러 섹션으로 나뉘어져 있는데, 각각 어플리케이션 설정의 다양한 측면을 설명하고 있어. 주요 섹션에는 다음이 포함돼:

  1. version: Compose 파일의 버전을 지정 (예시: '3.9').
  2. services: 컨테이너(서비스), 그 설정과 종속 관계를 설명.
  3. volumes: 컨테이너와 호스트 간의 데이터 저장을 위한 볼륨 정의.
  4. networks: 서비스들이 서로 통신할 네트워크를 설정.

3.2 주요 지시어들

1. version

version 지시어는 compose.yaml 파일에서 사용된 Docker Compose 문법의 버전을 정의해. 이 글을 작성할 당시에는 버전 3이 가장 최신이고, 특히 3.8이랑 3.9 같은 업데이트가 있어.

Yaml

version: '3.9'

2. services

services 섹션은 Compose가 생성하고 실행해야 하는 컨테이너들을 정의해. 각각의 서비스는 특정 설정을 가진 개별 컨테이너를 나타내.

예시:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

이 예시에서는 두 개의 서비스가 정의되어 있어: web이랑 db. web 서비스는 nginx:latest 이미지를 사용하고, 포트 80을 열어. db 서비스는 mongo:latest 이미지를 사용하고, 데이터 저장을 위한 볼륨을 연결해.

3. volumes

volumes 섹션은 데이터를 저장하기 위해 컨테이너에 연결될 수 있는 볼륨을 정의하는 데 사용돼. 이건 컨테이너를 다시 시작할 때 데이터를 유지하는 데 유용해.

예시:

Yaml

volumes:
  mongo-data:

4. networks

networks 섹션은 컨테이너가 작동할 커스텀 네트워크를 정의할 수 있어. 이건 격리랑 네트워크 연결 설정을 가능하게 해. 만약 네트워크가 지정되지 않으면, Docker Compose는 기본 네트워크를 생성하고, 모든 서비스가 거기에 연결돼.

예시:

Yaml

networks:
  front-end:
  back-end:

3.3 서비스 설정을 위한 디렉티브

서비스 설정을 위한 주요 디렉티브:

1. image

image 디렉티브는 컨테이너를 생성하는 데 사용되는 이미지를 지정해 줘.

예제:

Yaml

services:
  web:
    image: nginx:latest

2. build

build 디렉티브는 이미지를 빌드하는데 사용되는 Dockerfile의 경로를 지정하는 데 사용돼.

예제:

Yaml

services:
  app:
    build: ./app

3. ports

ports 디렉티브는 호스트 머신에서 컨테이너로 열리고 전달될 포트를 정의해 줘.

예제:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

4. volumes

volumes 디렉티브는 볼륨을 컨테이너에 마운트해서 컨테이너를 재시작해도 데이터를 유지할 수 있게 해줘.

예제:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

environment 디렉티브는 컨테이너의 환경 변수를 설정할 수 있어.

예제:

Yaml

services:
  app:
    image: myapp:latest
    environment:
      - NODE_ENV=production
      - API_KEY=1234567890

6. depends_on

depends_on 디렉티브는 특정 서비스가 다른 서비스에 의존하며, 그 서비스가 실행된 후에 실행되어야 한다는 것을 알려줘.

중요! 당신의 서비스를 실행할 때, 모든 필요한 서비스가 완전히 준비되었다는 100% 보장은 없어. 그들은 실행되겠지만, 이후 올바르게 작동하는지에 대한 보장은 없어. 이 문제는 health-check로 해결되지만, 이건 나중에 살펴보기로 하자.

예제:

Yaml

services:
  web:
    image: nginx:latest
    depends_on:
      - db
  db:
    image: mongo:latest

7. command

command 디렉티브는 컨테이너가 시작될 때 실행될 명령을 재정의할 수 있어.

예제:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

networks 디렉티브는 서비스를 하나 이상의 네트워크에 연결해 줘.

예제:

Yaml

services:
  web:
    image: nginx:latest
    networks:
      - front-end
  db:
    image: mongo:latest
    networks:
      - back-end

3.4 전체 예제

전체 파일 compose.yaml의 예제

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - front-end
        
  app:
    build: ./app
    volumes:
      - ./app:/usr/src/app
    environment:
      - NODE_ENV=production
    networks:
      - front-end
      - back-end
        
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - back-end
        
volumes:
  mongo-data:
        
networks:
  front-end:
  back-end:

이 예제에서:

  • 세 가지 서비스가 정의됨: web, app, db.
  • web은 Nginx 이미지를 사용하고, 설정 파일을 마운트하며, app 서비스에 종속됨.
  • app은 로컬 Dockerfile에서 빌드되고, 애플리케이션 소스 코드를 마운트하며 환경 변수를 사용함.
  • db는 MongoDB 이미지를 사용하며 데이터를 저장하기 위한 볼륨을 마운트함.
  • 서비스 간 상호작용을 격리하고 관리하기 위해 두 개의 볼륨과 두 개의 네트워크가 생성됨.

참고: 하나의 볼륨은 mongo-data이고, 다른 하나는 호스트 머신의 디렉토리가 마운트된 것(예: ./app)임.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION