【问题标题】:Docker Swarm global mode issueDocker Swarm 全局模式问题
【发布时间】:2021-05-11 11:31:50
【问题描述】:

我正在尝试使用 Docker Swarm 创建一个 php: apache 服务。我有 3 个节点,管理器,node1,node2。 我已经创建了 Dockerfile 文件:

FROM php:apache
COPY html/ /var/www/html/

还有 docker-compose.yml 文件:

version: "3"
networks:
  network1:

services:
  php:
    build:
      context: ./
      dockerfile: Dockerfile
    image: "php:apache"
    ports:
      - "80:80"
    deploy:
      mode: global
    networks:
      - network1

当我跑步时

docker stack deploy --compose-file docker-compose.yml s2

服务创建正确(3 REPLICAS)

[vagrant@manager php]$ docker service ls
ID             NAME      MODE      REPLICAS   IMAGE        PORTS
ojoz9i15gud4   s2_php    global    3/3        php:apache   *:80->80/tcp

但我无法访问 php 内容,因为我得到了这个:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at 192.168.100.100 Port 80</address>
</body></html>

所以我将卷添加到 docker-compose.yml

version: "3"
networks:
  network1:

services:
  php:
    build:
      context: ./
      dockerfile: Dockerfile
    image: "php:apache"
    ports:
      - "80:80"
    volumes:
      - ./html/:/var/www/html/
    deploy:
      mode: global
    networks:
      - network1

但现在当我创建服务时只在管理器节点中,1 REPLICA:

[vagrant@manager php]$ docker service ls
ID             NAME      MODE      REPLICAS   IMAGE        PORTS
5e9ts14itaow   s2_php    global    1/1        php:apache   *:80->80/tcp

谁能解释一下为什么会这样?

【问题讨论】:

  • 你是否在每个节点上都创建了html目录?
  • @BMitch 谢谢!正是这样

标签: php docker apache docker-compose docker-swarm


【解决方案1】:

Swarm 不会对卷做任何特别的事情,所以如果你有一个主机卷,在该主机上挂载一个路径,你需要在每个可以运行容器的主机上预先填充该目录。正因为如此,许多人选择在图像中包含静态内容以避免需要体积。或者,您可以使用shared filesystem like NFS 挂载一个公共位置,而不管容器在哪里运行。

【讨论】:

    【解决方案2】:

    您最初使用 Dockerfile 创建包含内置 html 内容的图像的方法也步入正轨。不幸的是 docker stack deploy 不支持“build:”节点。

    要继续使用这种方法,您可以将 registry 部署到您的 swarm 以存储已发布的图像。

    那么,如果你可以修改撰写文件:

    services:
      php:
        build:
          context: ./
          dockerfile: Dockerfile
        image: "swarmnode:9000/php:custom"
        ports:
    

    然后以下命令将使用捆绑的 html 构建映像,将其推送到本地注册表,然后部署将从本地注册表引用该映像的堆栈。

    docker-compose build php
    docker push swarmnode:9000/my-php:custom
    docker stack deploy --compose-file compose-file.yml s2
    

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 2020-07-21
      • 2021-12-06
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多