我正试图用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