# Docker Compose ![Docker Compose](https://blog.toright.com/wp-content/uploads/2017/10/docker-compose-366x360.png) Docker Compose 是一個用於定義和運行多容器應用的工具,利用 `yaml` 文件來配置所需要的所有服務,可以同時啟動多個容器並建立容器之間的關聯。 <!-- more --> ## 安裝 安裝方式依照不同作業系統可以在 [Docker 官網](https://docs.docker.com/compose/install/) 找到相對應的安裝方式,以下以 linux 為例 : 1. 下載 Docker Compose ```bash= sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose ``` 2. 修改執行權限 ```bash= sudo chmod +x /usr/local/bin/docker-compose ``` 3. 測式安裝是否成功 ```bash= docker-compose --version ``` ## 建立 docker-compose.yml ### 範例 : 這個範例啟動了兩個 Container,分別為 app1 和 app2,若是一般專案設定可以像範例的 app1 設定即可,其他設定到 CI、CD 再設定會比較好。 ```yaml= version: '3' services: app1: image: imageName build: context: . dockerfile: dockerfilePath/Dockerfile app2: image: imageName ``` ### yml配置指令 **version** 指定yml使用哪個版本的 compose **build** 兩種方式 1. 指定建立 image 的路徑,例如 : build: ./dir,Dockerfile 在 ./dir 路徑下 ```yml= version: '3' services: app1: image: imageName build: ./dockerfilePath ``` 2. 設定 Dockerfile 路徑,並選擇 Dockerfile,通常是因為有自定義不同名稱的 Dockerfile 才需要特別指定 Dockerfile * context : 上下文路徑 * dockerfile : 指定 Dockerfile * args : 添加建置參數,只能在建置過程中存取的環境變數 * labels : 建置 image 的標籤 * target : 多層建置,指定建置哪一層 ```yml= version: '3' services: app1: image: imageName build: context: . dockerfile: dockerfilePath/Dockerfile args: buildConfig: Debug labels: - "exmaple.com.lable1" - "example.com.label2" target: prod ``` **environment** 添加環境變數,若要使用 boolean 需要用單引號括起來,否則 yml 解析器不會解析為 boolean ```yml= environment: ASPNETCORE_ENVIRONMENT: Development SHOW: 'true' ``` **expose** 暴露端口,Container 內部開放存取的 Port 號。expose 用於讓 Container 互相溝通,像是 redis 就有 expose port 6379 來讓 Container 之間互相溝通。 ```yml= expose: - "9890" - "9875" ``` **ports** Port 對應,Host Port : Container Expose Port ```yml= ports: - 9878:80 - 9876:443 - 9898:9898 ``` **network_mode** 設置網路模式,bridge、host,等。 ```yml= network_mode: "bridge" ``` **restart** 設置重啟策略,預設是 no always : 總是重啟 on-failure : container 正常退出時(退出狀態非0)才重啟 ```yml= restart: "no" restart: always restart: on-failure ``` **secrets** 儲存敏感數據,例如密碼 ```yml= secrets: my_secret: file: ./my_secret.txt ``` **volumes** 將主機的文件掛載到 Container ```yml= volumes: - "/localhost/data:/var/lib/postgresql/data1" - "/localhost/data:/var/lib/postgresql/data2" ``` **depends_on** 設定啟動順序,docker compose 可以一次啟動多個 Container,但是有些 Container 之間是有關連性的就必須有順序性的啟動。 ```yaml= version: '3' services: master: image: redis container_name: redis-master ports: - 6379:6379 volumes: - ./node/redis-master.conf:/usr/local/etc/redis/redis.conf slave1: image: redis container_name: redis-slave1 ports: - 6380:6379 volumes: - ./node/redis-master.conf:/usr/local/etc/redis/redis.conf depends_on: - master ``` **以上列出較常用到指令,其他見參考3** ## 啟動 docker compose 中所定義的所有 image 成 container > -d : 背景執行 ```bash= docker-compose up -d ``` ## 參考 [1] [用 Docker-Compose 啟動多個 Docker Container](https://ithelp.ithome.com.tw/articles/10194183) [2] [Install Docker Compose](https://docs.docker.com/compose/install/) [3] [Docker Compose | Runoob.com](https://www.runoob.com/docker/docker-compose.html) [4] [Understanding “EXPOSE”](https://we-are.bookmyshow.com/understanding-expose-in-dockerfile-266938b6a33d) ###### tags:`Container` `Docker`