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

我有一个现有的docker群集群运行在两个节点,我想添加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 

我是否需要创build另一个覆盖networking,并将Nginx设置为覆盖networking。 我以下面的方式创buildnginx服务:

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

使用这个命令,nginx正在我所有的节点中创build,我可以使用浏览器访问默认的nginx“hello world”屏幕。

因为我为nginxconfiguration挂载了卷,所以我可以从/var/lib/docker/volumes/rproxy/_data访问nginxconfiguration。 于是,我进入了/etc/nginx/conf.d ,删除了default并创build了一个简单的vhost:

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

当我重新启动nginx时,由于Host "myapp" does not exist nginx错误,我的服务器没有启动。 我知道,如果我暴露myapp服务的任何端口,我将能够使用像这样的代理:

 proxy_pass http://0.0.0.0:SOME_PORT; 

我不公开任何端口,但希望访问我的容器使用其各自的服务名称。 这可能吗? 如果是,我应该怎么做?

我的第二个问题是关于configuration文件的存储。 有没有办法在群体中创build单个卷并从所有节点访问该卷? 我甚至不介意在nginx将configuration加载到内存中的情况下将卷存储在swarm manager服务器中,这不会影响性能。

编辑:我没有安装时检查docker版本,认为1.13是最新的。 Docker版本17.06.1-ce,build 874a737

我是否需要创build另一个覆盖networking,并将Nginx设置为覆盖networking。

nginx容器和您的目标应用程序需要在同一个dockernetworking上,以便从容器通信到容器。 您可以将nginx容器添加到多个特定于应用程序的networking,也可以创build一个代理networking并将所有应用程序连接到该networking。 从docker run命令可以连接到单个networking。 对于多个networking困难的方式,你可以做一个docker create ,然后docker network connect然后运行docker start 。 简单的方法是使用一个docker-compose.yml文件,将这些步骤自动化,将您的容器连接到多个networking。

有没有办法在群体中创build单个卷并从所有节点访问该卷? 我甚至不介意在nginx将configuration加载到内存中的情况下将卷存储在swarm manager服务器中,这不会影响性能。

您可以创build连接到远程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