Docker - 网络使用详解2(创建自定义网络:user-defined)
容器除了可以直接使用 none、host、bridge 这三个自动创建的网络外,用户也可以根据业务需要创建 user-defined 网络。
(2)执行 docker network ls 命令可以看到 my_net 这个自定义网络已经创建成功了。
(4)我们可以在创建网络时通过 --subnet 和 --gateway 参数来指定 IP 网段。
(5)可以看到这个新的 bridge 网络使用的便是我们指定的 IP 网段。
(2)由于 my_net2 网络 IP 网段为 172.22.16.0/24,这里可以看到容器分配到的 IP 为 172.22.16.2
(3)我们可以在容器启动时通过 --ip 参数指定一个静态 IP,而不是从 subnet 中自动分配。
(4)可以看到容器已经使用我们指定的 172.22.16.8 这个 IP 了。
(2)接着执行 docker-compose up -d 命令启动服务。
(2)启动服务后再次查看 test_my_net 网络,可以发现 bbox3 也加入进来了。
二、创建自定义网络
Docker 提供三种 user-defined 网络驱动:bridge,overlay 和 macvlan。其中 overlay 和 macvlan 用于创建跨主机的网络。本文主要介绍创建 bridge 自定义网络。
1,创建自定义的 bridge 网络
(1)我们执行如下命令通过 bridge 驱动创建一个类似 Docker 自带的 bridge 网络,网络名称为 my_net
docker network create --driver bridge my_net
(2)执行 docker network ls 命令可以看到 my_net 这个自定义网络已经创建成功了。
(3)使用 docker network inspect 命令可以查看这个网络的配置信息,这里的 172.18.0.0/16 是 Docker 自动分配的 IP 网段。
docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
(5)可以看到这个新的 bridge 网络使用的便是我们指定的 IP 网段。
2,使用自定义网络
(1)假设我们容器想要使用前面自定义的网络,在启动时通过 --network 指定即可。
docker run -it --network=my_net2 busybox
(2)由于 my_net2 网络 IP 网段为 172.22.16.0/24,这里可以看到容器分配到的 IP 为 172.22.16.2
注意:只有使用 --subnet 参数创建的网络才能指定静态 IP。如果自定义网络创建时没有指定 --subnet,那么容器启动时指定静态 IP 就会报错。
docker run -it --network=my_net2 --ip 172.22.16.8 busybox
(4)可以看到容器已经使用我们指定的 172.22.16.8 这个 IP 了。
附:使用 Docker Compose 文件创建自定义网络
1,同时创建网络、以及需要加入这个网络的容器
(1)首先创建一个 docker-compose.yml ,具体内容如下:
- 通过 bridge 驱动创建一个自定义网络 my_net。
- 同时运行两个容器,且它们都同属于 my_net 网络。
version: '3' services: bbox1: image: busybox container_name: bbox1 entrypoint: # 容器启动后执行 top 命令,使容器没法立即退出 - top networks: - my_net bbox2: image: busybox container_name: bbox2 entrypoint: # 容器启动后执行 top 命令,使容器没法立即退出 - top networks: - my_net networks: my_net: driver: "bridge"
(2)接着执行 docker-compose up -d 命令启动服务。
注意:由于 docker-compose.yml 文件是在 test 文件夹下,最终创建的自定义网络名则为 test_my_net
(3)执行 docker network ls 命令可以看到 test_my_net 这个自定义网络确实已经创建成功。
(4)执行 docker inspect test_my_net 命令可以发现这个自定以网络中确实包含 bbox1 和 bbox2 这两个容器。
2,加入已存在的网络
(1)假设我们还需再启动个容器 bbox3,并且需要加入现有的 test_my_net 这个网络。那么它的 docker-compose.yml 文件可以这么编写:
version: '3' services: bbox3: image: busybox container_name: bbox3 entrypoint: # 容器启动后执行 top 命令,使容器没法立即退出 - top networks: - my_net networks: my_net: external: name: test_my_net
(2)启动服务后再次查看 test_my_net 网络,可以发现 bbox3 也加入进来了。