前面文章有提到過使用docker來快速拉起一個zabbix監控系統(詳見:如何使用docker快速部署一個zabbix監控系統),但是要一個個執行docker啟動指令去将對應的容器啟動。如果要配置參數多,那敲啟動指令就是一件讓人心累的事情。而且敲完後若沒有儲存啟動指令,後面的管理也是比較麻煩,并且如果容器數量較多,還要一個個手敲啟動指令,這就非常的不友善。
是以為了解決這個問題,并且更加高效的啟動一個zabbix監控系統。現在使用docker-compose這個容器編排工具來高效的啟動zabbix監控系統。
1. Docker-compose介紹
- Docker-Compose項目是Docker官方的開源項目,負責實作對Docker容器叢集的快速編排, 并且提供了 scale (服務擴容) 的功能。
- Docker-Compose将所管理的容器分為三層,分别是工程(project),服務(service)以及容器(container)。Docker-Compose運作目錄下的所有檔案(docker-compose.yml,extends檔案或環境變量檔案等)組成一個工程,若無特殊指定工程名即為目前目錄名。一個工程當中可包含多個服務,每個服務中定義了容器運作的鏡像,參數,依賴。一個服務當中可包括多個容器執行個體,Docker-Compose并沒有解決負載均衡的問題,是以需要借助其它工具實作服務發現及負載均衡。
- Docker-Compose的工程配置檔案預設為docker-compose.yml,可通過環境變量COMPOSE_FILE或-f參數自定義配置檔案,其定義了多個有依賴關系的服務及每個服務運作的容器。
- 使用一個Dockerfile模闆檔案,可以讓使用者很友善的定義一個單獨的應用容器。在工作中,經常會碰到需要多個容器互相配合來完成某項任務的情況。例如要實作一個Web項目,除了Web服務容器本身,往往還需要再加上後端的資料庫服務容器,甚至還包括負載均衡容器等。
- Compose允許使用者通過一個單獨的docker-compose.yml模闆檔案(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)。
- Docker-Compose項目由Python編寫,調用Docker服務提供的API來對容器進行管理。是以,隻要所操作的平台支援Docker API,就可以在其上利用Compose來進行編排管理。
2.基礎文法
Docker-compose就是通過docker-compose.yaml檔案所定義的容器作為一個項目,進而進行docker容器的管理。下面就對docker-compose.yaml模闆檔案的常用基礎文法進行一個簡單的解釋
2.1. container_name
Compose 的容器預設名稱格式是:<項目名稱><服務名稱><序号>
雖然可以自定義項目名稱、服務名稱,但是如果你想完全控制容器的命名,可以使用這個标簽指定:
比如我要制定一個mysql容器的名為“mysql-test”,那麼
version: '3'
services:
mysql:
container_name: mysql-test
2.2. image
指定服務的鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 将會嘗試拉取這個鏡像。
比如我要制定一個mysql容器,使用的鏡像名為“mysql:8.0”,那麼
version: '3'
services:
mysql:
image: mysql:8.0
2.3. depends_on
在使用 Compose 時,最大的好處就是少打啟動指令,但是一般項目容器啟動的順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗。
例如在沒啟動資料庫容器的時候啟動了應用容器,這時候應用容器會因為找不到資料庫而退出,為了避免這種情況我們需要加入一個标簽,就是 depends_on,這個标簽解決了容器的依賴、啟動先後的問題。
比如我要先啟動一個MySQL,後啟動nginx,那麼
version: '3'
services:
nginx:
image: nginx:1.16.1
depends_on:
- mysql
mysql:
image: mysql:8.0
2.4. environment
這是設定鏡像的環境變量,直接将變量定義到鏡像裡面,這樣啟動容器時會自動讀取該環境變量
如啟動一個MySQL容器,要設定它的root初始化密碼為“123456”,那
version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
2.5. ports
該參數是将主控端的端口映射到容器端口,進而在主控端通路對應的端口能通路到容器内。
如要講MySQL容器的3306端口映射到主控端的33060端口,那
version: '3'
services:
mysql:
image: mysql:8.0
ports:
- “33060:3306”
2.6. volumes
挂載一個目錄或者一個已存在的資料卷容器,可以直接使用 [HOST:CONTAINER] 這樣的格式,或者使用 [HOST:CONTAINER:ro] 這樣的格式,後者對于容器來說,資料卷是隻讀的,這樣可以有效保護主控端的檔案系統。
Compose的資料卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄。
version: '3'
services:
mysql:
image: mysql:8.0
volumes:
- ./data:/var/lib/mysql
- /var/log/mysql:/var/log/mysql
3.安裝docker-compose
選擇對應版本下載下傳安裝包
https://github.com/docker/compose/releases?after=1.28.0
上傳到伺服器修改名稱并授權
mv docker-compose-x86 docker-compose
chmod +x docker-compose
測試
./docker-compose –v
安裝
mv docker-compose /usr/bin
4. 編寫zabbix監控系統的docker-compose.yaml檔案
version: '3.7'
services:
mysql:
container_name: mysql
image: mysql:latest
restart: always
environment:
MYSQL_DATABASE: zabbix
MYSQL_ROOT_PASSWORD: zabbix@2022
ports:
- "3306:3306"
volumes:
- /data/mysql:/var/lib/mysql
zabbix-server:
container_name: zabbix_server
image: zabbix/zabbix-server-mysql:latest
restart: always
depends_on:
- mysql
environment:
MYSQL_DATABASE: zabbix
MYSQL_PASSWORD: zabbix@2022
MYSQL_USER: root
DB_SERVER_HOST: 192.168.75.31
DB_SERVER_PORT: 3306
ports:
- "10051:10051"
volumes:
- /data/zabbix/alertscripts:/usr/lib/zabbix/alertscripts
- /data/zabbix/externalscripts:/usr/lib/zabbix/externalscripts
zabbix-web:
container_name: zabbix_web
image: zabbix/zabbix-web-nginx-mysql:latest
restart: always
depends_on:
- mysql
- zabbix_server
environment:
MYSQL_DATABASE: zabbix
MYSQL_PASSWORD: zabbix@2022
MYSQL_USER: root
DB_SERVER_HOST: 192.168.75.31
DB_SERVER_PORT: 3306
ZBX_SERVER_HOST: 192.168.75.31
ZBX_SERVER_PORT: 10051
ports:
- "8080:8080"
zabbix-agent:
container_name: zabbix_agent
image: zabbix/zabbix-agent:latest
restart: always
depends_on:
- mysql
- zabbix_server
environment:
ZBX_HOSTNAME: 192.168.75.31
ZBX_SERVER_HOST: 172.18.0.1
ports:
- "10050:10050"
5. 啟動zabbix監控系統
别忘了安裝docker!
編寫好zabbix監控系統的docker-compose.yaml檔案後,就可以啟動系統了
Docker-compose up –d
如圖所示,已成功啟動
6.驗證監控系統
我這邊web端口映射為主控端的18080,是以通路zabbix界面,那就是IP+18080
預設的賬号密碼:
Admin
zabbix
如圖,成功通路。
這一期的Zabbix技術内容到這就結束了。我是樂維IT君,專注運維技術分享,更多Zabbix技術及其他運維内容,還可以檢視我的往期内容,zabbix服務,zabbix配置,zabbix部署等zabbix服務解決方案。