我正在尝试在堆栈部署后向堆栈添加服务。但是这个新服务在与堆栈内的服务(redis)通信时遇到了麻烦。
这是我目前对堆栈和服务的理解,如果有任何不准确之处,请告诉我。
堆栈是服务之上的抽象,它提供有用的实用程序,例如 DNS,因此堆栈中的服务可以相互通信。堆栈允许我们在逻辑上分离出可能运行在同一个群上的服务组(因此不同的开发团队可以共享同一个群)。
我想首先将一个堆栈部署到一个 swarm 中(通过 compose 文件),然后定期添加容器,就像这篇关于一次性容器的文章中描述的那样。这些容器是不同的,因为它们正在执行长时间的、有状态的操作。他们需要在一些初始状态下启动,完成他们的工作,然后离开。它们是不同的,因为它们不需要复制或负载平衡。
基本上我想做的是:
像这样启动一个“堆栈”:
docker stack deploy --with-registry-auth --compose-file docker-compose.yml my-stack
然后一段时间后,当满足某些条件时,添加一个这样的容器:
docker service create -name statefulservice reponame/imagename
这通常按预期运行,除了 statefulservice 无法与 my-stack 中的 redis 通信。
我相信 statefulservice 的设计是正确的,因为当它被添加到 docker-compose.yml 时,它会按预期运行。
可能相关也可能不相关的进一步细节是,创建新服务的命令是从 swarm 中的容器发出的。这是使用 go sdk for docker 发生的,我正在按照一次性容器文章描述的方式使用它
我怀疑这无关紧要的原因:当我仅通过 docker-cli 执行此操作时(并且不使用 docker sdk for go),我仍然遇到这个问题。
docker docker-compose docker-swarm docker-swarm-mode docker-stack
docker-compose.yml 这是我的docker -compose文件,用于使用docker -stack在多个实例中部署服务.正如您所看到的那样,应用程序服务是在两个节点中运行的laravel和其中一个节点中的数据库(mysql).
完整代码存储库: https ://github.com/taragurung/Ci-CD-docker-swarm
version: '3.4'
networks:
smstake:
ipam:
config:
- subnet: 10.0.10.0/24
services:
db:
image: mysql:5.7
networks:
- smstake
ports:
- "3306"
env_file:
- configuration.env
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
deploy:
mode: replicated
replicas: 1
app:
image: SMSTAKE_VERSION
ports:
- 8000:80
networks:
- smstake
depends_on:
- db
deploy:
mode: replicated
replicas: 2
Run Code Online (Sandbox Code Playgroud)
我面临的问题. 1.虽然当我检查服务日志时服务处于运行状态,但我可以看到仅在一个节点中成功迁移而在另一个节点中没有运行.请参阅下面的日志
部署独立容器时,我可以使用自定义选项将 /dev/shm 挂载为 tmpfs,如下所示:
docker run --name my-container -v /dev/shm --tmpfs /dev/shm:rw,nosuid,nodev,exec,size=90g my-image
Run Code Online (Sandbox Code Playgroud)
但是,在使用docker stack deploy. 此处的文档中似乎没有任何相关信息。与以下docker-compose.yml
version: '3.6'
services:
master:
image: "my-image"
ports:
- "8080:8080"
volumes:
- type: tmpfs
target: /dev/shm
Run Code Online (Sandbox Code Playgroud)
/dev/shm使用默认选项安装。如何使用/dev/shm选项安装?(rw,nosuid,nodev,exec,size=90g)docker stack deploy
在 docker-sompose 中:
services:
srvA:
(..)
networks:
- backend
srvB:
(..)
networks:
- frontend
networks:
frontend:
driver: overlay
backend:
driver: overlay
Run Code Online (Sandbox Code Playgroud)
当我开始docker stack deploy -c docker-compose.yml myname创建网络服务对的顺序是随机的,如果srvA在创建backend网络之前开始,则会出现错误:
无法创建服务 srvA:来自守护程序的错误响应:未找到网络 myname_backend
如何保证网络先于服务创建?
我创建了一个 docker compose *.yml 文件,其中有许多带有指定图像标签的服务。然后我让 docker 为我(在我的本地机器上)部署一个堆栈docker stack deploy -c .\my-compose-file.yml --with-registry-auth dev,它能够运行所有服务。当我docker events同时运行时,我可以image pull在日志中看到消息,因此 docker 会提取丢失的图像。但是当我运行时docker image ls -a,这里不显示拉取的图像。
所以我想知道并想知道,下载的图像有什么实时周期(无论是否从我的驱动器中删除docker stack rm),如果没有,我该如何清理这些图像?
我正在尝试将以下docker-compose部署到docker swarm集群中.
version: '3.2'
services:
jenkins:
image: jenkins/jenkins:lts
ports:
- 8080:8080
volumes:
- ./data_jenkins:/var/jenkins_home
deploy:
mode: replicated
replicas: 1
Run Code Online (Sandbox Code Playgroud)
我确实在docker -compose所在的相同位置有data_jenkins,并将该路径作为卷传递.但为什么抛出源路径不存在.究竟是什么问题.
此外,如果目录不存在-v应该创建它正确.为什么不呢?
我的服务器似乎空间不足,而且我在部署的一些 docker 堆栈方面遇到了一些问题。我花了一段时间才弄明白,但最终我做到了并删除了几个容器和图像以释放一些空间。
我能够运行service docker restart并且它起作用了。但是,存在一些问题:
docker info 说群是“待定”docker node ls显示我唯一的节点(领导者),它是available但它是downjournalctl -f -u docker 说`level=error msg="错误删除任务" error="不兼容的值模块=node/agent/worker node.id="运行时docker service ls,所有服务都有0/1副本。
这是运行时的状态 docker node ls
"Status": {
"State": "down",
"Message": "heartbeat failure for node in \"unknown\" state",
"Addr": "<ip and port>"
},
"ManagerStatus": {
"Leader": true,
"Reachability": "reachable",
"Addr": "<ip and port>"
}
Run Code Online (Sandbox Code Playgroud)
如何让我的服务再次运行?
以下是我的 docker-stack 文件。
\n\nversion: "3"\nservices:\n my-app: \n image: my-image:latest \n volumes:\n - ./certs:/certs \n ports:\n - 6401:6401\n networks:\n my-net: \n ipv4_address: 192.168.0.4\nnetworks:\n my-net:\n external: true\nRun Code Online (Sandbox Code Playgroud)\n\n它在我的机器上运行良好,将证书文件夹绑定到容器内的证书。但是在我的 CI 管道中不起作用,我在 docker-stack-node 映像中部署此服务。我得到的错误是
\n\n\n\n\n“bind”类型的安装配置无效:绑定安装源路径\n不存在。
\n
我读到,如果将主机路径绑定安装到 service\xe2\x80\x99s 容器中,则该路径必须存在于每个 swarm 节点上。所以,我想我需要创建一个命名卷。但是,对于指定卷,我无法指定证书的源路径。这很令人困惑。有人可以帮忙吗?
\n在我们的项目中,我们继承了Docker环境,其中包含一些服务堆栈.
我注意到Docker一旦面临内存限制就重新启动堆栈.
不幸的是,根据我在Docker网站上的问题,我没有找到任何信息,所以我在这里问:
我试图了解 docker compose 健康检查选项是如何工作的。
健康检查:间隔:1分30秒超时:10秒重试:3
我说的对吗,这个配置将每 90 秒轮询一个容器,然后如果容器在 10 秒后超时,那么 swarm 将重试 3 次,之后它将标记容器终止并创建一个新容器替换它
这里的文档 https://docs.docker.com/compose/compose-file/compose-file-v3/
不是很有帮助。
谢谢