我在OSX上运行Docker 1.9.1,并使用Cisco AnyConnect VPN连接到我的私人工作网络。我在Docker容器中运行的一个服务连接到工作网络中的一个DB,从容器内无法访问,但在OSX中可以从容器外访问。如果我直接连接到工作网络,而不是通过VPN,它也可以从容器内访问。我怀疑我可能不得不用docker机器VM进行一些网络配置,但我不确定从这里开始该怎么办。
如果您使用Virtualbox作为docker机器的虚拟机监控程序,我建议您将网络模式设置为桥接适配器。这样,您的虚拟机将像您自己的机器一样单独连接到网络。此外,要收集更多有关故障排除的信息,请尝试从容器计算机命令行ping数据库主机。使用docker exec -it <container-name> /bin/bash
我今天遇到了这个问题,让AnyConnect在不需要拆分隧道或其他VPN客户端(如OpenConnect)的情况下工作。它只需要一点端口转发。
我的设置
- MacOS Sierra 10.12
- VirtualBox 5.0.26
- Docker工具箱1.12.2
- docker vpn助手脚本位于https://gist.github.com/philpodlevsky/040b44b2f8cee750ecc308271cb8d1ab
说明书
-
测试时使用了上述软件配置。
-
确保没有任何虚拟机在运行,并且已断开与VPN的连接。
-
修改第47行,指定不安全的注册表,或者删除"--engine-insecureregistry:5000"参数。
-
在Mac上的shell中执行以下操作:
sudo launchctl unload /System/Library/LaunchDaemons/org.ntp.ntpd.plist
MacOS Sierra解决方案。由于某种原因,启用NTP会导致docker引擎挂起。参见:
https://forums.docker.com/t/docker-beta-for-mac-does-not-work-and-hangs-frequently-on-macos-10-12/18109/7
./docker-vpn-helper
设置端口转发,重新生成TLS证书。
请注意脚本发出的以下行,您需要将它们剪切并粘贴到外壳中。
export DOCKER_HOST=tcp://localhost:2376
export DOCKER_CERT_PATH=/Users/<username>/.docker/machine/machines/default
export DOCKER_MACHINE_NAME=default
连接到您的AnyConnect VPN并测试docker:
docker run hello-world
使用检查Docker Machine VM内的路由
docker-machine ssh default
$ route -n
在一台新机器上看起来像这样:
docker@default:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.2.2 0.0.0.0 UG 1 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 lo
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.99.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
如果你已经创建了很多网络,即通过使用docker-compose
,它可能已经创建了到堆栈的路由,这与你的VPN或本地网络路由相冲突。
docker@dev15:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.2.2 0.0.0.0 UG 1 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 lo
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-7400365dbd39
172.25.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-4db568a601b4
[...]
192.168.80.0 0.0.0.0 255.255.240.0 U 0 0 0 br-97690a1b4313
192.168.105.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
TL;dr
应该可以安全地删除所有网络,使用
docker network rm $(docker network ls -q)
由于默认情况下不会删除活动网络。。。但是运行rm命令时要小心:)