Docker 容器映射 IP

在使用 Docker 运行容器时,有时候我们需要将容器内的 IP 地址映射到宿主机上,以便外部程序可以直接访问容器内的服务。这种情况下,我们可以通过 Docker 的网络配置,实现容器 IP 地址的映射。

Docker 网络配置

Docker 提供了多种网络模式,包括 bridgehostoverlay 等。其中,bridge 是最常用的模式,它会为每个容器分配一个独立的 IP 地址,并通过 NAT 的方式与宿主机通信。

实例演示

下面以一个简单的示例演示如何将容器的 IP 地址映射到宿主机上。

首先,创建一个简单的 Python Web 服务,并监听在 0.0.0.0:8000 上:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

接着,创建一个 Dockerfile,构建一个包含上述代码的镜像:

FROM python:3.9

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

CMD ["python", "app.py"]

然后,构建镜像并运行容器:

$ docker build -t my-python-app .
$ docker run -d -p 8000:8000 my-python-app

此时,容器内的 Python Web 服务会监听在 0.0.0.0:8000 上,但是外部无法直接访问这个服务。

容器 IP 地址映射

为了让外部程序能够访问容器内的服务,我们可以手动将容器的 IP 地址映射到宿主机上。首先,查看容器的 IP 地址:

$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>

然后,在宿主机上执行如下命令,将容器的 IP 地址添加到映射表中:

$ sudo ip addr add <container_ip>/32 dev eth0

现在,外部程序就可以通过 <宿主机IP>:8000 访问容器内的 Python Web 服务了。

类图

下面是一个简单的类图,展示了 Docker 容器 IP 地址映射的关键概念:

classDiagram
    class Docker {
        - String networkMode
        + void setNetworkMode(String mode)
        + String getNetworkMode()
        + void mapContainerIP(String containerId, String containerIP)
    }

结论

通过 Docker 网络配置和手动 IP 地址映射,我们可以方便地在容器和宿主机之间建立网络连接,实现各种复杂的应用场景。对于开发人员和系统管理员来说,掌握这些技朧将有助于更好地利用 Docker 的强大功能。