我的设置
两个节点(2GB RAM,2个vCPU)运行docker引擎(v17.06.1-ce) – 一个群和一个工人。 内部networking带宽:10Gbps。 所有文件和数据库都位于此Docker集群(AWS S3和用于数据库的不同实例)之外。
我正在努力实现的是什么?
我试图创build一个基于“平台”,我推无状态服务和docker处理负载平衡,更新等docker。除此之外,我也试图设置反向代理,并允许特定的服务有权访问此代理。
我到目前为止做了什么?
首先,我创build了一个覆盖networking,称之为“公共”。 (10.0.9.0/24)然后,我在“全局”模式下创build了一个nginx服务。 服务本身附属于“公共”networking。 我检查了我的工作人员和群体节点,并在两个服务运行没有问题。
其次,我创build了docker撰写文件,以便快速部署多个服务。 为了我的testing,我每个撰写文件都保留一项服务:
version: '3.3' services: web: image: app1_image:latest networks: - public networks: public: external: name: public
对于第二个服务,我只是改变了图像名称,并保持其他一切。 同时“堆”:
docker stack deploy --with-registry-auth --compose-file compose1.yml app1 docker stack deploy --with-registry-auth --compose-file compose2.yml app2
在检查这两个服务之后,我看到这两个服务都在“overlay”networking中,如10.0.9.5(app1_web)和10.0.9.6(app2_web)。 在swarm节点中创buildapp2_web ,在worker节点中创buildapp2_web 。
所以我用下面的方法为我的两个服务创build了两个nginxconfiguration文件:
server { listen 80; server_name app1.example.com; location / { proxy_pass http://app1_web; # This line is important # Other proxy parameters } }
正如您所看到的,我正在通过nginxconfiguration传递服务名称。 为了更方便的configurationpipe理,我使用docker configs:
docker config create nginx_app1.conf app1.conf docker config create nginx_app1.conf app1.conf docker service update --config-add source=nginx_app1.conf,target=/etc/nginx/conf.d/app1.conf nginx_proxy docker service update --config-add source=nginx_app2.conf,target=/etc/nginx/conf.d/app2.conf nginx_proxy
添加这些configuration会自动重新启动nginx服务并运行它们。 这就是全部。 在向前迈进之前,我想给你一个关于我的过程的要点。
问题
app1_web在swarm中创build; 所以,当我去app1.example.com,nginx代理我的请求到服务,我得到一个正确的输出。 这是预期的,我对结果感到满意。
但是,因为app2_web是在工作节点中创build的,所以nginx给了我一个app2_web不存在的错误。 所以,我开始排除故障。
从swarm中,我find了Docker实例ID,并尝试从nginx代理运行命令:
docker exec nginx-proxy-id ping app2_web
这给了我一个“坏地址”的错误。 所以,我进入compose2.yml并添加端口:
ports: - 5380:80
当我去swarm.example.com:5380时,它基本上给了我404.然而,从worker.example.com:5380打开同一个端口打开了app2。
我testing了相同的app1。 我使用docker service scale app1=2复制app1,并在工作节点中创build服务。 然后,我暂停了使用docker pause app1-id swarm中的服务。 当我去app1.example.com,它会工作一半的时间。 我认为这仍然很奇怪,因为我期待Docker知道服务已经暂停,只能将服务代理到工作节点,但无论如何。 至less它在工作。 复制app2虽然没有帮助。 我仍然不断收到错误,主机名不存在。 在此之后,我走得更远,并告诉工人节点离开群: docker swarm leave ,巧合的是,一切正常……
在这花了至less10个小时之后,我在这里做错了我失去了。 出于某种原因,当服务在工作人员中创build时,Docker不喜欢它。
对不起,这么长的一段文字。 我想分享我采取的所有步骤。 我将衷心感谢您的帮助。