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
我正在尝试使用 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 不会对卷做任何特殊的事情,所以如果你有一个主机卷,在该主机上安装一个路径,你需要在容器可以 运行 的每个主机上预填充该目录。正因为如此,许多人选择在图像中包含静态内容以避免需要体积。或者您可以使用
您使用 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