Hello World 的應用

通常,你需要建立一堆服務來形成複製和協調的應用程式。

典型的現代 Web 應用程式由資料庫,api,前端和反向代理組成。

堅持

資料庫需要永續性,因此我們需要一些在 swarm 中的所有節點之間共享的檔案系統。它可以是 NAS,NFS 伺服器,GFS2 或其他任何東西。設定它超出了範圍。目前,Docker 不包含並且不管理群集中的永續性。此示例假定在所有節點上安裝了/nfs/共享位置。

網路

為了能夠相互通訊,群中的服務需要在同一網路上。

選擇 IP 範圍(此處為 10.0.9.0/24)和網路名稱(hello-network)並執行命令:

docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  --opt encrypted \
  hello-network

資料庫

我們需要的第一項服務是資料庫。我們以 postgresql 為例。在 nfs/postgres 中為資料庫建立一個資料夾並執行:

docker service create --replicas 1 --name hello-db \
       --network hello-network -e PGDATA=/var/lib/postgresql/data \
       --mount type=bind,src=/nfs/postgres,dst=/var/lib/postgresql/data \
       kiasaki/alpine-postgres:9.5

請注意,我們使用了 --network hello-network--mount 選項。

API

建立 API 超出了這個例子的範圍,所以讓我們假裝你在 username/hello-api 下有一個 API 映象。

docker service create --replicas 1 --name hello-api \
       --network hello-network \
       -e NODE_ENV=production -e PORT=80 -e POSTGRESQL_HOST=hello-db \
       username/hello-api

請注意,我們傳遞了資料庫服務的名稱。Docker swarm 有一個嵌入式迴圈 DNS 伺服器,因此 API 可以使用其 DNS 名稱連線到資料庫。

反向代理

讓我們建立 nginx 服務,為外部世界提供 API。在共享位置建立 nginx 配置檔案並執行:

docker service create --replicas 1 --name hello-load-balancer \
       --network hello-network \
       --mount type=bind,src=/nfs/nginx/nginx.conf,dst=/etc/nginx/nginx.conf \
       -p 80:80 \
       nginx:1.10-alpine

請注意,我們已使用 -p 選項釋出埠。該埠可供群集中的任何節點使用。