Skip to main content

Docker Compose

NOTE: 新版指令改成 docker compose

NOTE: 服務一旦佈署完成,docker-compose.yml 的路徑如果有變更,就不能繼續使用指令 docker-compose 來管理 container,不過已經啟動的服務運行不會影響,但關閉後就無法再被啟動。

新增與啟動所有應用服務

# For all services
docker-compose up -d

# For specified service
docker-compose up -d <service-name>

Build the image of the service

docker-compose build <service-name>
docker-compose up --rebuild <service-name>

目前的應用服務狀態

docker-compose ps

重啟所有應用服務但不要刪除所屬 container

docker-compose stop
docker-compose start 

如果 container 屬性沒有異動,只是所屬的服務需要重啟載入新設定,可以使用這。

停止所有應用服務並刪除所屬 container

# For all services
docker-compose down

# For a specified service
docker-compose stop <service-name>
docker-compose rm -f <service-name>

NOTE:

- 如果有修改 docker-compose.yml,必須使用 down 關閉服務後,用 up -d 重新啟動。

- 停止服務後,重新啟動只能使用 docker-compose up -d

檢視服務啟動失敗的日誌

docker-compose logs

執行某個應用服務的特定程序

docker-compose exec <service-name> sh -c "pwd"

環境變數檔 --env-file

docker compose --env-file .env up -d

Labels

    用途:如果要管理上百個 continers 時,標籤功能可用客製標籤來標記 container,以便日常管理維護。 用法:--label my-label=my-value  技巧:標籤的命名方式建議使用 com.myorg.XX 的格式,myorg 替換成組織的代名。

    docker-compose.yml

    services:
      web:
        image: myorg/web:2.3.1
        labels:
          com.myorg.project: payment-api
          com.myorg.environment: production
          com.myorg.team: billing
          com.myorg.service-type: backend
          com.myorg.version: 2.3.1
      redis:
        image: redis:6.2
        labels:
          com.myorg.project: payment-api
          com.myorg.environment: production
          com.myorg.team: billing
          com.myorg.service-type: cache
          com.myorg.version: "6.2"

    使用 --filter 來過濾

    docker ps --filter "label=com.myorg.project=payment-api"
    docker inspect --format='{{json .Config.Labels}}' $(docker ps -q)

     

    docker-compose.yml

    .env

    敏感性的資料如密碼、API Token,建議使用 .env 檔案來儲存。

    .env

    MYSQL_ROOT_PASSWORD=supersecurepassword
    MYSQL_DATABASE=appdb
    MYSQL_USER=appuser
    MYSQL_PASSWORD=anothersecurepassword

    docker-compose.yml

    version: "3.9"
    services:
      mysql:
        image: mysql:8
        environment:
          MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
          MYSQL_DATABASE: ${MYSQL_DATABASE}
          MYSQL_USER: ${MYSQL_USER}
          MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    environment + healthcheck
    services:
      db:
        image: pgvector/pgvector:0.6.2-pg15
        restart: always
        ports:
          - '5432:5432'
        environment:
          POSTGRES_USER: talkdai
          POSTGRES_PASSWORD: talkdai
          POSTGRES_DB: talkdai
        volumes:
           - ./etc/db-extensions.sql:/docker-entrypoint-initdb.d/db-extensions.sql
        healthcheck:
          test: ["CMD", "pg_isready", "-d", "talkdai", "-U", "talkdai"]
          interval: 10s
          timeout: 5s
          retries: 5
      dialog:
        image: ghcr.io/talkdai/dialog:latest
        volumes:
          - ./data/:/app/data/
        ports:
          - '8000:8000'
        depends_on:
          db:
            condition: service_healthy
        environment:
          - PORT=8000
          - DATABASE_URL=postgresql://talkdai:talkdai@db:5432/talkdai
          - OPENAI_API_KEY=sk-your-openai-api-key
          - STATIC_FILE_LOCATION=/app/static
          - DIALOG_DATA_PATH=../data/your.csv
          - PROJECT_CONFIG=../data/your.toml
    healthcheck(web) + build + networks
    networks:
      net:
        driver: bridge
    
    services:
      server:
        image: server
        build:
          context: .
          dockerfile: Dockerfile
        volumes:
          # Be aware that indexed data are located in "/chroma/chroma/"
          # Default configuration for persist_directory in chromadb/config.py
          # Read more about deployments: https://docs.trychroma.com/deployment
          - chroma-data:/chroma/chroma
        command: "--workers 1 --host 0.0.0.0 --port 8000 --proxy-headers --log-config chromadb/log_config.yml --timeout-keep-alive 30"
        environment:
          - IS_PERSISTENT=TRUE
          - CHROMA_SERVER_AUTHN_PROVIDER=${CHROMA_SERVER_AUTHN_PROVIDER}
          - CHROMA_SERVER_AUTHN_CREDENTIALS_FILE=${CHROMA_SERVER_AUTHN_CREDENTIALS_FILE}
          - CHROMA_SERVER_AUTHN_CREDENTIALS=${CHROMA_SERVER_AUTHN_CREDENTIALS}
          - CHROMA_AUTH_TOKEN_TRANSPORT_HEADER=${CHROMA_AUTH_TOKEN_TRANSPORT_HEADER}
          - PERSIST_DIRECTORY=${PERSIST_DIRECTORY:-/chroma/chroma}
          - CHROMA_OTEL_EXPORTER_ENDPOINT=${CHROMA_OTEL_EXPORTER_ENDPOINT}
          - CHROMA_OTEL_EXPORTER_HEADERS=${CHROMA_OTEL_EXPORTER_HEADERS}
          - CHROMA_OTEL_SERVICE_NAME=${CHROMA_OTEL_SERVICE_NAME}
          - CHROMA_OTEL_GRANULARITY=${CHROMA_OTEL_GRANULARITY}
          - CHROMA_SERVER_NOFILE=${CHROMA_SERVER_NOFILE}
        restart: unless-stopped # possible values are: "no", always", "on-failure", "unless-stopped"
        ports:
          - "8000:8000"
        healthcheck:
          # Adjust below to match your container port
          test: [ "CMD", "curl", "-f", "http://localhost:8000/api/v1/heartbeat" ]
          interval: 30s
          timeout: 10s
          retries: 3
        networks:
          - net
    
    volumes:
      chroma-data:
        driver: local
    vlan network

    用途:Container 設定固定 IP

    新增 macvlan 網路

    docker network create -d macvlan \
        --subnet=192.168.0.0/24 \
        --gateway=192.168.0.1 \
        --ip-range=192.168.0.100/28 \
        -o parent=eth0 vlan

    編輯 compose.yml

    services:
      windows:
        container_name: windows
        ..<snip>..
        networks:
          vlan:
            ipv4_address: 192.168.0.100
    
    networks:
      vlan:
        external: true