前言

前幾個月我用 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.ymlblackbox-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_nameprometheus。而 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 結束這篇文章。