基于本文回答

如何在启动容器时为其指定静态的 IP 地址?需要满足什么前提条件?

知识点图片

在 Docker 中,为容器指定静态 IP 地址是完全可以实现的。

要实现这一目标,最核心的前提条件是:不能使用 Docker 默认的 bridge 网络,而必须创建并使用一个自定义的网络(通常是自定义的 bridge 网络)。

下面详细介绍前提条件和具体的操作步骤。


一、前提条件

  1. 必须使用自定义网络:
    Docker 默认的 bridge 网络(即不指定网络时容器默认连接的网络)不支持在启动时指定静态 IP。如果你尝试在默认网络上指定 IP,Docker 会报错。
  2. IP 地址必须在子网范围内:
    你指定的静态 IP 必须属于你创建的自定义网络子网(Subnet)范围内,且不能与已被占用的 IP 冲突。
  3. 不能使用 host 或 none 网络模式:
    静态 IP 仅适用于 bridge(桥接)和 macvlan 等网络驱动。

二、具体操作步骤

第一步:创建一个自定义桥接网络

你需要使用 docker network create 命令创建一个自定义网络,并使用 --subnet 参数显式指定一个子网段。

bash
docker network create --subnet=172.18.0.0/16 my_custom_network
  • my_custom_network:自定义网络的名称。
  • 172.18.0.0/16:定义的子网范围(你可以根据需要修改,例如 192.168.50.0/24)。

第二步:启动容器并指定静态 IP

在启动容器时,使用 --net 参数连接到刚刚创建的网络,并使用 --ip 参数指定静态 IP。

以启动一个 Nginx 容器为例:

bash
docker run -d \
  --name my_nginx_container \
  --net my_custom_network \
  --ip 172.18.0.100 \
  nginx
  • --net my_custom_network:将容器连接到自定义网络。
  • --ip 172.18.0.100:为容器分配静态 IP(必须在 172.18.0.0/16 范围内)。

第三步:验证 IP 地址

你可以使用 docker inspect 命令来查看容器是否成功获取了该静态 IP:

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

输出应该为:172.18.0.100。


三、使用 Docker Compose 的实现方式

如果你使用 Docker Compose,可以在 docker-compose.yml 文件中这样配置:

yaml
version: '3'

services:
  web:
    image: nginx
    container_name: my_nginx
    networks:
      my_net:
        ipv4_address: 172.18.0.100  # 指定静态 IP

networks:
  my_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16     # 定义子网

四、注意事项

  1. IP 冲突:Docker 不会允许两个容器在同一个网络中拥有相同的静态 IP。如果 IP 已被占用,容器将无法启动。
  2. 网关 IP:通常,自定义网络子网的第一个可用 IP(例如 172.18.0.1)会被 Docker 默认分配给网关(Gateway),请避免将此 IP 分配给容器。
  3. 跨主机通信:如果你需要跨多台物理机为容器指定静态 IP,应该使用 macvlan 驱动或配合 Kubernetes/Consul 等编排和网络工具,而不是简单的 bridge。
右滑查看面试常问