我计划将 docker-compose 移至 docker-swarm 以用于多节点。
我已经使用过docker-compose
如下方法
version: '3'
services:
python:
container_name: python
build: ./python
command: uwsgi --socket :8001 --module myapp.wsgi --py-autoreload 1 --logto /tmp/mylog.log
volumes:
- ./src:/code
- ./src/static:/static
ports:
- "8082:8082"
expose:
- "8001"
nginx:
image: nginx:1.13
container_name: nginx
ports:
- "8000:8000"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
depends_on:
- python
它对 django 主机来说运行良好。
那么现在我正在尝试使用docker-swarm
。
docker-compose
并且docker-swarm
看起来很相似,但是有一个问题。
我像这样安装了本地驱动器
- ./src:/code
- ./src/static:/static
or here
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
但是在 中docker-swarm
,volumes
这不起作用并且服务从未启动。
(我明白了......这是可以理解的,因为可能有很多节点......)
我想我应该做些改变。
我在 Google 上搜索了一下,发现有一些类似的设置。
services:
python:
volumes:
- src:/code
volumes:
src:
driver: local
但是我不明白如何使用这个...
我应该把我的源代码或者一些配置文件放在哪里?
docker-swarm 常用文件的最佳实践是什么?
答案1
如果您在群集模式下跨多个节点部署映像,则源代码应位于映像内,并且该映像应推送到注册表。将源代码挂载为卷是一种加快开发过程的方法,但正在测试的映像应使用该源代码构建,并COPY
在 Dockerfile 中包含命令,以便在没有卷挂载的情况下使用。
因此,对 Compose 文件的更改是添加指向您自己的存储库的镜像名称,最好带有版本标记。然后每个镜像将有一个 Dockerfile,并在部署堆栈之前构建并推送到注册表。
请注意,container_name、depends_on 和 build 在 swarm 模式下无效。您需要删除对硬编码容器名称的任何依赖项(使用服务名称进行基于 DNS 的发现)。理想情况下,应用程序应使用某种指数退避来测试连通性,直到达到最大限制,或者在wait-for-it.sh
入口点添加类似脚本的内容以验证依赖项在启动应用程序之前是否可用,从而处理依赖项。构建通常从 Compose 文件中移出并移入 CI/CD 系统。然后,Compose 文件从该 CI/CD 工具中接收当前标签名称作为变量。
对于持久数据,您可以使用卷,但如果您希望容器在节点之间迁移时数据能够持久,则该卷应位于 NFS 等网络文件系统上,而不是默认的本地文件系统上。例如我的答案在这里。
对于在 Swarm 集群中的容器之间共享数据,理想情况下,这是通过网络 API(例如所有基于 REST 的微服务)完成的。您还可以将其外部化到在 Swarm 之外运行或为容器环境设计的数据库(CNCF 在其环境中有一些)。您可以使用相同的 NFS 解决方案和卷安装来执行此操作,但请注意,您可能需要处理文件锁定和更高的延迟。