본문 바로가기

가상 머신/Docker

[ VM / Docker ] docker-compose.yml 작성하기

반응형

docker-compose는 여러 Docker 컨테이너를 정의하고 동시에 관리할 수 있는 도구입니다. 이를 위해 docker-compose.yml 파일을 사용하며, 여기에는 다양한 서비스와 그 설정을 정의할 수 있습니다. docker-compose.yml 파일의 주요 옵션에 대해 설명드리겠습니다.

docker-compose.yml 파일의 주요 옵션

  1. version
    • 설명: Compose 파일의 버전을 지정합니다. 다양한 기능을 지원하는 버전이 있으므로 최신 기능을 사용하려면 최신 버전을 선택하는 것이 좋습니다.
    • 예시:
      version: '3.8'
  2. services
    • 설명: 이 섹션은 여러 Docker 컨테이너(서비스)를 정의합니다. 각 서비스는 별도의 컨테이너로 실행됩니다.
    • 예시:
      services:
        web:
          image: nginx
        db:
          image: mysql
  3. image
    • 설명: 사용할 Docker 이미지를 지정합니다. docker pull 명령어로 다운로드할 수 있는 이미지 이름을 명시합니다.
    • 예시:
      services:
        web:
          image: nginx:latest
  4. build
    • 설명: 이미지 빌드 지침을 지정합니다. Dockerfile이 위치한 디렉토리 경로를 설정하거나 추가적인 빌드 옵션을 설정할 수 있습니다.
    • 예시:
      services:
        web:
          build: ./web
  5. command
    • 설명: 컨테이너가 시작될 때 실행할 명령을 지정합니다.
    • 예시:
      services:
        web:
          image: nginx
          command: ["nginx", "-g", "daemon off;"]
  6. ports
    • 설명: 호스트와 컨테이너 간의 포트 매핑을 정의합니다. 형식은 호스트:컨테이너입니다.
    • 예시:
      services:
        web:
          image: nginx
          ports:
            - "8080:80"
  7. volumes
    • 설명: 호스트와 컨테이너 간의 볼륨을 정의합니다. 형식은 호스트:컨테이너입니다.
    • 예시:
      services:
        web:
          image: nginx
          volumes:
            - "./data:/var/www/html"
  8. environment
    • 설명: 환경 변수를 설정합니다. 각 변수를 키-값 쌍으로 지정할 수 있습니다.
    • 예시:
      services:
        web:
          image: nginx
          environment:
            - NGINX_HOST=localhost
            - NGINX_PORT=80
  9. env_file
    • 설명: 환경 변수를 정의하는 파일을 지정합니다. 여러 파일을 지정할 수도 있습니다.
    • 예시:
      services:
        web:
          image: nginx
          env_file:
            - ./.env
  10. depends_on
    • 설명: 다른 서비스에 대한 의존성을 지정합니다. 특정 서비스가 시작되기 전에 의존 서비스가 시작되도록 합니다.
    • 예시:
      services:
        web:
          image: nginx
          depends_on:
            - db
        db:
          image: mysql
  11. networks
    • 설명: 서비스가 연결될 네트워크를 정의합니다. Docker Compose는 기본적으로 default 네트워크를 사용하지만, 사용자 정의 네트워크를 만들 수 있습니다.
    • 예시:
      version: '3.8'
      services:
        web:
          image: nginx
          networks:
            - frontend
        db:
          image: mysql
          networks:
            - backend
      networks:
        frontend:
        backend:
  12. restart
    • 설명: 컨테이너가 종료된 후 재시작 정책을 지정합니다. no, always, on-failure, unless-stopped 등의 값을 사용할 수 있습니다.
    • 예시:
      services:
        web:
          image: nginx
          restart: always
  13. links
    • 설명: 다른 서비스와 연결을 설정합니다. links는 컨테이너 간의 네트워크 연결을 설정하며, DNS 이름 해결을 제공합니다.
    • 예시:
      services:
        web:
          image: nginx
          links:
            - db
        db:
          image: mysql
  14. healthcheck
    • 설명: 컨테이너의 상태를 검사하는 명령어를 지정합니다.
    • 예시:
      services:
        web:
          image: nginx
          healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost"]
            interval: 1m30s
            timeout: 10s
            retries: 3
  15. labels
    • 설명: 컨테이너에 메타데이터를 추가합니다.
    • 예시:
      services:
        web:
          image: nginx
          labels:
            com.example.description: "Web service"
  16. extra_hosts
    • 설명: 컨테이너의 /etc/hosts 파일에 추가할 호스트네임-IP 쌍을 지정합니다.
    • 예시:
      services:
        web:
          image: nginx
          extra_hosts:
            - "host.docker.internal:host-gateway"
  17. cap_add / cap_drop
    • 설명: 특정 Linux 기능을 컨테이너에 추가하거나 제거합니다.
    • 예시:
      services:
        web:
          image: nginx
          cap_add:
            - NET_ADMIN
          cap_drop:
            - CHOWN
  18. sysctls
    • 설명: 컨테이너 내의 커널 파라미터를 설정합니다.
    • 예시:
      services:
        web:
          image: nginx
          sysctls:
            net.core.somaxconn: 1024
  19. secrets
    • 설명: 민감한 정보를 안전하게 관리할 수 있는 비밀 파일을 정의합니다.
    • 예시:
      version: '3.8'
      services:
        web:
          image: nginx
          secrets:
            - my_secret
      secrets:
        my_secret:
          file: ./secret_file.txt

docker-compose.yml 작성 팁

  • 명확한 서비스 정의: 각 서비스는 독립적이지만 필요에 따라 상호 의존 관계를 가질 수 있습니다. 명확하게 정의하여 필요한 경우에만 상호 의존성을 갖도록 합니다.
  • 환경 변수 관리: 환경 변수를 사용하여 컨테이너의 동작을 제어하고, env_file을 활용하여 관리할 수 있습니다.
  • 네트워크 및 볼륨 사용: 서비스를 분리하고 상태를 유지하기 위해 네트워크와 볼륨을 적절히 활용합니다.
  • 적절한 재시작 정책: 각 서비스에 대해 적절한 재시작 정책을 설정하여 서비스가 예기치 않게 중단되는 경우 자동으로 복구할 수 있도록 합니다.

이러한 옵션들을 활용하면 복잡한 Docker 환경을 쉽게 설정하고 관리할 수 있습니다.

반응형