从 docker 容器内部连接到主机网络上的 IP 地址

2024-01-31

问题:(简短版本)

使用 Docker 进行应用程序开发时,如何配置 Docker-compose 文件以允许我从 docker 容器内部访问主机网络上服务器的 IP 地址?我不想访问主机本身,而是想访问与主机位于同一网络上的另一台服务器。我还需要让各种 Docker 容器能够相互通信。

允许从 docker 容器内部访问主机网络 IPv4 资源并仍然允许容器间通信的最简洁方法是什么?

所有背景和详细信息如下(又称长版本)。


Setup:

我正在编写一个应用程序,该应用程序轮询 Modbus 服务器以按给定时间间隔收集测量数据。 Modbus 服务器位于我的本地网络上的 192.168.1.50 端口 502。我可以从我的计算机成功 ping 该服务器。

我的开发思路是这样的:

  • 应用程序位于 docker 容器内
  • Mac环境下开发
  • 使用 Django-3.1/postgres 构建 UI 并存储数据(目前)
  • 使用 pymodbus 库来管理应用程序和远程 Modbus 服务器之间的通信

这是创建应用程序环境的 Docker-compose 文件:

version: '3.8'

services:

  db:
    container_name: db
    image: postgres:10.7
    environment:
      POSTGRES_PASSWORD: pwd
      POSTGRES_DB: app_db
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    ports:
      - 5432:5432

  web:
    container_name: web
    build:
      context: ../.
      dockerfile: ./_app/dev/Dockerfile
    volumes:
    - ../.:/app
    ports:
    - 8000:8000
    depends_on:
      - db
    env_file:
      - app.env
    command: ./manage.py runserver 0.0.0.0:8000

这是 Dockerfile:

FROM python:3.8.5-buster

RUN mkdir /app
WORKDIR /app

RUN apt-get update -y
RUN apt-get install inetutils-traceroute -y

COPY ./_app/dev/python_reqs.txt /app/python_reqs.txt
RUN pip install --upgrade pip
RUN pip install -r python_reqs.txt

# Install wait-for-it
COPY ./_app/wait-for-it.sh /usr/local/bin/
RUN chmod u+x /usr/local/bin/wait-for-it.sh

# Configure custom entrypoint to wait for postgres and run webserver
COPY ./_app/dev/custom-entrypoint /usr/local/bin/
RUN chmod u+x /usr/local/bin/custom-entrypoint
ENTRYPOINT ["custom-entrypoint"]

EXPOSE 8000

Problem:

从“web”docker 容器内部,我无法访问主机 LAN 上的 Modbus 服务器。我无法 ping 通其 IP 地址 (192.168.1.50)。

traceroute 192.168.1.50没有提供任何有用的信息。它只是失败了。

当我跑步时docker-compose up创建一个名为“_app_default”的 docker 网络。这是我跑步时得到的结果docker network inspect _app_default:

[
    {
        "Name": "_app_default",
        "Id": "59f0836c2f3017c537f973a38ab3a55ad96e2ed737c4ac111fc0e911fa0c8a67",
        "Created": "2020-09-13T18:51:14.6395366Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "192.168.112.0/20",
                    "Gateway": "192.168.112.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "28af77ef2d6f99812cb392c8f9eca045b150256c464befc3bb249c9de9e653c1": {
                "Name": "db",
                "EndpointID": "d657f2f29699ada859447c919ad2c94195a6e9a7ae7eeb35989560d2717183c5",
                "MacAddress": "02:42:c0:a8:70:02",
                "IPv4Address": "192.168.112.2/20",
                "IPv6Address": ""
            },
            "a8a619d664a27286e276614e549514dff2c15c5c3c44c39e127fec54ec2b5c6b": {
                "Name": "web",
                "EndpointID": "8f1661c6fa24104a70171d1f830e1fe34ed8d89bacd55c9b9d05dc62f64112c0",
                "MacAddress": "02:42:c0:a8:70:03",
                "IPv4Address": "192.168.112.3/20",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "_app",
            "com.docker.compose.version": "1.27.0"
        }
    }
]

我已经尝试过的:

我尝试使用network_mode: "host"在“网络”服务定义中。那没有帮助。

我尽了最大努力通读了 Docker 网络文档,但我找不到针对这种情况的直接解决方案,所以我完全转过来了——不幸的是,我不擅长网络主题——但是:)。我需要“覆盖”网络吗?还是“macvlan”?帮助!

如果 StackOverflow 超级明星能够提供任何帮助,我们将不胜感激。谢谢你!!

-Allan


看起来您的 docker 网络和本地网络的 IP 范围重叠。 要解决这个问题,您需要覆盖 docker 网络地址池,例如

编辑 docker 守护进程配置

$ cat ~/.docker/daemon.json
{
  "debug" : true,
  "default-address-pools" : [
    {
      "base" : "172.31.0.0/16",
      "size" : 24
    }
  ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 docker 容器内部连接到主机网络上的 IP 地址 的相关文章

随机推荐

  • 错误“HttpServletRequest 引用了缺失的 String 类型”

    我正在 struts 中实现一个项目 其中 JSP 页面出现错误 我已经在 Eclipse IDE 中配置了 Tomcat 6 JRE 和 JDK 6 代码是 request getContextPath 错误是 The method ge
  • PHP 依赖注入

    我正在尝试了解依赖注入 并且在很大程度上我理解它 然而 如果由于某种原因 我的一个类依赖于多个类 而不是将所有这些都传递给构造函数中的这个类 是否有更好 更明智的方法 我听说过 DI 容器 这是我解决这个问题的方法吗 我应该从哪里开始使用这
  • 使用 PHPExcel 读取包含合并单元格的 Excel 工作表

    我想完整地阅读 Excel 工作表并使用 AJAX 将每一行发送到另一个页面进行处理 因此 我使用以下代码将 Excel 工作表数据转换为 JSON 数组 参考库中提供的 PHPExcel 示例
  • 如何使一个方法可用于 Rails 中的控制器和模型?

    我的 Rails 应用程序中有一个私有方法来连接到 Amazon S3 执行传递的代码块 然后关闭与 S3 的连接 看起来是这样 def S3 AWS S3 Base establish connection access key id g
  • Tomcat 中 System.setProperty 的范围

    这个问题是 表弟 这个涉及Android https stackoverflow com questions 4483001 scope of system setproperty 但我们在这里Tomcat环境 如果在我的网络应用程序中我设
  • Asp.net core 2 - 文件未发布

    EDIT 有关信息 我正在 macOS 上使用 VS Code 进行开发 我正在尝试将文件包含在我的发布过程中 当前cshtml这代表我的电子邮件模板 我遵循这个thread https github com dotnet sdk issu
  • 为什么 Spring Boot Batch 作业只运行一次?

    我正在使用弹簧靴 我有一个用这些类实现的批处理作业 我的主要课程是 SpringBootApplication ComponentScan com batch PropertySource classpath application pro
  • C++模板:全局对象中的静态成员未初始化

    我有一段简单的 C 代码 其中我通过专门化模板定义了一个模板和一个全局对象 对象构造函数访问专用模板中的静态成员 但事实证明静态成员此时尚未初始化 但对于本地对象 在函数体内定义 它是有效的 我很困惑 我的c 编译器是 g Ubuntu 5
  • 禁用java中的其他声音

    我用 Java 编写了一个程序 使用 pi4j 库在单击 物理 按钮时发出声音 该程序可以工作 但现在它可以互换地播放所有声音 我希望当您单击 2 3 4 或更多按钮时 您只能听到一种声音 这是我希望对您有所帮助的代码 public cla
  • Eclipse 部署程序集 - 在主项目 WEB-INF/lib 内创建依赖项目的 .war?

    我有一个主要的 Web 项目 其中包含部署和通过浏览器访问页面所需的所有内容 然后我有几个 功能 每个功能都是一个单独的项目 可以包含在主项目中 举个例子 我有MainApp and 函数 reportsApp 当构建这些时ant发生以下情
  • 为什么网络浏览器没有内置 jQuery? [复制]

    这个问题在这里已经有答案了 对我来说这似乎是个好主意 或者向 Javascript 本身添加附加功能 因为它只是众多图书馆之一 它可能很受欢迎 但它远不是唯一的选择 它还会导致它冻结在特定版本上并使改进速度慢得多 另外 无论如何也没有什么优
  • org.apache.commons.fileupload.disk.DiskFileItem 未正确创建?

    我正在尝试使用以下示例中显示的代码 创建 DiskFileItem 时出现 java lang NullPointerException https stackoverflow com questions 4120635 java lang
  • 在 bootstrap daterangepicker 中默认选择“本月”范围

    我正在使用 Bootstrap Daterange Picker 它使用以下范围选项 ranges Today moment moment Yesterday moment subtract 1 days moment subtract 1
  • 如何使用 perl 比较日期?

    我如何使用 Perl 比较以下格式的两个日期 dd mon yyyy hh mm ss GMT 例如 2013 年 5 月 12 日 10 10 20 GMT 我无法安装任何外部 Perl 模块 请指教 如果您有 Perl v5 9 5 或
  • 如何使 StackPanel 或 DockPanel 拉伸以适合 WPF 中的容器?

    我有一个Grid作为定义了两列的根容器 只有一行 第一列具有灵活宽度 第二列具有 300px 固定宽度 接下来 我放置了一个ListBox在第二列内部进行水平和垂直拉伸 即填充整个第二列 最后 我定义了一个项目模板ListBox是一个垂直方
  • 在 Windows 7 上更改程序音量

    我想改变程序的音量 而不是master体积 我现在有以下代码 DllImport winmm dll public static extern int waveOutGetVolume IntPtr hwo out uint dwVolum
  • 导入在 __init__.py 中声明的对象

    我无法理解 init py 中声明的对象如何 应该导入到其他文件中 我有一个像这样的目录结构 top lib init py one py 文件内容如下 lib init py a object 库 one py from lib impo
  • 设置正文宽度(以 px 为单位)?

    如何在 JavaScript 中设置以 px 为单位的正文宽度 必须在 chrome ff 和我们心爱的 ie 中工作 edit 当弹出对话框并且隐藏水平滚动条时必须使用它 然后我必须补偿丢失的16px 否则整个网站会稍微向右移动 也许你有
  • Jackson @JsonProperty 注解在 kotlin 数据类中的使用

    科特林 1 2 10 杰克逊模块 kotlin 2 9 0 我在 kotlin 中有以下数据类 data class CurrencyInfo JsonProperty currency info var currencyInfo Curr
  • 从 docker 容器内部连接到主机网络上的 IP 地址

    问题 简短版本 使用 Docker 进行应用程序开发时 如何配置 Docker compose 文件以允许我从 docker 容器内部访问主机网络上服务器的 IP 地址 我不想访问主机本身 而是想访问与主机位于同一网络上的另一台服务器 我还