目錄
- 1. Docker Compose 產生背景
- 2. Docker Compose模板文件
- 1.environment
- 2.volumes
- 3.build
- 4.depends_on
- 5.env_file
- 6.networks
- 7.ports
- 8.expose
- 9.restart
- 3. docker-compose指令
- 1.up -d(后臺啟動)
- 2.down
- 3.exec
- 4.ps
- 5.top
- 6.logs -f(實時)
- 總結
1. Docker Compose 產生背景
Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集群的快速編排。使用Dockerfile我們很容易定義一個單獨的應用容器。然而在日常開發工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個 Web 項目,除了 Web 服務容器本身,往往還需要再加上后端的多種數據庫服務容器;再比如在分布式應用一般包含若干個服務,每個服務一般都會部署多個實例。如果每個服務都要手動啟停,那么效率之低、維護量之大可想而知。這時候就需要一個工具能夠管理一組相關聯的的應用容器,這就是Docker Compose。
中文文檔:https://yeasy.gitbook.io/docker_practice/compose
2. Docker Compose模板文件
模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。下面主要列出幾個常見&重要的模板指令,其他指令大家可以自行百度。
默認的模板文件名稱為 docker-compose.yml,格式為 YAML 格式。
1.environment
設置環境變量,主要是用來配置容器中程序所需要配置的一些參數。你可以使用數組或字典兩種格式。
services: mysql: image: mysql:latest ports: - 3307:3306 environment: # 使用字典格式,類似于 docker run -e MYSQL_ROOT_PASSWORD=root MYSQL_ROOT_PASSWORD: root
也可以使用數組格式:
services: mysql: image: mysql:latest ports: - 3307:3306 environment: # 使用數組格式 - MYSQL_ROOT_PASSWORD=root
2.volumes
數據卷所掛載路徑設置,掛載數據卷的默認權限是讀寫(rw)。
你可以在主機上掛載絕對路徑,或者掛載相對路徑,相對路徑是相對于當前正在使用的compose配置文件的目錄進行擴展。 相對路徑應始終以 . 或者 … 開始。
services: mysql: image: mysql:latest ports: - 3307:3306 environment: # 使用字典格式,類似于 docker run -e MYSQL_ROOT_PASSWORD=root MYSQL_ROOT_PASSWORD: root volumes: # 掛載絕對路徑映射,沒有這個路徑的話會自動創建 - /root/docker/composetest/tomcat/app_data:/var/lib/mysql # 或者使用相對路徑映射,也會自動創建 - ./app_data:/var/lib/mysql
你還可以使用別名的方式掛載容器數據卷(可以跨多個服務并重用掛載卷,當然使掛載絕對路徑或相對路徑也可以重用掛載卷),但要注意一點,使用別名的方式掛載需要在頂級volumes關鍵字中聲明掛在卷,否則啟動會報錯。
services: mysql: image: mysql:latest ports: - 3307:3306 environment: MYSQL_ROOT_PASSWORD: root volumes: - my_app_data:/var/lib/mysql web1: volumes: # 重用my_app_data - my_app_data:/var/lib/mysql web2: volumes: # 重用my_app_data - my_app_data:/var/lib/mysql volumes: my_app_data:
3.build
指定 Dockerfile 所在文件夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose 將會利用它自動構建這個鏡像,然后使用這個鏡像。
services: webapp: build: ./ # 從當前目錄下尋找Dockerfile文件
你也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑,使用 dockerfile 指令指定 Dockerfile 文件名,可以使用 args 指令指定構建鏡像時往Dockerfile中傳入的變量。
services: webapp: build: context: ./dir dockerfile: Dockerfile_flask args: buildno: 1
4.depends_on
解決容器的依賴、啟動先后的問題。以下例子中會先啟動 redis db 再啟動 web。
注意:web 服務不會等待 redis、db 完全啟動之后才啟動。
services: webapp: build: . depends_on: - db - redis redis: image: redis:latest db: image: mysql:latest
5.env_file
從文件中獲取環境變量,可以為單獨的文件路徑或列表。
services: mysql: image: mysql:latest ports: - 3307:3306 env_file: .env # 僅使用單個env文件 env_file: # 通過數組來使用多個env文件 - ./common.env - ./apps/web.env - /opt/secrets.env
環境變量文件中每一行必須符合格式,支持 # 開頭的注釋行。
# common.env: Set development environment MYSQL_ROOT_PASSWORD=root
6.networks
配置容器連接的網絡。
services: webapp: networks: - flask-net networks: # 在頂級networks關鍵字中需要聲明,才會在啟動時自動創建該網絡,否則報錯。 flask-net:
7.ports
暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式。
ports: 2. "80:80" # 綁定容器的80端口到主機的80端口 3. "9000:8080" # 綁定容器的8080端口到主機的9000端口 4. "443" # 綁定容器的443端口到主機的任意端口,容器啟動時隨機分配綁定的主機端口號
8.expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。
和ports的區別是,expose暴露容器給link到當前容器的容器,不會將端口暴露給主機。
9.restart
指定docker容器(服務)總是運行。
services: webapp: networks: - flask-net restart: always
3. docker-compose指令
中文文檔: https://yeasy.gitbook.io/docker_practice/compose/commands
1.up -d(后臺啟動)
該命令十分強大,它將嘗試自動完成包括構建鏡像,(重新)創建服務,啟動服務,并關聯服務相關容器的一系列操作。
docker-compose up -d · # 不寫服務名,默認啟動docker-compose.yml所有服務
docker-compose up -d 服務名 # 啟動docker-compose.yml的對應服務
默認情況,如果服務容器已經存在,docker-compose up 將會嘗試停止容器,然后重新創建(保持使用 volumes-from 掛載的卷),以保證新啟動的服務匹配 docker-compose.yml 文件的最新內容。但是不會更新已經打好的鏡像,如果鏡像錯誤,不能通過 docker-compose up 更新鏡像,只能先刪除鏡像。如果用戶不希望容器被停止并重新創建,可以使用 docker-compose up –no-recreate。這樣將只會啟動處于停止狀態的容器,而忽略已經運行的服務。如果用戶只想重新部署某個服務,可以使用 docker-compose up –no-deps -d <SERVICE_NAME> 來重新創建服務并后臺停止舊服務,啟動新服務,并不會影響到其所依賴的服務。
2.down
此命令將會停止 up 命令所啟動的容器,并移除網絡,但是不會移除已經打好的鏡像。
docker-compose down · # 不寫服務名,默認停止docker-compose.yml所有服務
docker-compose down 服務名 # 停止docker-compose.yml的對應服務
3.exec
進入指定的容器。和docker的exec命令一樣。
docker-compose exec 服務名 bash
4.ps
列出項目中目前的所有容器。
docker-compose ps # 列出所有運行的服務
docker-compose ps -q # 只列出容器的ID信息
選項:
-q 只打印容器的 ID 信息。
5.top
查看所有服務容器內運行的進程,或者查看指定服務名的容器內運行的進程。
docker-compose top
docker-compose top 服務名
6.logs -f(實時)
查看所有服務容器,或指定服務容器的日志輸出。默認情況下,docker-compose 將對不同的服務輸出使用不同的顏色來區分。可以通過 –no-color 來關閉顏色。該命令在調試問題的時候十分有用。
docker-compose logs # 輸出所有服務容器的日志
docker-compose logs 服務名 # 輸出對應服務的日志
docker-compose logs -f 服務名 # 實時輸出對應服務的日志
其他命令參考中文文檔手冊。