前言
前幾個月我用 Docker Compose 在 Raspberry Pi 4 上面架設了 Grafana + Prometheus 相關服務。所以這次就以這個組合來探討 Docker Compose 的使用方式。
準備環境
安裝 Docker
在安裝 Docker Compose 前需要先安裝 Docker Engine。可以參考 Developers - Docker。
我在 macOS 及 Windows OS 上習慣直接安裝 Docker Desktop。他有 GUI 介面可以管理 Docker Container,並且已經內建了 Docker Compose,可以不用再額外安裝。
安裝 Docker Compose
若是在無 GUI 的系統環境內單獨安裝了 Docker Engine(像是我在 Raspberry Pi 4 上裝了 Ubuntu 20.04.3 LTS)。就要再參考這篇 Install Docker Compose | Docker Documentation。
Compose file
請先 clone 到本機(以及 Star)yslinear/docker-grafana-prometheus。
執行
資料夾的根目錄內有一個 docker-compose.yml
檔案,這是預設的 Compose file 名稱。
在存在 Compose file 的目錄下執行:
docker-compose up -d
-d
參數表示在背景執行 containers,這樣在 containers 啟動完成後會把 terminal 還給我們。
若是自定義 Compose file 名稱,則需要在執行時加上 -f
參數指定 Compose file。如:
docker-compose -f custom.yml up
參數
volumes
執行後會發現目錄下建立了一些資料夾:
$ tree .
.
├── README.md
├── docker-compose.yml
├── etc
│ ├── blackbox-exporter
│ │ └── config
│ ├── hostname
│ ├── hosts
│ └── resolv.conf
└── grafana
└── provisioning
5 directories, 5 files
這是因為 Compose file 內各個 service 的 volumes
參數指定了資料夾,這些資料夾會被建立在對應的目錄下。如:
services:
blackbox-exporter:
volumes:
- ./etc/blackbox-exporter/config/:/config/
這邊的 volumes
參數設定了 ./etc/blackbox-exporter/config/:/config/
。冒號前面表示主機資料夾路徑,冒號後面為 container 系統內的資料夾路徑。兩邊互相連動。當我們編輯了資料夾內的 ./etc/blackbox-exporter/config/blackbox.yml
,blackbox-exporter
container 內的 /config/blackbox.yml
檔案也會隨之更新。
command
services:
blackbox-exporter:
command: '--config.file=/config/blackbox.yml'
這個參數可以 override image 預設的指令。在 blackbox-exporter
我們指定這個 service 應該讀取的 config file 路徑。
networks
networks:
monitoring:
driver: bridge
Docker Compose 預設會建立 default network。但我這邊自訂了一個名為 monitoring
的網路。而 bridge
這個 driver 是 Docker Compose 預設的網路類型。
接下來只要在 service 內加入
networks:
- monitoring
便可以和其他擁有相同 network 的 service 進行溝通。
expose
這個參數可以指定 service 要運作在哪個 port。而這個 port 只能在這個 Docker Compose 的 containers 之間相互存取。
如 blackbox-exporter
內的 - 9115
這可以讓 prometheus
透過 9115 port 去存取 blackbox-exporter
container。
ports
這個參數可以將 container 內的 port 和主機的 port 互相綁定。
如 grafana
內的 - 3000:3000
讓我們可以在主機上透過 http://localhost:3000
去訪問 grafana
服務。
如果一個 service 上有多個 ports,也可以這樣設定:
ports:
- 80:80
- 443:443
- 3306:3306
container_name
這個參數可以指定 container 的名稱。並且會是 Docker 內部網路的 Domain Name。例如:
services:
prometheus:
container_name: prometheus
expose:
- 9090
networks:
- monitoring
container_name
為 prometheus
。而 grafana
這個 service 也在相同的 network 內。Grafana 便可以透過 http://prometheus:9090
去存取 prometheus
。
後記
寫到這邊我突然想到,Compose file 的副檔名到底是 .yaml
還是 .yml
?我在 Stack Overflow 查了一下。
symfony - What is the difference between .yaml and .yml extension? - Stack Overflow
一般是建議使用 .yaml
,但是在 Windows 95 時代有一個 8.3檔名命名規範。它限制檔名的長度最多為 8 個字元,而副檔名最多只能包含 3 個字元。在現今比較資深的工程師仍然習慣只有 3 個字元的副檔名。
最後用我的 Raspberry Pi 4 結束這篇文章。