我正在尝试将我的容器部署到docker swarm集群(docker engine 1.12.1).
docker swarm模式的功能确实令人兴奋,如集群docker,多主机组网.
但是我发现目前为止无法在群集模式下存档(docker 1.12.x),这在使用docker run启动容器时效果很好.
我的主机有用于Intranet网络的eth0,用于Internet网络的eth1.我想只发布docker service createIntranet网络上部署的服务.但是,服务将在创建服务后监听eth0和eth1接口docker service create --name my_web --publish 8000:80 my_web_image.
存档my_web服务的任何解决方案/解决方法只能监听eth0接口?
我正试图找出一种在Docker swarm模式下在服务副本之间实现主动/被动故障转移的正确方法.
该服务将保持一个不会丢失的有价值的内存状态,这就是我需要多个副本的原因.副本将在内部实现Raft,因此只有在给定时刻处于活动状态("领导者")的副本才会接受来自客户端的请求.
(如果你不熟悉Raft:简单地说,它是一个分布式共识算法,它有助于实现主动/被动容错的复制群集.根据Raft,主动副本 - 领导者 - 将其数据的变化复制到被动副本 - 追随者.只有领导者接受客户的请求.如果领导者失败,则在追随者中选出新的领导者).
据我所知,Docker将保证指定数量的副本启动并运行,但它将以主动/主动方式平衡所有副本之间的传入请求.
如何告诉Docker仅将请求路由到活动副本,但仍保证所有副本都已启动?
一种选择是通过另一个NGINX容器路由所有请求,并在每次选出新的领导者时更新其规则.但这将是一个额外的跳跃,我想避免.
我也试图避免使用外部/重叠工具,consul或者kubernetes为了使解决方案尽可能简单.(HAProxy不是一个选项,因为我需要一个Linux/Windows便携式解决方案).所以目前我正在努力了解是否可以单独完成Docker swarm mode.
我遇到的另一种方法是从被动副本返回失败的健康检查.它与技巧kubernetes 根据这个答案,但我不知道它会与码头工人工作.群集管理器如何解释来自任务容器的失败健康检查?
我很感激任何想法.
我在AWS上有2个节点的docker swarm集群.我停止了这两个实例,最初启动了swarm管理器,然后是worker.在停止实例之前,我有一个服务运行,其中4个副本分布在经理和工作人员之间.
当我首先启动swarm管理器节点时,所有副本容器都在管理器本身启动,而根本没有移动到worker.
请告诉我如何进行负载均衡?
当工人开始时,群体经理不负责吗?
docker dockerfile docker-compose docker-swarm docker-container
我试图最终在 Spring Cloud Netflix、Kubernetes 和 Swarm 之间进行选择来构建我们的微服务环境。他们都非常酷,做一些选择是非常困难的。我会稍微描述一下我想要解决的问题。我找不到任何使用 Kubernetes 或 Swarm 设计 Api Gateway(不是简单的负载均衡器)的最佳方法,这就是我想使用 Zuul 的原因。但是从另一方面来说,Api 网关必须使用服务发现,在 Kubernetes 或 Swarm 的情况下,它将被嵌入到管弦乐队中。有了 Kubernetes,我可以使用它的 Spring Cloud 集成,但是这样我将在 Kubernetes 内部进行服务器端发现和客户端发现。我认为这是矫枉过正。我想知道是否有人对他们有一些经验以及对此有任何建议。谢谢。
kubernetes microservices docker-swarm netflix-zuul spring-cloud-netflix
我有一个将net.ipv4.tcp_keepalive_time内核参数设置为 600的 docker 主机。但是当容器运行时,它使用不同的值:
$ sysctl net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 600
$ docker run --rm ubuntu:latest sysctl net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 7200
Run Code Online (Sandbox Code Playgroud)
这是为什么,我该如何更改此值而不必传递--sysctl选项?
--sysctl在我的情况下,我无法通过的原因是该主机是一个 docker swarm 容器,目前swarm不支持此选项。
但是容器不应该只从主机获取这些内核参数吗?我已经重新启动了 docker 服务(及其容器)。
编辑:一些额外的主机信息:
$ uname -r
4.15.0-38-generic
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
Run Code Online (Sandbox Code Playgroud) 我的问题是我可以路由 HTTPS 流量,但我无法将 HTTP 流量全局重定向到 HTTPS。就我而言,我只需要 HTTPS 流量,因此我想重定向所有传入流量。
目前,当我尝试通过 HTTP 提供我的 URL 时收到 404 错误。我已经在 Treafik 中启用了调试日志,但我在日志中看不到任何问题或异常内容。
此外,我在 Stackoverflow 上看到了一个非常相似的主题,但我们发现,他的错误与我的不同:如何使用 Traefik 2.0 和 Docker Compose 标签将 http 重定向到 https?
以下设置基于此处的博客条目:https : //blog.containo.us/traefik-2-0-docker-101-fc2893944b9d
我的设置
我在我的 swarm 中配置了 Traefik,如下所示:
global:
checkNewVersion: false
sendAnonymousUsage: false
api:
dashboard: true
entryPoints:
web:
address: :80
websecure:
address: :443
providers:
providersThrottleDuration: 2s
docker:
watch: true
endpoint: unix:///var/run/docker.sock
swarmMode: true
swarmModeRefreshSeconds: 15s
exposedByDefault: false
network: webgateway
log:
level: DEBUG
accessLog: {}
certificatesResolvers:
default:
acme:
email: {email} …Run Code Online (Sandbox Code Playgroud) 我们一直遇到一个长期存在的网络问题。简而言之,一个容器无法 ping(或 ssh)另一个容器。有人有额外的时间和我一起思考吗?
我们的设置:
到目前为止我们已经尝试过:
这个问题很大程度上难倒了我们。我们花了很多时间,完成了大部分基本故障排除,以及一些更高级的故障排除(很乐意详细说明)。(但我不认为我已经用尽了我们的选择,所以请毫不犹豫地提出您认为可行的任何建议。)它是不一致的(发生在不同的图像、不同的节点上)、间歇性的和长期存在的(数月)。我们做了两项更改,其中一项是 MAC 地址分配的解决方法(此处解释:https: //github.com/docker/libnetwork/pull/2380;实际的解决方法: https: //github.com/systemd /systemd/issues/3374#issuecomment-452718898),这确实改善了情况,包括从日志中删除 MAC 地址分配错误。我们还升级了此修复程序 ( https://github.com/docker/libnetwork/pull/1935 ),该修复程序处理 IP 重用问题。这也减少了问题(当时没有容器可以通信)。我还使用 netshoot 容器进行了一些基础测试(如果您需要更多信息,请告诉我)。
对于损坏的给定容器,我们有一个解决方法:我们删除该容器的 Consul 数据,然后停止并重新启动它。据我所知,这似乎不是 Consul 数据本身的问题,而是来自 Docker/Swarm 在容器启动时重置了多个网络配置(如果这似乎引发了任何人的思考,我可以说更多)阅读)。然后,该容器通常可以 ping 通其他容器,但并非总是如此。
具体问题:
似乎有一段时间情况可能会更糟。它不一定与同时启动多个容器相关,但有一个比较清晰的模式:在某些时间窗口内,容器无法正确配置以相互通信。您想到了哪些故障排除步骤?
下面的内容是尝试82afb0dccbcc从另外两个容器 ping 一个容器 ( ) 的输出。一开始会失败,但后来就成功了。
我第一次尝试对容器执行 ping 操作,地址为2019-12-10T23:57:52+00:00:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82afb0dccbcc: user___92397089 crccheck/hello-world
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PING 82afb0dccbcc (172.24.0.165) 56(84) bytes of data.^M
^M
--- 82afb0dccbcc ping statistics ---^M
4 …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序在 Linux 上的 docker swarm 中运行。我需要附加调试器 (gdb),但出现错误:
ptrace: Operation not permitted.
Run Code Online (Sandbox Code Playgroud)
研究使我使用“cap_add”,但这不适用于游泳应用
https://docs.docker.com/compose/compose-file/#cap_add-cap_drop
cap_add, cap_drop
添加或删除容器功能。有关完整列表,请参阅 man 7 功能。
cap_add: - 所有
cap_drop: - NET_ADMIN - SYS_ADMIN
Run Code Online (Sandbox Code Playgroud)Note: These options are ignored when deploying a stack in swarm mode with a (version 3) Compose file.
我意识到我可以使用 cap_add 手动启动容器并像这样调试,但我更喜欢调试而不必先停止应用程序。
有没有办法向集群部署的应用程序添加功能(特别是 SYS_PTRACE),以便调试器可以工作?
version: "3"
services:
mongo:
image: mongo
working_dir: /c/data/
ports:
- 27017:27017
deploy:
replicas: 1
volumes:
- /c/data/:/data/db
Run Code Online (Sandbox Code Playgroud)
我在上面的堆栈文件中尝试过,但我收到退出代码 14 错误,请给我有关错误的解决方案,
docker-swarm ×10
docker ×8
kubernetes ×2
containers ×1
dockerfile ×1
flynn ×1
mongodb ×1
netflix-zuul ×1
networking ×1
nginx ×1
ping ×1
ssh ×1
stack ×1
traefik ×1