Contents

从Docker容器连接到主机中的资源

1. 概述

使用 Docker 时,从Docker 容器 连接到主机中的应用程序并不少见。例如,当我们对应用程序进行 docker 化时,它需要的一些组件可能还没有被 docker 化。

在这个简短的教程中,我们将了解如何允许容器查看主机中运行的应用程序。

2. 关于Docker中的网络

Docker 容器在某种程度上类似于轻量级虚拟机。它们彼此完全隔离,也与宿主完全隔离。

默认情况下,Docker 会创建一个**bridge 网络。此默认网络不允许容器连接到主机。所以,我们需要做一些额外的配置**。

让我们以在主机中运行的 MariaDB 为例,看看如何实现这一点。

3. 监听 Docker 网络中的连接

为了更好地理解这个选项,让我们看一下安装了 Docker 的主机的典型网络接口列表

$ ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:A7:6A:EC:A9  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
...
eth0      Link encap:Ethernet  HWaddr 00:15:5D:40:01:0C  
          inet addr:172.23.119.182  Bcast:172.23.127.255  Mask:255.255.240.0
...
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
...

** bridge连接docker0( IP 地址为 172.17.0.1)由 Docker 在安装时创建。因为主机和所有容器都连接到该网络,我们的应用程序只需要监听它**。

假设我们在主机上安装了 MariaDB。MariaDB 配置提供属性bind_address来指示 MariaDB 服务器将在哪里侦听连接:

bind-address = 172.17.0.1

上面的配置将使 MariaDB 可用于所有容器。现在我们可以从容器中访问它,只需使用:

$ mariadb -h 172.17.0.1

我们以 MariaDB 为例。几乎所有使用 TCP(或 UDP)的应用程序都允许我们以一种或另一种方式配置监听地址。

4.将网络设置为主机

实现我们目标的最简单方法是使主机和容器共享相同的网络命名空间。

我们可以通过使用host网络模式而不是默认模式(bridge)来做到这一点。使用此配置,容器将能够直接访问主机网络

为此,我们可以使用–network host 参数:

$ docker run --rm -it --network host alpine sh

现在,localhost地址 (127.0.0.1) 将引用主机的localhost接口,而不是容器的接口。因此,我们可以通过连接到localhost从容器中访问我们的 MariaDB :

$ mariadb -h 127.0.0.1

请注意,使用此配置,容器将可以访问任何主机网络接口中的任何 TCP 或 UDP 端口。