由于我们是一个小团队,我们希望将 JetBrains 的 Hub、Youtrack、Upsource 和 Teamcity 作为 docker 容器(目前都在同一台机器上(。Docker 运行在 ESXi 6.7 上的 Photon OS 2.0 上。另一个容器中的 Nginx 充当 DNS 代理,因此目前可以使用端口 80 上自己的域名访问所有服务......
我运行了所有 5 个服务,并且可以在浏览器中访问它们。然而,将Youtrack,Upsource和Teamcity连接到Hub是一个挑战。Youtrack,Upsource和Teamcity要求Hub URL
确认并请求访问Hub的权限。
问题:
- 中心 URL:http://hub.teamtools.mydomain.com ->容器无法在该地址下访问它,并且验证失败并超时 Hub URL
- :http://172.18.0.3:8080 ->容器可以访问内部 docker 网络上的 Hub,然后显示一个弹出窗口,该弹出窗口试图通过重定向到该内部 IP 上的 Hub 来显示确认页面,这当然在浏览器中失败(我试图将弹出窗口中的 URL 复制到一个新窗口中并在那里调整它作为黑客,但这不起作用。
问题:
- 如何将Youtrack,Upsource和Teamcity链接到Hub?为了使确认过程正常工作,docker 容器需要能够使用外部 IP/域名相互访问。
- 有什么反对将所有四个Teamtools放在同一台机器上以开始使用并随着需求的增长将它们分开吗?
到目前为止的配置:
容器已转换为如下服务:
/etc/systemd/system/docker.nginx.servcie
[Unit]
Description=Nginx DNS proxy
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=/usr/bin/docker network create --subnet=172.18.0.0/16 dockerNet
ExecStartPre=-/usr/bin/docker exec %n stop
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull jwilder/nginx-proxy
ExecStart=/usr/bin/docker run --rm --name %n
-v /var/run/docker.sock:/tmp/docker.sock:ro
--net dockerNet --ip 172.18.0.2
-p 80:80
jwilder/nginx-proxy
[Install]
WantedBy=multi-user.target
/etc/systemd/system/docker.hub.service
[Unit]
Description=JetBrains Hub Service
After=docker.nginx-proxy.service
Requires=docker.nginx-proxy.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=-/usr/bin/docker exec %n stop
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull jetbrains/hub:2018.2.9635
ExecStart=/usr/bin/docker run --rm --name %n
-v /opt/hub/data:/opt/hub/data
-v /opt/hub/conf:/opt/hub/conf
-v /opt/hub/logs:/opt/hub/logs
-v /opt/hub/backups:/opt/hub/backups
--net dockerNet --ip 172.18.0.3
-p 8010:8080
--expose 8080
-e VIRTUAL_PORT=8080
-e VIRTUAL_HOST=hub,teamtools.mydomain.com,hub.teamtools.mydomain.com
jetbrains/hub:2018.2.9635
[Install]
WantedBy=multi-user.target
。等等。由于我仍在尝试,因此端口被映射到主机上并公开,因此nginx代理可以拾取它们。我还在容器中添加了静态 IP,希望这有助于解决我的问题。
运行这些服务会导致:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ba8ed89b832 jetbrains/teamcity-server "/run-services.sh" 12 hours ago Up 12 hours 0.0.0.0:8111->8111/tcp docker.teamcity.service
5c819c48cbcc jetbrains/upsource:2018.1.357 "/bin/bash /run.sh" 12 hours ago Up 12 hours 0.0.0.0:8030->8080/tcp docker.upsource.service
cf9dcd1b534c jetbrains/youtrack:2018.2.42223 "/bin/bash /run.sh" 14 hours ago Up 14 hours 0.0.0.0:8020->8080/tcp docker.youtrack.service
de86c3e1f2e2 jetbrains/hub:2018.2.9635 "/bin/bash /run.sh" 14 hours ago Up 14 hours 0.0.0.0:8010->8080/tcp docker.hub.service
9df9cb44e485 jwilder/nginx-proxy "/app/docker-entry..." 14 hours ago Up 14 hours 0.0.0.0:80->80/tcp docker.nginx-proxy.service
附加信息:
我确实认为这可能是防火墙问题,这篇文章似乎暗示了同样的事情:
https://forums.docker.com/t/access-docker-container-from-inside-of-the-container-via-external-url/33271
在与虚拟服务器的提供商进行一些讨论后,它 事实证明,Plesk 防火墙和 iptables 导致了此问题。在冲突被解决后 提供程序可以访问容器。
Photon 上的防火墙,带有由 docker 自动添加的规则:
Chain INPUT (policy DROP 2 packets, 203 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
258 19408 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6 360 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
186 13066 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
186 13066 DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
103 7224 ACCEPT all -- * br-83f08846fc2e 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
9 524 DOCKER all -- * br-83f08846fc2e 0.0.0.0/0 0.0.0.0/0
74 5318 ACCEPT all -- br-83f08846fc2e !br-83f08846fc2e 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT all -- br-83f08846fc2e br-83f08846fc2e 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
300 78566 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
8 472 ACCEPT tcp -- !br-83f08846fc2e br-83f08846fc2e 0.0.0.0/0 172.18.0.2 tcp dpt:80
0 0 ACCEPT tcp -- !br-83f08846fc2e br-83f08846fc2e 0.0.0.0/0 172.18.0.3 tcp dpt:8080
0 0 ACCEPT tcp -- !br-83f08846fc2e br-83f08846fc2e 0.0.0.0/0 172.18.0.5 tcp dpt:8080
0 0 ACCEPT tcp -- !br-83f08846fc2e br-83f08846fc2e 0.0.0.0/0 172.18.0.4 tcp dpt:8080
0 0 ACCEPT tcp -- !br-83f08846fc2e br-83f08846fc2e 0.0.0.0/0 172.18.0.6 tcp dpt:8111
Chain DOCKER-ISOLATION (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- br-83f08846fc2e docker0 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- docker0 br-83f08846fc2e 0.0.0.0/0 0.0.0.0/0
186 13066 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
186 13066 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
原来是防火墙问题。
我用这个 https://unrouted.io/2017/08/15/docker-firewall/作为起点解决了它。
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:FILTERS - [0:0]
:DOCKER-USER - [0:0]
-F INPUT
-F DOCKER-USER
-F FILTERS
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type any -j ACCEPT
-A INPUT -j FILTERS
-A DOCKER-USER -i eth0 -j FILTERS
-A FILTERS -m state --state ESTABLISHED,RELATED -j ACCEPT
# full access from my workstation
-A FILTERS -m state --state NEW -s 192.168.0.10/32
-A FILTERS -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A FILTERS -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A FILTERS -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A FILTERS -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A FILTERS -j REJECT --reject-with icmp-host-prohibited
COMMIT