AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题

问题[docker-swarm](server)

Martin Hope
Andy
Asked: 2022-04-07 13:04:36 +0800 CST

Docker 容器未在 docker-internal DNS 中注册主机名

  • 0

我使用 Docker 来实现 Nextcloud 服务。为此,我使用了官方的 nextcloud-apache 映像、一个 Nginx 反向代理、certbot 和 MariaDB。没什么特别的,真的。

我的 docker 实例以 swarm 模式运行。所有容器与管理器一起在同一主机上运行,​​每个服务只有一个副本,标准覆盖网络。swarm 是通过使用标准的 compose 文件启动的。

我的设置已经稳定运行了好几个月,直到昨晚它神秘地崩溃了。据我所知,没有任何更新或重新启动,对于操作系统(Ubuntu Server LTS)、Docker-CE 或任何图像(我定期手动进行所有更新,我当然没有在昨晚凌晨 4 点)。我追查到 Nextcloud 容器的原因(但我认为这是一个 Docker 问题,因此我的问题在这里......):

Nginx 反向代理的日志显示以下行:

2022/04/06 20:16:45 [error] 10#10: *3 nextcloud-app could not be resolved (3: Host not found), client: 10.135.40.1, server: <redacted>, request: "GET / HTTP/1.1", host: "<redacted>"

Nginx 无法解析后端服务器并向客户端抛出 502/Bad Gateway。

我检查了一下,Nextcloud 容器(“nextcloud-app”)的主机名确实没有在 docker-internal DNS 中注册(在每个容器的 127.0.0.11 下可用)。我可以登录到任何容器并触发 DNS 请求(在after apt-get update && apt-get install iputils-ping dnsutils容器内运行之后),名称“nextcloud-app”在任何地方都没有解析。例子:

root@nextcloud-app:/var/www/html# nslookup nextcloud-app
Server:     127.0.0.11
Address:    127.0.0.11#53

** server can't find nextcloud-app: NXDOMAIN

所有其他容器名称都按应有的方式解析。解析外部地址也可以。“nextcloud-app”是唯一无法解析的容器名称。

但是,我可以直接使用 docker-internal IP 地址与 nextcloud-app 容器进行 ping 操作。连接在那里,只有 DNS 解析失败。

我不知道如何进一步调试。我一周没有碰我的 compose.yml 文件。据我所知,一切都没有改变。然而,该设置在一夜之间停止工作。

如何强制 Nextcloud 容器在 docker-internal DNS 上注册自己的主机名?任何建议表示赞赏。

domain-name-system docker docker-compose nextcloud docker-swarm
  • 1 个回答
  • 694 Views
Martin Hope
Matt Olan
Asked: 2022-02-06 08:49:23 +0800 CST

确保 Swarm 中节点的 Docker 流量仅通过 VPN 连接

  • 1

我在 Docker Swarm 集群中有两个节点。其中一个节点与接口上的 VPN 提供商有一个 OpenVPN 客户端连接tun0。我的目标是,

  • 分配给该节点的任何服务都专门使用 VPN 连接
  • 无泄漏(即 DNS 或其他流量)
  • 如果 VPN 断开连接,所有流量都会被丢弃
  • 允许服务发现和连接到 Swarm 中的其他容器

对于 DNS,我添加了一个dns条目,/etc/docker/daemon.json该条目使用只能通过 VPN 访问的 VPN 提供商的 DNS 服务器。

以下是我想出的 iptable 规则:

iptables -I DOCKER-USER 1 -o tun0 -j ACCEPT
iptables -I DOCKER-USER 2 -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I DOCKER-USER 3 -j DROP

生成的DOCKER-USER链如下所示:

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  *      tun0    0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  tun0   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

nslookup从运行和打开和关闭 VPN 连接等基本测试来看curl,这些规则似乎有效,但我对 iptables 的经验很少。这是这样做的正确方法吗?

openvpn iptables docker docker-swarm
  • 1 个回答
  • 319 Views
Martin Hope
nbonniot
Asked: 2021-07-13 05:34:24 +0800 CST

CentOS 7 上的 Fail2ban 使用 Docker 驱动的 Traefik 禁令 OK,无需添加 iptables 规则

  • 0

我使用“经典”配置设置了一个由 Docker 引擎在 Swarm 模式下运行的 Traefik 实例(见下文,为简洁起见,我只放置了相关的 [to me] 部分。如果需要,请随时询问更多详细信息)。

已安装 Fail2Ban 以及 firewalld(CentOS 发行版)。到目前为止,我通过观察 Traefik 访问日志进行了简单的过滤器/监狱配置,主要用于阻止 DOS 和暴力破解。

我的问题:当我尝试使用Nikto或Hydra时,我可以看到我尝试使用的 IP 已被列入黑名单:

# fail2ban-client status symfony-auth
Status for the jail: symfony-auth
|- Filter
|  |- Currently failed: 3
|  |- Total failed:     906
|  `- File list:        /var/log/traefik/access.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     2
   `- Banned IP list:   37.19.218.169

但是 iptables 规则部分没有任何变化,我可以看到给定的 IP 没有被阻止。此外,如果我尝试从被禁止的 IP 在网站上导航,即使它被禁止,我也可以做到。

我必须补充一点,我00-firewalld.conf file有关于此发行版操作的默认说明:

# cat /etc/fail2ban/jail.d/00-firewalld.conf
# This file is part of the fail2ban-firewalld package to configure the use of
# the firewalld actions as the default actions.  You can remove this package
# (along with the empty fail2ban meta-package) if you do not use firewalld
[DEFAULT]
banaction = firewallcmd-rich-rules[actiontype=<multiport>]
banaction_allports = firewallcmd-rich-rules[actiontype=<allports>]
backend=systemd

最后,我没有任何时差,比如这里说的。

# tail /var/log/messages
Jul 12 13:28:05 ....
# timedatectl
               Local time: Mon 2021-07-12 13:30:18 UTC
           Universal time: Mon 2021-07-12 13:30:18 UTC
                 RTC time: Mon 2021-07-12 13:30:13
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no


那为什么我的封禁IP还能访问目标网站呢?感谢您的线索和启示。

片段

特拉菲克docker-compose.yml

记录部分

version: "3.3"

services:
  reverse-proxy:
    image: "traefik:v2.4"
    command:
      # Log configuration
      #- "--log.level=DEBUG"
      - "--log.filepath=/var/log/traefik/traefik.log"
      - "--accesslog.filepath=/var/log/traefik/access.log"
     

卷部分:

    # ...
    volumes:
      # To persist certificates
      - traefik-certificates:/letsencrypt
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - /var/log/traefik:/var/log/traefik/
    # ...

Fail2Ban

我的过滤器

/etc/fail2ban/filter.d/my_filter.conf

[Definition]
failregex = ^<HOST>.*"(GET|POST|HEAD).*" (404|444|403|400|301) .*$
ignoreregex =

我的监狱

[my_jail]
 enabled  = true
 port     = http,https
 filter   = my_filter
 logpath  = /var/log/traefik/access.log
 maxretry = 10

客户状态

# fail2ban-client status
Status
|- Number of jail:      2
`- Jail list:   sshd, my_jail
centos configuration fail2ban docker-swarm
  • 1 个回答
  • 600 Views
Martin Hope
Thefeli73
Asked: 2021-02-01 09:10:01 +0800 CST

通过 portainer 访问不同主机的 docker 容器

  • 2

我的 ubuntu 服务器上有一些容器(运行各种服务),我通过 portainer 管理这些容器,portainer 也是这些容器之一。我还想从同一个搬运工界面管理一个 pihole 容器(在不同的服务器(树莓派)上运行)。这些机器位于相同的本地专用网络上。

我读过有关通过 tcp 等代理/公开 docker unix 套接字的人,但这似乎有风险且不安全,更像是一种解决方法。我尝试阅读 docker swarms ,但这似乎是一个不同的用例,但我可能是错的。

非常感谢任何帮助:)

networking docker docker-networking docker-swarm containers
  • 1 个回答
  • 480 Views
Martin Hope
mr.simonski
Asked: 2020-06-30 07:06:01 +0800 CST

cAdvisor - 节点间同步

  • 0

我有一个 docker swarm 运行我们在两台服务器(节点)上的 docker-compose.yml 中定义的业务堆栈。docker-compose 定义了从两个节点中的每一个开始的 cAdvisor,如下所示:

  cadvisor:
    image: gcr.io/google-containers/cadvisor:latest
    command: "--logtostderr --housekeeping_interval=30s"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /:/rootfs:ro
      - /var/run:/var/run
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk:/dev/disk/:ro
    ports:
      - "9338:8080"
    deploy:
      mode: global
      resources:
        limits:
          memory: 128M
        reservations:
          memory: 64M

在第三台服务器上,我在节点 1 和 2 上分别运行 docker 与 docker swarm,该服务器用于运行 Prometheus 和 Grafana。Prometheus 配置为仅抓取 node1:9338 资源以获取 cAdvisor 信息。

我偶尔会遇到这样的问题,即在抓取 node1:9338 时,并非所有在节点 1 和 2 上运行的容器都显示在 cAdvisor 统计信息中。

我假设 cAdvisor 正在 swarm 中同步其信息,以便我能够将 Prometheus 配置为仅使用 node1:9338 作为 docker swarm 的入口点并抓取信息。

或者我是否还必须将 node2:9338 放入我的 Prometheus 配置中才能始终获取所有节点的所有信息?如果是,那么应该如何扩展,因为我需要将每个新节点添加到 Prometheus 配置中。

将 Prometheus 与业务堆栈一起运行在一个集群中是没有选择的。

编辑:我今天在打开 cAdvisor 指标 URL http://node1:9338/metrics 以及 http://node2:9338/metrics 时遇到了一种奇怪的行为,因为我在两个 URL 上看到 node1 上运行的所有容器的相同信息. 请求 http://node2:9338/metrics 时缺少 node2 上运行的容器信息。

可能是 docker-internal 负载平衡正在将请求从 http://node2:9338/metrics 路由到 node1:9338 cAdvisor,因此尽管请求了 node2,但仍显示了 node1 的指标?

prometheus docker docker-swarm
  • 2 个回答
  • 495 Views
Martin Hope
duct_tape_coder
Asked: 2020-06-25 17:58:48 +0800 CST

Docker swarm 作为管理者加入失败,但作为工作者成功

  • 0

我正在使用 Docker CE 19.03 和三台 CentOS 7 机器创建一个 3 管理器 Docker Swarm。

我已经通过 yum 安装了 docker,启用了服务并启动了它。

我创建了一个防火墙“服务”并允许(根据 docker 文档):

  • 用于集群管理通信的 TCP 端口 2377
  • TCP 和 UDP 端口 7946 用于节点之间的通信
  • 覆盖网络流量的 UDP 端口 4789

我能够启动群并加入一个工人。但是,我尝试以经理身份加入的第三台服务器失败了

来自守护进程的错误响应:管理器停止:无法初始化 raft 节点:rpc 错误:代码 = 未知 desc = 无法使用其广告地址连接到预期的新集群成员:rpc 错误:代码 = DeadlineExceeded desc = 超出上下文期限

所以我退出docker swarm leave并尝试以工人身份加入。成功没问题。现在为什么我不能以经理身份加入,但以工人身份成功加入?

我尝试允许 2376/tcp (根据https://www.digitalocean.com/community/tutorials/how-to-configure-the-linux-firewall-for-docker-swarm-on-centos-7)并禁用 firewalld一位经理查看这是否是防火墙问题,但我遇到了同样的错误。

centos7 docker docker-swarm
  • 2 个回答
  • 1120 Views
Martin Hope
Alexander Presber
Asked: 2020-05-05 07:21:49 +0800 CST

在带有主机网络的 docker 中使用 HAProxy

  • 0

在 docker 容器中运行 HAProxy 时,在使用此处--net=host描述的选项运行容器时,我们只能看到(并转发)原始客户端的 IP 。

我们的问题:从安全的角度来看,这样做是否可取?这会让攻击者更容易利用 HAProxy 漏洞吗?还是这是普遍做法?

security docker haproxy docker-swarm coreos
  • 1 个回答
  • 415 Views
Martin Hope
JDT
Asked: 2020-04-27 07:41:12 +0800 CST

带有身份验证标头的 nginx 反向代理

  • 1

我正在尝试将 nginx 配置为作为两个应用程序的反向代理运行:Web 前端 (IIS) 和 .NET Core 后端 (Kestrel),它们都在 docker swarm 中运行。我正在将所有对 /api 的调用重写到后端以及对前端的所有其他调用。

在我当前的设置中,一切正常,直到我登录到应用程序。这使用了 IdentityServer OAuth/OpenID 身份验证服务,导致将 Authorization-header 添加到带有承载令牌的所有调用的请求中。一旦出现此标头,nginx 服务器就会从上游服务器返回超时。这发生在两台服务器上,如果我禁用 auth 标头的传递,nginx 可以正常工作并代理请求。对于前端这不是问题,因为它不需要标头,但后端显然不再起作用。奇怪的是,如果我在某个时候切断了标头(它是一个相当长的字符串),请求就可以工作,但显然我的后端服务返回 500,因为它不再是有效的令牌。

我一直在挠头试图找出问题所在,并且尝试了许多配置选项。看起来请求在 nginx 处停止了,因为代理后面的服务器在失败时甚至都没有收到请求。在 nginx 级别记录结果只是“上游超时(110:操作超时),同时从上游读取响应标头” - 错误甚至增加超时没有做任何事情,这对于没有授权的完全相同的请求是有意义的标题确实有效。

nginx reverse-proxy docker docker-swarm
  • 1 个回答
  • 1559 Views
Martin Hope
Uberhumus
Asked: 2020-04-14 13:51:02 +0800 CST

Docker Swarm 中的任务 ID 有什么用?

  • 0

在 Docker Swarm 中,每个容器都有一个任务 ID 和一个容器 ID。鉴于编排器知道它们运行的​​容器及其容器 ID,为什么还要为它们分配任务 ID?

这两个标识符对于同一个容器都是唯一的,因此它们之间存在一对一的相关性。从这里可以看出,您可以通过以下方式从 Swarm 中的任务 ID 获取容器 ID:

docker inspect -f "{{.Status.ContainerStatus.ContainerID}}" <task_id>

如此处所示,您可以通过以下方式获得相反的结果:

docker inspect --format '{{ index .Config.Labels "com.docker.swarm.task.id"}}' <container_id>

我知道对于连接到编排器的容器,将有更多相关数据与之相关,但是,在我看来,编排器可以根据容器 ID 呈现这些数据,不需要另一个标识符。那么任务 ID 的作用是什么?你能用它完成什么是其他方式无法实现的?

在 AWS ECS 中也有类似的情况,但在 ECS 中,每个任务定义可以有多个容器,并且这些容器将共享一个任务 ID,因此相关性不一定是 1 比 1。

docker docker-swarm
  • 1 个回答
  • 772 Views
Martin Hope
halfer
Asked: 2020-04-11 09:08:30 +0800 CST

是否还有理由将 Consul 与现代(“集成”)Docker Swarm 一起使用?

  • 2

我过去做过一点 Docker Swarm,它非常简单——在一个节点上创建一个 Swarm Manager,在另外两个节点上创建 Swarm Workers,坚持使用一个 Manager。我想了解更多关于 Swarm 的信息,因此我正在关注 Pluralsight 上 Nigel Poulton 的视频系列“Docker Swarm:本地 Docker 集群”。

然而,这些视频比我两年前的 Swarm 体验要复杂得多,可能是因为它们运行在旧(“独立”)版本的 Swarm 上。我想问一个澄清的问题,看看我现在学习的材料是否过于过时而不值得。(我将在下面描述视频课程的内容,因此无需熟悉即可回答问题)。

这个视频系列,现在已经四岁了,展示了如何:

  • 安装一个高可用的Discovery Service(支持Consul、Etcd和ZooKeeper,作者选择Consul)。它使用progrium/consul映像,截至今天已经五年没有更新了
  • 在 Consul 服务器上设置三个 Swarm Manager 节点
  • 设置三个 Swarm Worker 节点,同时安装 Consul 客户端

作者承认这一切都相当复杂,并暗示,在拍摄视频时,核心 Docker 将来可能会简化这些东西。他说(构建您的 Swarm 集群 -> 安装 HA 发现服务 -> 5:39):

我什至会放出一个狂野的平底船,在某些时候,Sw​​arm 甚至可能不需要我们做任何这种发现后端手工制作。只是因为这有点痛苦,如果我知道 Docker 的人的一件事,那就是他们全心全意地为我们提供这种流畅、轻松的 Docker 体验,而这部分并不是此时此刻。

如果我没看错的话,这个功能似乎就是实际发生的事情。从手册:

您正在查看旧版独立 Swarm 的文档。这些主题描述了独立的 Docker Swarm。在 Docker 1.12 及更高版本中,Swarm 模式与 Docker Engine 集成。大多数用户应该使用集成的 Swarm 模式。

诚然,我之前使用 Swarm 的经验只使用了一个 Manager,但据我了解,只需使用docker swarm join-token.

那么对于我的问题:Docker Swarm 的这一特性演变让我想知道 Consul 是否为管理 Swarm 本身提供了任何价值。我可以做吗?我是不是该?它是否提供了比集成 raft 共识系统更多的功能?这种学习材料现在有害吗?

(旁白:我看过这个作者的几个视频,它们很棒——如果这个已经过时了,那是他无法控制的。如果材料需要重新拍摄,那就是课程/平台需要安排的业主)。

docker docker-swarm consul
  • 2 个回答
  • 924 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve