无法从主机访问 Docker 群中的 Web 服务器
Unable to reach web server in Docker swarm from the host
我刚开始在 macOS 上使用 Docker,但在尝试完成 part 4 of the Get Started guide 时卡住了。我创建了两个额外的虚拟机(myvm1
和 myvm2
),将 myvm1
设置为集群管理器,将 myvm2
设置为工作人员。
然后,我使用教程第 3 部分中的 docker-compose.yml
部署了一个包含 5 个 Flask Web 服务器的堆栈。这些进程似乎启动良好,并且分布在两台机器之间,但我无法使用浏览器从主机访问它们。
我应该如何配置端口 forwarding/network 以便能够从 运行 连接 docker 容器的虚拟机主机访问 swarm 中的 Web 服务器?
以下是我的命令列表 运行,其中一些带有结果输出。
$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.100:2376 v18.09.0
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.09.0
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100"
$ docker-machine ssh myvm2 "docker swarm join --token <my-token-inserted-here> 192.168.99.100:2377"
$ eval $(docker-machine env myvm1)
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.100:2376 v18.09.0
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.09.0
$ docker stack deploy -c docker-compose.yml getstartedlab
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
it9asz4zpdmi getstartedlab_web.1 mochr/test_repo:friendly_hello myvm2 Running Preparing 18 seconds ago
645gvtnde7zz getstartedlab_web.2 mochr/test_repo:friendly_hello myvm1 Running Preparing 18 seconds ago
fpq6cvcf3e0e getstartedlab_web.3 mochr/test_repo:friendly_hello myvm2 Running Preparing 18 seconds ago
plkpximnpobf getstartedlab_web.4 mochr/test_repo:friendly_hello myvm1 Running Preparing 18 seconds ago
gr2p8a0asatb getstartedlab_web.5 mochr/test_repo:friendly_hello myvm2 Running Preparing 18 seconds ago
docker-compose.yml
:
version: "3"
services:
web:
image: mochr/test_repo:friendly_hello
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:
看来这是当前版本 boot2docker 的一个已知问题:https://github.com/docker/machine/issues/4608
解决方法是使用基于不需要 boot2docker 的机器(例如 AWS、DigitalOcean 等)的 swarm,等到更新版本的 boot2docker 发布,或使用较早版本的 boot2docker,如 link 中所述。要使用早期版本:
export VIRTUALBOX_BOOT2DOCKER_URL=https://github.com/boot2docker/boot2docker/releases/download/v18.06.1-ce/boot2docker.iso
在使用 docker-machine 创建虚拟机之前。 (首先删除现有的虚拟机,然后使用该导出,然后 docker-machine create myvm1
)
然后,您应该能够启动您的堆栈并通过 192.168.99.100:4000 或 192.168.99.101:4000(或 docker-machine ls 显示的任何 IP 地址)访问您的容器
我刚开始在 macOS 上使用 Docker,但在尝试完成 part 4 of the Get Started guide 时卡住了。我创建了两个额外的虚拟机(myvm1
和 myvm2
),将 myvm1
设置为集群管理器,将 myvm2
设置为工作人员。
然后,我使用教程第 3 部分中的 docker-compose.yml
部署了一个包含 5 个 Flask Web 服务器的堆栈。这些进程似乎启动良好,并且分布在两台机器之间,但我无法使用浏览器从主机访问它们。
我应该如何配置端口 forwarding/network 以便能够从 运行 连接 docker 容器的虚拟机主机访问 swarm 中的 Web 服务器?
以下是我的命令列表 运行,其中一些带有结果输出。
$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.100:2376 v18.09.0
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.09.0
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100"
$ docker-machine ssh myvm2 "docker swarm join --token <my-token-inserted-here> 192.168.99.100:2377"
$ eval $(docker-machine env myvm1)
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.100:2376 v18.09.0
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.09.0
$ docker stack deploy -c docker-compose.yml getstartedlab
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
it9asz4zpdmi getstartedlab_web.1 mochr/test_repo:friendly_hello myvm2 Running Preparing 18 seconds ago
645gvtnde7zz getstartedlab_web.2 mochr/test_repo:friendly_hello myvm1 Running Preparing 18 seconds ago
fpq6cvcf3e0e getstartedlab_web.3 mochr/test_repo:friendly_hello myvm2 Running Preparing 18 seconds ago
plkpximnpobf getstartedlab_web.4 mochr/test_repo:friendly_hello myvm1 Running Preparing 18 seconds ago
gr2p8a0asatb getstartedlab_web.5 mochr/test_repo:friendly_hello myvm2 Running Preparing 18 seconds ago
docker-compose.yml
:
version: "3"
services:
web:
image: mochr/test_repo:friendly_hello
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:
看来这是当前版本 boot2docker 的一个已知问题:https://github.com/docker/machine/issues/4608
解决方法是使用基于不需要 boot2docker 的机器(例如 AWS、DigitalOcean 等)的 swarm,等到更新版本的 boot2docker 发布,或使用较早版本的 boot2docker,如 link 中所述。要使用早期版本:
export VIRTUALBOX_BOOT2DOCKER_URL=https://github.com/boot2docker/boot2docker/releases/download/v18.06.1-ce/boot2docker.iso
在使用 docker-machine 创建虚拟机之前。 (首先删除现有的虚拟机,然后使用该导出,然后 docker-machine create myvm1
)
然后,您应该能够启动您的堆栈并通过 192.168.99.100:4000 或 192.168.99.101:4000(或 docker-machine ls 显示的任何 IP 地址)访问您的容器