目錄
- 什么是 Docker Compose
- 生活案例
- 為什么要 Docker Compose
- Docker Compose 的安裝
- Docker Compose 的功能
- Docker Compose 使用場景
- Docker Compose 文件(docker-compose.yml)
- 文件語法版本
- 文件基本結構及常見指令
- Docker Compose 命令清單
- 命令清單如下
- 命令格式
- 常見選項說明
- 常見命令說明
- 操作案例
- 綜合案例
- Docker Compose 部署自定義服務
- Docker Compose 部署 WordPress
- 常見問題
- up、 run 和 start 之間有什么區別
- 如何在同一主機上運行 Compose 文件的多個副本
- 可以控制服務啟動順序嗎?
1.什么是 Docker Compose
docker-compose 是 Docker 官方的開源項目,使用 python 編寫,實現上調用了Docker 服務的 API 進行容器管理及編排,其官方定義為定義和運行多個 Docker 容器的應用。
docker-compose 中有兩個非常重要的概念:
- 服務 ( service ):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
- 項目( project ):由一組關聯的應用容器組成的一個完整業務單元,在 dockercompose.yml 文件中定義, 整個 docker-compose.yml 定義一個項目。
Compose 的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理。
通過 compose 可以方便的管理多個服務。
2.生活案例
docker compose 就像航母一樣,有艦載機、防空導彈,艦載機、導彈呢就是一個個容器。
3.為什么要 Docker Compose
- Docker 是一個輕量化的應用程序, Docker 官方推薦每個 Docker 容器中只運行一個進程。
- 如果一個應用需要涉及到 MySQL、 nginx 等環境, 那么我們需要分別為應用、數據庫和 nginx 創建單獨的 docker 容器,然后分別啟動容器。
- 想象一下,當我們構建好 Docker 之后,每次啟動應用,都至少需要 docker run三次, 或者寫一些腳本來實現, 這樣會比較繁瑣。
- 另外,這些 docker 容器都是分散獨立的,也不方便鏡像管理。那既然這些 docker容器 都是為了同一個應用服務,我們就應該把它們放到一起,這就引出了 dockercompose 來解決這類型的問題。
?
4.Docker Compose 的安裝
安裝 docker 的時候,我們默認已經安裝了 docker-compose,安裝的組件包名稱為docker-compose-plugin,此處不再贅述
5.Docker Compose 的功能
Compose 使用的步驟:
- 使用 docker-compose.yml 定義構成應用程序的服務,這樣它們可以在隔離環境中一起運行。
- 最后,執行 docker compose up 命令來啟動并運行整個應用程序。
核心功能
Compose 具有管理應用程序整個生命周期的命令:
- 啟動,停止和重建服務
- 查看正在運行的服務的狀態
- 流式傳輸運行服務的日志輸出
- 在服務上運行一次性命令
?
6.Docker Compose 使用場景
單主機部署
快速搭建一個單節點開發或者測試環境,方便使用。
不同環境隔離
通過指定 project 來運行不同的環境,實現隔離的目的。
?
7.Docker Compose 文件(docker-compose.yml)
文件語法版本
目前官方支持三個大版本, 即 Version 1、 Version 2 及 Version 3, 其中 Version 1 已經被廢棄掉了。當前最新的版本是 3.8,它支持的 Docker Engine 版本不得低于 19.03.0。 本文章主要基于 3.8 版本的 Compose file 語法進行講解,其他版本介紹參見
Compose file versions and upgrading | Docker Docs
文件基本結構及常見指令
?常見字段格式語法
image
指定容器運行的鏡像。以下格式都可以:
command
覆蓋容器啟動的默認命令。
?
entrypoint
覆蓋容器默認的 entrypoint。
?
也可以是以下格式:
environment
添加環境變量。您可以使用數組或字典、任何布爾值,布爾值需要用引號引起來,以確保 YML 解析器不會將其轉換為 True 或 False。
?
networks
指定容器運行的網絡:配置容器網絡
?配置網絡驅動和子網信息
volumes
將主機的數據卷或者文件掛載到容器里。
?
ports
指定端口映射。以下格式都可以:
expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。僅可以指定內部端口為參數:
?
build
指定為構建鏡像上下文路徑:例如 webapp 服務,指定為從上下文路徑 ./dir/Dockerfile 所構建的鏡像:
?
或者,作為具有在上下文指定的路徑的對象,以及可選的 Dockerfile 和 args:
- context:上下文路徑。
- dockerfile:指定構建鏡像的 Dockerfile 文件名。
- args:添加構建參數,這是只能在構建過程中訪問的環境變量。
- labels:設置構建鏡像的標簽。
depends_on
設置依賴關系。
- docker compose up :以依賴性順序啟動服務。在以下示例中,先啟動 db 和redis ,才會啟動 web。
- docker compose up SERVICE :自動包含 SERVICE 的依賴項。在以下示例中,docker compose up web 還將創建并啟動 db 和 redis。
- docker compose stop :按依賴關系順序停止服務。在以下示例中, web 在 db 和redis 之前停止。
?
可以指定條件, healthy 需要配置 healthcheck 來完成
health check 樣例
env_file
從文件添加環境變量。可以是單個值或列表的多個值。
也可以是列表格式
8.Docker Compose 命令清單
命令清單如下
命令格式
對于 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或者容器。如果沒有特別的說明,命令對象將是項目,這意味著項目中所有的服務都會受到命令影響。
docker-compose 命令的基本的使用格式為
常見選項說明
- -f, --file 指定使用的 Compose 模板文件,默認為 docker-compose.yml,可以多次指定
- -p, --project-name 指定項目名稱,默認將使用所在目錄名稱作為項目名
?
常見命令說明
up
該命令的作用十分強大,它會嘗試自動完成包括構建鏡像、(重新)創建服務、啟動服
務并關聯服務相關容器的一系列操作,可以直接通過該命令來啟動一個項目。
- -d 在后臺運行服務容器, 推薦在生產環境下使用該選項
- --force-recreate 強制重新創建容器,不能與 --no-recreate 同時使用
- --no-recreate 如果容器已經存在了,則不重新創建,不能與 --forcerecreate 同時使用
?
down
停止所有容器,并刪除容器和網絡
-v, --volumes 刪除容器同時刪除目錄映射
run
該命令可以在指定服務容器上執行相關的命令
- -d 后臺運行容器
- --name NAME 為容器指定一個名字
- --entrypoint CMD 覆蓋默認的容器啟動指令
- -e KEY=VAL 設置環境變量值,可多次使用選項來設置多個環境變量
- -u, --user="" 指定運行容器的用戶名或者 uid
- --rm 運行命令后自動刪除容器
- -p, --publish=[] 映射容器端口到本地主機
?
9.操作案例
創建 compose 目錄
進入 base 目錄,創建 docker-compose.yml 文件
輸入一下內容
輸入 docker config 會做檢查
我們修改錯誤信息,將版本轉為字符串,再次檢查
?
創建首頁目錄,編輯首頁內容
啟動服務
通過頁面訪問
?
停止服務
啟動服務
刪除服務
?
10.綜合案例
Docker Compose 部署自定義服務
我們編寫一個簡單的案例, nginx 反向代理到我們的一個 springboot 微服務,微服務訪問我們的 msyql 數據庫查詢用戶信息.
設計數據非常簡單的一個表信息,寫入兩條數據,文件為 init.sql
創建一個 springboot 應用,配置 maven 項目
添加啟動類
配置數據庫信息,注意本地測試的時候紅色部分調整為 ip 地址,而我們實際的服務使用的 mysql 的一個服務名稱。
?
配置用戶控制器,簡單配置,不再去涉及 mapper 那些內容通過 jdbc 直接完成操作
編譯打包
進入打包的目錄,本地測試正常啟動
本地測試正常訪問
編寫 docker-compose.yml
創建工程目錄和卷目錄
將 nginx 的反向代理配置 bit.conf 放入到./nginx/conf.d,其中內容為
將數據庫初始化文件 init.sql 放入到./mysql/init 目錄
將應用 jar 包放入到./app 目錄
啟動項目
?
瀏覽器訪問 nginx,可以看到用戶信息正常返回
Docker Compose 部署 WordPress
什么是 WordPress
WordPress 是使用 PHP 語言開發的博客平臺,用戶可以在支持 PHP 和 MySQL 數據庫的服務器上架設屬于自己的網站。也可以把 WordPress 當作一個內容管理系統(CMS)來使用。WordPress 是一款個人博客系統,并逐步演化成一款內容管理系統軟件,它是使用PHP 語言和 MySQL 數據庫開發的,用戶可以在支持 PHP 和 MySQL 數據庫的服務器上使用自己的博客。
WordPress 有許多第三方開發的免費模板,安裝方式簡單易用。不過要做一個自己的模板,則需要你有一定的專業知識。比如你至少要懂的標準通用標記語言下的一個應用 HTML 代碼、 CSS、 PHP 等相關知識。WordPress 官方支持中文版,同時有愛好者開發的第三方中文語言包,如 wopus 中文語言包。 WordPress 擁有成千上萬個各式插件和不計其數的主題模板樣式。
編寫 Docker Compose
運行站點
訪問 web 頁面
配置參數,點擊安裝
登錄
刪除,釋放空間
11.常見問題
up、 run 和 start 之間有什么區別
通常,你想要 docker compose up. 用于 up 啟動或重新啟動 docker-compose.yml.在默認的“附加”模式下,會看到來自所有容器的所有日志。在“分離”模式 ( -d) 中,啟動容器后 Compose 退出,但容器繼續在后臺運行。該 docker compose run 命令用于運行“一次性”或“臨時”任務。它需要您要運行的服務名稱,并且只為正在運行的服務所依賴的服務啟動容器。用于 run 運行測試或執行管理任務,例如從數據卷容器中刪除或添加數據。該 run 命令的作用類似于 dockerrun -ti 它打開容器的交互式終端并返回與容器中進程的退出狀態匹配的退出狀態。docker compose start 命令僅對重新啟動先前創建但已停止的容器有用。它從不創建新容器。
?
如何在同一主機上運行 Compose 文件的多個副本
Compose 使用項目名稱為項目的所有容器和其他資源創建唯一標識符。要運行項目的多個副本,請使用-p 命令行選項 或 COMPOSE_PROJECT_NAME 環境變量設置自定義項目名稱。
可以控制服務啟動順序嗎?
可以控制啟動順序,通過依賴指定,并且可以配合 healthcheck 等健康檢查成功以后再啟動
?