跳至主要内容

7.5 Overlay 虛擬網路

上一個章節,我們學會利用一個 Leader 在不同的伺服器 ( 節點 ) 上建立容器,而這次是來真的了,開心的是我們已經脫離了本機,是真正的活在網際網路的世界中。

上一小節最後提到 Docker Swarm 的 Load Balancer 是透過 ingress 這個虛擬網路,而 ingress 本身是一個 overlay 的虛擬網路,什麼意思呢?

這在 Docker 虛擬網路篇 中有稍微的帶過關於 --driver 的參數,在那時候我們有提到 Docker 的虛擬網路預設的 driver 是 bridge,而在 Swarm 模式預設的 driver 就是 overlay,透過我們熟悉的docker network list 指令可以看到:

root@ubuntu-s-1vcpu-512mb-10gb-sgp1-01:~# docker network list
NETWORK ID NAME DRIVER SCOPE
15dfc06fe9c2 bridge bridge local
ad60906fa047 docker_gwbridge bridge local
51af213b6973 host host local
dpzji5vg6tba ingress overlay swarm <- ingress
7d7e4e646833 none null local

還記得在 Docker Compose 的章節有練習過使用 Drupal 這個內容管理系統搭配 PostgreSQL 來建立一個服務嗎?

這次就改用 Docker Swarm 來試試看,並且讓使用 Docker Compose 的經驗複製到 Docker Swarm 上,我覺得這點在一開始使用 Docker Swarm 是很重要的,複製一個相似的成功經驗,並且在新的功能上開始實踐。

因為是跨越節點的容器溝通,所以就像 Compose 章節一樣,先建立一個虛擬網路,但這次是指定用 overlay 當作 driver。

root@ubuntu-s-1vcpu-512mb-10gb-sgp1-01:~# docker network create --driver overlay dev
o2tqlvo77qxaj6uha582f4qvk

接著我們先啟動 postgres:14-alpine 的服務,不需要開啟 port 對外,這在之前就有強調過很多次了,在同一個虛擬網路內,並不需要從外部進行連線,所以不需要 --publish

root@ubuntu-s-1vcpu-512mb-10gb-sgp1-01:~# docker service create --name pg --network dev --env POSTGRES_PASSWORD=password postgres:14-alpine
ozqc5f76qqni0s1j3zkm7avir
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged

接著再啟動 drupal:7.92 這個服務,這次就要使用 --publish,因為這是我們對網際網路世界的接口,就讓我們來啟動吧!

root@ubuntu-s-1vcpu-512mb-10gb-sgp1-01:~# docker service create --name drupal --network dev --publish 80:80 drupal:7.92
sb009p4l427rd11u6pi89522x
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged

接著就可以透過伺服器的 IP 位置進入到服務中,就又到了熟悉的 Drupal 設定畫面,這邊選用了比較迷你的 drupal 版本,是因為考量到我們在 DigitalOcean 上開的機器很小,怕負擔不過來。

Drupal 設定畫面

而到了設定資料庫的部分,資料庫的名稱以及使用者名稱在 postgres 映像檔的預設情況下都是 postgres。

而至於進階設定的 Database Host,還記得在 Compose 章節我們是用容器的名字作為虛擬網路內的 Database Host,而在 Docker Swarm 的模式下,是使用 service 的名字作為 overlay 虛擬網路中的 Database Host,所以這邊會填入 pg,以及 port 5432。

Drupal 資料庫設定畫面

後面的設定就和之前一樣,最終會來到 Drupal 的主畫面,這時候若是把 service 刪除,將不會保留任何的資料。

因為我們沒有使用 volume 來儲存資料,接著下面一個章節,我們將會講述要如何在 Docker Swarm 的模式下儲存資料,volume 也能夠跨越伺服器的鴻溝嗎?