Docker 1.13“Swarm Mode”集群的 nginx 反向代理

Docker 1.13“Swarm Mode”集群的 nginx 反向代理

我有一个在两个节点上运行的现有 docker swarm 集群,我想添加 nginx 进行反向代理。我问这个问题是因为我面临几个我不知道如何解决的问题。

我的第一个问题是关于在 Swarm 中运行 nginx 以及是否能够使用其正确名称访问我的应用容器。首先,这是docker network ls

6897486e798b        bridge              bridge              local
3c5b72414821        docker_gwbridge     bridge              local
6f762b23ff12        host                host                local
uwy3qfuu4oos        ingress             overlay             swarm
0e867cd5a3bf        none                null                local

我是否需要创建另一个覆盖网络并将 Nginx 设置为该覆盖网络中。我正在按以下方式创建 nginx 服务:

docker service create rproxy -p 80:80 --mount type=volume,source=rproxy,target=/etc/nginx --mode=global nginx:alpine

使用此命令,nginx 在我的所有节点上创建,并且我能够使用浏览器访问默认的 nginx“hello world”屏幕。

由于我为 nginx 配置挂载了一个卷,因此我能够从 访问 nginx 配置/var/lib/docker/volumes/rproxy/_data。因此,我进入/etc/nginx/conf.d,删除default并创建了一个简单的 vhost:

server {
    listen 80;
    location / {
        proxy_pass http://myapp:80;
    }
}

当我重新启动 nginx 时,由于 nginx 错误,我的服务器无法启动Host "myapp" does not exist。我知道如果我从myapp服务公开任何端口,我将能够使用类似以下方式进行代理:

proxy_pass http://0.0.0.0:SOME_PORT;

我没有公开任何端口,但想使用各自的服务名称访问我的容器。这可能吗?如果可以,我该怎么做?

我的第二个问题是关于配置文件的存储。有没有办法创建单个卷在群体中并从所有节点访问该卷?我甚至不介意将卷存储在 Swarm 管理器服务器中,因为 nginx 将配置加载到内存中,这不会影响性能。

编辑:安装时我没有检查 Docker 版本,以为 1.13 是最新版本。Docker 版本 17.06.1-ce,内部版本 874a737

答案1

我是否需要创建另一个覆盖网络并将 Nginx 设置为位于该覆盖网络中。

nginx 容器和目标应用程序需要位于同一个 docker 网络上,才能在容器之间进行通信。您可以将 nginx 容器添加到多个应用程序特定的网络,也可以创建一个代理网络并将所有应用程序连接到该网络。从命令中,您可以连接到单个网络。对于多个网络,困难的方式是,您可以在运行 之前docker run执行docker create和。简单的方法是使用 docker-compose.yml 文件,该文件会自动执行这些步骤以将您的容器连接到多个网络。docker network connectdocker start

有没有办法在群集中创建单个卷并从所有节点访问该卷?我甚至不介意将卷存储在群集管理器服务器中,因为 nginx 将配置加载到内存中,这不会影响性能。

您可以创建连接到远程 nfs 服务器的卷。以下是使用远程 nfs 共享的一些 docker 命令示例:

# create a reusable volume
$ docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.1.1,rw \
    --opt device=:/path/to/dir \
    foo

# or from the docker run command
$ docker run -it --rm \
  --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \
  foo

# or to create a service
$ docker service create \
  --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \
  foo

相关内容