Docker Swarm 全局模式问题

Docker Swarm global mode issue

我正在尝试使用 Docker Swarm 创建一个 php: apache 服务。我有 3 个节点,经理,节点 1,节点 2。 我已经创建了 Docker 文件 file:

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

有人可以向我解释为什么会这样吗?

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

您使用 Dockerfile 创建具有内置 html 内容的图像的初始方法也按计划进行。不幸的是 docker 堆栈部署不支持“构建:”节点。

要继续使用该方法,您可以将 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