如何让Docker端口不暴露在公网

在使用Docker容器时,我们通常会将容器中的某些服务通过端口号暴露在公网上,以便其他用户可以访问这些服务。然而,有时我们希望这些服务仅在内部网络中可用,而不暴露在公网上。本文将介绍如何使用Docker来实现这一目标。

问题描述

假设我们有一个运行在Docker容器中的Web应用程序,它监听在容器的80端口上。我们希望这个应用程序仅在内部网络中可用,而不暴露在公网上。换句话说,我们只希望通过容器所在的主机IP地址访问这个应用程序,而不希望通过公网IP地址访问它。

解决方案

要实现这个目标,我们可以使用Docker的网络功能。Docker提供了多种网络驱动程序,例如bridge、overlay和macvlan等。在这里,我们将使用bridge网络驱动程序来创建一个自定义的网络,然后将容器连接到这个网络上。这样,只有连接到这个网络的容器才能相互通信。

以下是解决方案的步骤:

第一步:创建自定义网络

首先,我们需要创建一个自定义的网络。我们可以使用以下命令来创建一个名为my_network的网络:

docker network create my_network

第二步:运行容器并连接到自定义网络

接下来,我们需要运行容器并将其连接到自定义网络。我们可以使用以下命令来运行容器:

docker run -d --name my_container --network my_network my_image

在这个命令中,my_container是容器的名称,my_network是我们在第一步创建的自定义网络的名称,my_image是我们要运行的容器镜像。

第三步:验证网络连接

现在,我们可以验证容器是否成功连接到了自定义网络。我们可以使用以下命令来获取容器的IP地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_container

这个命令将返回容器的IP地址。请记下这个IP地址,我们稍后会用到它。

第四步:禁止公网访问

最后,我们需要配置主机的防火墙规则,禁止容器的端口暴露在公网上。具体的步骤将根据你所使用的操作系统和防火墙软件而有所不同。以下是在Linux上使用iptables来禁止公网访问的示例命令:

iptables -I DOCKER-USER -i eth0 ! -s <container_ip_address> -j DROP

在这个命令中,eth0是主机的网络接口,<container_ip_address>是在第三步中获取到的容器的IP地址。

验证

现在,我们已经完成了所有的设置。我们可以通过主机的IP地址来访问容器中的Web应用程序,但是无法通过公网IP地址来访问。这样,我们就成功地将容器的端口保护在了内部网络中。

流程图

以下是整个过程的流程图:

flowchart TD
    subgraph Docker
        A[创建自定义网络] --> B[运行容器并连接到自定义网络]
    end
    subgraph Host
        C[验证网络连接] --> D[禁止公网访问]
    end

关系图

以下是整个过程的关系图:

erDiagram
    Network ||--o{ Container : "连接"
    Container }--o|| Host : "通信"

通过以上步骤,我们成功地解决了如何让Docker端口不暴露在公网的问题。这样,我们可以保护容器中的服务免受公网的访问,从而提高安全性。