Docker Swarm全局模式问题



我正试图用Docker Swarm创建一个php:apache服务。我有3个节点,manager,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个副本(

[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复制:

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

有人能向我解释为什么会发生这种事吗?

Swarm对卷没有任何特殊处理,因此,如果您有一个主机卷,在该主机上装载一条路径,则需要在每个可以运行容器的主机上预填充该目录。正因为如此,许多人选择在图像中包含静态内容,以避免需要卷。或者,您可以使用像NFS这样的共享文件系统来装载一个公共位置,而不管容器在哪里运行。

您最初使用Dockerfile创建带有内置html内容的图像的方法也已步入正轨。不幸的是,docker堆栈部署不支持";build:";节点。

要继续使用这种方法,您可以将注册表部署到您的群中以存储已发布的图像。

然后,如果您可以修改组成文件:

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

最新更新