Docker Compose

ouer1994 發表於2019-08-20

Docker Compose

1. Docker Compose 可以做什麼?

主要是解決容器管理的問題。舉個例子,一個小型的 LNMP 網站,需要 Linux 容器,Nginx 容器,MySQL容器,PHP容器 相互配合,這時 docker compose 就派上用場了。

2. Docker Compose 常用命令

命令 解釋
docker-compose ps 檢視當前資料夾下 compose 管理的容器
docker-compose start CONTAINER_NAME 啟動容器
docker-compose stop CONTAINER_NAME 停止容器
docker-compose -p PROJECT_NAME up -d 建立並啟動當前資料夾下 docker-compose.yml 配置的 所有容器(-d:後臺執行,-p:指定專案名稱)可以使用 -f 指定 啟動時讀取的 配置檔案
docker-compose down 停止 並 刪除所管理的容器
docker-compose logs 容器名稱 檢視容器的log日誌

3. 編寫 docker-compose.yml 配置檔案

# 代表我們定義的 docker-compose.yml 檔案內容所採用的版本
version: "3"

networks:
  frontend:
  backend:
  # 定義了網路驅動的型別,並指定了子網的網段
  spnet:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.10.1.0/24

volumes:
  mysql-data:
  external-data:
    # 如果我們想把屬於 Docker Compose 專案以外的資料卷引入進來直接使用,我們可以將資料卷定義為外部引入,
    # 在加入 external 定義後,Docker Compose 在建立專案時不會直接建立資料卷,而是優先從 Docker Engine 中已有的資料卷裡尋找並直接採用。
    external: true

services:

  redis:
    # 映象
    image: redis:3.2
    # 網路
    networks:
      backend:
        # 定義網路別名
        aliases:
          - backend.database
    # 資料卷
    volumes:
      - ./redis/redis.conf:/etc/redis.conf:ro
    # 埠對映
    ports:
      - "6379:6379"
    # Redis 啟動命令
    command: ["redis-server", "/etc/redis.conf"]

  database:
    image: mysql:5.7
    networks:
      - backend

    # 應用已經定義的資料卷
    volumes:
      - ./mysql/my.cnf:/etc/mysql/my.cnf:ro
      - mysql-data:/var/lib/mysql

    # 環境變數
    environment:
      - MYSQL_ROOT_PASSWORD=my-secret-pw
    ports:
      - "3306:3306"

  webapp:
    build: ./webapp
    networks:
      - frontend
      - backend
    volumes:
      - ./webapp:/webapp

    # 依賴
    depends_on:
      - redis
      - database

  nginx:
    image: nginx:1.12
    networks:
      - frontend
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./webapp/html:/webapp/html
    depends_on:
      - webapp
    ports:
      - "80:80"
      - "443:443"