给docker配置指定ip

本文主要使用docker network进行ip的配置(本文主要使用一个容器来试验)

1、创建一个简单容器,并查看它的详细信息

        1.1 创建容器

        1.2 查看IP信息

2、查看docker 网络信息

        2.1 查看docker网络列表

        图中bridge是我这里docker的默认桥接网络,通过查看网络详细信息我们可以发现,我们的test容器使用的是bridge如下:

        [root@192 ~]# docker network inspect bridge 
[
    {
        "Name": "bridge",
        "Id": "40b01687a277bf4622dc67bd454eb1f9d6bbab6bf0c547843254c852b680661d",
        "Created": "2023-06-16T20:22:32.094125218+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "b015805631839406a7ef4ced2b2cd810dc6b7a08d26f02792858598eec436a46": {
                "Name": "test",
                "EndpointID": "d4ddc395b7185a61b0a4008f28286c74bf701493357225656a363bfe8f80e99c",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
 

        而我们尝试修改test的ip时,系统会指出“用户指定的IP地址仅在用户定义的网络上支持”,如下图:

         所以如果我们要指定容器的ip,我们就要使用自己定义的网络。(同时,当我们使用自己定义的网络但是没有分配指定ip的时候,ip的分配将由容器依照容器启动的顺序,在对应的网段内从2开始往后分配)。

        3、自定义容器网络

docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 test

        --driver        设置网络模式, bridge 为桥接模式(可以不写,默认为桥接)

        Docker有四种网络模式
        host:容器和主机共享一个网络。
        container:容器和另外一个容器共享一个网络。
        none:不进行网络连接。
        bridge:默认配置,桥接模式。

        --subnet 设置网段(可以不写,默认为当前所有网段中数值上最大的网段+1的网段,比如当前数值上最大的网段是172.20.0.0/16,则不写的话默认为172.21.0.0/16)

172.18.0.0/16         主机部分全0

        --getway 设置网关(可以不写,不写的话,就没有)

172.18.0.1                一般是主机部分的数值从1开始递增,有n个网关,按理就是172.18.0.2

                                 到172.18.0.n(n<256)

4、配置ip

         此时ip为空是因为当前容器还没有打开,只有当容器打开的时候,docker才会开始给容器分配ip,而当ip没有被定义的时候,一般ip默认是从2开始依次递增(一般网关主机部分的数值是1)。

ps:docker自动分配是基于当前网络中的ip的,而我们自定义ip是固定的,也就是说,如果你定义了172.18.0.2这个ip,而当有一个容器的ip是由docker自动分配的时候,此时如果自定义ip的容器没开启的话,docker分配的ip依旧是从172.18.0.2开始,而因为这两个ip相同,所以如果先开启docker自动分配ip的容器,我们自定义ip的容器在开启的时候就会发生ip冲突从而启动失败。

5、测试

        我们从起docker再打开test查看进行测试

        如此,我们就配好固定ip啦

6、常见问题

序号 报错 翻译 理由 解决方法
1 Error response from daemon: User specified IP address is supported on user defined networks only 来自守护进程的错误响应:用户指定的IP地址仅在用户定义的网络上支持 我们只能指定在我们自定义的网络上支持的IP 无,但是如果只是为了配置固定ip,可以自定义网络进行配置
2 Error response from daemon: Address already in use ip地址已在被使用

1、自定义的ip已被分配,可能是自动分配的时候分配掉的

2、在修改容器ip时,如果容器此时开着,并且修改的网段与当前网段一致,也会有可能出现这个问题

1、先开启自定义ip的容器

2、先关闭容器,并断开网段,否则修改可能会不起作用。

        6.1 ip无法被自定义

         6.2 ip冲突

        6.3 等等等系列问题……

                错误待开发