给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 等等等系列问题……
错误待开发