网站位于独立容器中,而不是成群

时间:2018-09-15 22:48:16

标签: docker docker-compose

我在Windows Server 2016上运行的Docker CE包含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群,我使用docker swarm init和2377端口上主机的IP地址。

这是我使用撰写文件部署Docker堆栈的方式

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

任何指导将不胜感激。

非常感谢

1 个答案:

答案 0 :(得分:0)

从注释中的对话来看,问题出在堆栈上。

Docker堆栈仅支持用于部署和副本的映像。我相信您的图片是自定义的,既不在dockerhub中,也没有任何私人仓库中。因此,当您尝试将其部署在堆栈中时,正在工作节点中部署的服务找不到该映像,并且无法从回购中下载它。因此,该服务不会在工作程序节点中启动。它在管理器节点中完美运行,因为该图像已经存在于该节点中。

因此,您必须设置本地/私有注册表或将映像推送到docker注册表,否则甚至可以使用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的位置,第二个副本抛出已经使用的端口错误。

供您参考。

  1. Deploy a registry server
  2. Test an insecure registry
  3. Docker service mode(检查为什么将具有两个副本的服务部署在docker service create上的同一主机中)
  4. Docker save
  5. Docker load