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 选项发布端口。该端口可供群集中的任何节点使用。