docker - 网站在独立容器中可用,而不是在群中
问题描述
我有 Docker CE 在 Windows Server 2016 上运行,带有 2 个图像。
当我在容器中运行这些时,一切都很好。
docker run --detach --name Website1 --publish 94:94 webimage1
docker run --detach --name Website2 --publish 95:95 webimage2
我可以通过其他PC上的浏览器访问:
现在我想成群地运行它们。
我已经完成了 docker 教程并设置了 docker-compose 文件,包括服务、端口映射。该设置具有 1 个副本的网站 1、2 个副本的网站 2。
docker stack services websites
端口号显示如下。
Website1: *:94->94/tcp
Website2: *:95->95/tcp
但我无法使用以下网址访问它们中的任何一个:
我明白了 - 无法访问此网站
如果我回到我正在运行的容器之一,我会看到端口号具有不同的格式。
0.0.0.0:94->94/tcp (WORKING) VS *:94->94/tcp (NOT WORKING)
为了初始化 docker swarm,我docker swarm init
在端口 2377 上使用了主机的 IP 地址。
这是我使用 compose 文件部署 docker stack 的方式
docker stack deploy --compose-file docker-stack.yml websites
docker-stack.yml文件供参考。
version: "3"
services:
website1:
image: website1:latest
ports:
- 94:94
depends_on:
- website2
deploy:
replicas: 1
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
website2:
image: website2:latest
ports:
- 95:95
deploy:
mode: replicated
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
任何指导将不胜感激。
非常感谢
解决方案
从评论中的对话来看,问题出在堆栈上。
Docker 堆栈仅支持用于部署和副本的映像。我相信您的图像是自定义图像,既不在 dockerhub 也不在任何私人仓库中。因此,当您尝试在堆栈中部署它时,部署在工作节点中的服务找不到这样的图像并且无法从 repo 下载它。因此服务不会在工作节点中启动。它在管理器节点中完美运行,因为图像已经存在于那里。
因此,您必须设置本地/私有注册表或将图像推送到 docker 注册表,否则您甚至可以使用将图像从管理节点复制到工作节点,然后尝试使用 swarm 并在堆栈中部署它会起作用docker save
。docker load
请注意,在使用 swarm 和注册表时,在部署堆栈时,如果您使用注册表身份验证,则docker stack deploy -c composefile.yml test
必须通过,否则其他节点可能无法通过注册表进行身份验证,如果找不到,将导致无法下载图像。--with-registry-auth
docker stack deploy -c composefile.yml test --with-registry-auth
另请注意,如果您设置没有自签名证书或使用自签名证书的本地私有仓库,您可能需要配置不安全的注册表。我已经给出了相同的参考。
我建议设置一个没有任何身份验证和证书的本地存储库,并通过在 daemon.json 文件中添加不安全的注册表来访问它以进行测试。
现在根据您删除 swarm 并尝试使用运行 docker 服务的最后一条评论
docker service create --replicas 2 --name contentlinksapi --publish mode=host,target=94,published=94,protocol=tcp contentlinksapi
它抛出已经在使用的端口,因为它试图在同一台机器上创建 2 个副本。第一个副本因此绑定到端口 94,第二个副本抛出端口已在使用错误。
供你参考。
- 部署注册服务器
- 测试不安全的注册表
- Docker 服务模式(检查以了解为什么服务在同一主机上部署了两个副本
docker service create
) - 码头工人保存
- 码头工人负载
推荐阅读
- python - 在管理页面上添加表时 Django 出错
- excel - 合并来自已关闭工作簿的数据 adodb 方法
- unity3d - Sing app bundle with lost keystore 如何更新?
- scala - 如何在 Scala 中分解我自己的序列 ADT?
- python - RepeatVector 层与 Concatenate 层相同吗?
- c++ - 将对象的值保存在向量中,并将指针保存在地图中。这个对吗?
- javascript - 为什么向按钮添加类仅在第二次单击后才有效?
- video - ffmpeg 出错,错误为设置`-profile:v main` 初始化输出流 0:0
- javascript - 无法在jQuery中(两者)之前和之后插入元素
- node.js - “构建成功”后 Heroku 应用程序错误