我知道docker-swose与docker-swarm(现在是遗留的)能够在一个节点上共同调度一些服务(使用依赖性过滤器,如链接)
我想知道使用现代docker引擎群模式和Docker 1.13中引入的新堆栈部署是否可以实现这种协同调度
在docker-compose文件版本3中,在群集中部署堆栈时会说链接被忽略,因此显然链接不是解决方案.
我们有一堆服务器来运行批量短期运行的作业,它们之间的网络速度不是很高.我们希望在一台服务器上运行每个批处理作业(由多个容器组成),以避免网络开销.这个功能是在docker stack或docker swarm模式下实现的,还是我们应该使用传统的docker-swarm?
此外,我找不到放置策略中与另一个容器的共同调度.
我正在使用官方的RabbitMQ Docker镜像(https://hub.docker.com/_/rabbitmq/)
我rabbitmq.config在运行后尝试编辑容器内的文件
docker exec -it <container-id> /bin/bash
但是,这似乎对容器中运行的rabbitmq服务器没有影响.由于Docker启动了一个全新的实例,因此重启容器显然没有帮助.
所以我假设配置rabbitmq.configDocker容器的唯一方法是在容器开始运行之前设置它,我可以部分地使用图像支持的环境变量.
遗憾的是,环境变量并不支持所有配置选项.举例来说,我想设置{auth_mechanisms, ['PLAIN', 'AMQPLAIN', 'EXTERNAL']}在rabbitmq.config.
然后我找到了RABBITMQ_CONFIG_FILE环境变量,这应该允许我指向我想用作conifg文件的文件.但是,我试过以下没有运气:
docker service create --name rabbitmq --network rabbitnet \
-e RABBITMQ_ERLANG_COOKIE='mycookie' --hostname = "{{Service.Name}}{{.Task.Slot}}" \
--mount type=bind,source=/root/mounted,destination=/root \
-e RABBITMQ_CONFIG_FILE=/root/rabbitmq.config rabbitmq
Run Code Online (Sandbox Code Playgroud)
默认rabbitmq.config文件包含:
[ { rabbit, [ { loopback_users, [ ] } ] } ]
Run Code Online (Sandbox Code Playgroud)
一旦它开始,它就在容器中
配置rabbitmq.configDocker容器内部的最佳方法是什么?
我们在 4 个节点上有 Docker Swarm 模式 (17.09.0-ce)。我们正在尝试使用docker stack deploy和部署 10 项服务docker-compose.yml。每个服务都有所需的内存和内存限制docker-compose.yml。
一些服务被杀死:
$ docker service ps st_master_xwiki
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
s900hx36b70d st_master_xwiki.1 docker-stage.ipsoft.com/apollo-xwiki:master dyn-10-140-175-140.rnd.cloud.ipsoft.com Running Running 3 hours ago
52gzwwyipky0 \_ st_master_xwiki.1 docker-stage.ipsoft.com/apollo-xwiki:master dyn-10-140-175-123.rnd.cloud.ipsoft.com Shutdown Shutdown 3 hours ago
Run Code Online (Sandbox Code Playgroud)
容器日志没有任何内容:
# docker logs 0578be3e943d134ae71f38b8354d1b5319bcc8164502555844b5d046ba3dcd0f
Starting Jetty on port 4424, please wait...
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=196m; support was removed in 8.0
2017-10-11 16:52:44.732:INFO::main: …Run Code Online (Sandbox Code Playgroud) 我想知道是否有办法使用从部署容器的主机获取的环境变量,而不是从docker stack deploy执行命令的位置获取的环境变量.例如,假设docker-compose.yml在三个节点Docker Swarm集群上启动了以下内容:
version: '3.2'
services:
kafka:
image: wurstmeister/kafka
ports:
- target: 9094
published: 9094
protocol: tcp
mode: host
deploy:
mode: global
environment:
KAFKA_JMX_OPTS: "-Djava.rmi.server.hostname=${JMX_HOSTNAME} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=1099"
Run Code Online (Sandbox Code Playgroud)
该JMX_HOSTNAME应当从容器部署,不应该成为每个容器相同的值主机服用.有没有正确的方法来做到这一点?
我最感兴趣的是我从中获得的信息docker node ls。Docker将加入的节点的信息存储在哪里?
我需要将一些文件从工作节点上运行的容器复制到管理器主机。这个操作我需要留在经理那里做。
换句话说,如何从管理器访问工作节点上运行的容器?
有人可以帮忙吗?
假设有一个具有 5 个副本的 docker 服务。我想对所有 5 个副本进行休息调用。如果任何副本失败,整个请求就会失败。我想这样做是因为有时容器内的代码停止运行并且不响应其余调用。可以对服务进行一次休息调用,如果任何容器无法返回响应,则整个请求都会失败
docker config ls在我的 Docker Swarm 集群上创建和删除堆栈和服务一段时间后,和返回的列表docker secret ls非常广泛。但是,列出的许多配置和机密都是以前部署的过时遗留物,并且不再被任何正在运行的服务引用。
是否有任何类似于docker system prune的快速等效方法可以清除未引用项目中的配置和秘密存储?
我使用以下撰写文件进行堆栈部署
version: '3.8'
x-deploy: &Deploy
replicas: 1
placement: &DeployPlacement
max_replicas_per_node: 1
restart_policy:
max_attempts: 15
window: 60s
resources: &DeployResources
reservations: &DeployResourcesReservations
cpus: '0.05'
memory: 10M
services:
serv1:
image: alpine
networks:
- test_nw
deploy:
<<: *Deploy
entrypoint: ["tail", "-f", "/dev/null"]
serv2:
image: nginx
networks:
- test_nw
deploy:
<<: *Deploy
placement:
<<: *DeployPlacement
constraints:
- "node.role!=manager"
expose: # deprecated, but I leave it here anyway
- "80"
networks:
test_nw:
name: test_nw
driver: overlay
Run Code Online (Sandbox Code Playgroud)
为了方便起见,我将使用test_serv1running via containerinhost1和test_serv2running …
我将单主机 docker swarm 应用程序设置为全局模式(以便每个服务只有 1 个副本)。由于某种原因,更新 swarm 后,某些服务显示 2/2 副本。看起来新容器启动后旧容器并没有停止。我发现,当替换 mysql 容器时会发生这种情况(并且它是唯一具有order: stop-first内部更新配置的服务)。往往会获得太多副本的服务依赖于数据库,并且在部署时它们会失败,直到数据库准备就绪为止(但由于某种原因,此时有两个副本 - 旧的和新的)。要解决此问题,我需要再次运行部署。
我的环境是由 CI/CD 部署的,它按顺序执行:
现在我实际上有两个问题:
首先,尽管代码没有任何变化,但 mysql 大部分时间都在更新。它构建新的映像(这是可以理解的,因为我做了 image prune -a),然后由于某种原因将其作为新层推送到注册表,然后用完全相同的容器替换旧的 mysql 容器。此行为导致几乎每次我更改任何其他服务时,都会出现上面描述的副本问题。
其次,即使在更新数据库时创建并运行新的容器副本,旧的容器副本也会保留,从而产生过多的副本(并且旧版本会获取 API 调用等所有操作)。
我的 test-swarm.yml 的一部分包含数据库和重复的服务之一:
services:
#BACKEND
db:
image: registry.address/db:latest
user: "${UID}:${GID}"
deploy:
mode: global
update_config:
failure_action: pause
order: stop-first
healthcheck:
test: [ "CMD-SHELL", "mysqladmin --defaults-file=/home/.my.cnf -u root status || exit …Run Code Online (Sandbox Code Playgroud)