DoC++ker网络是Docker容器间以及容器与宿主机之间通信的基础,它提供了一套灵活的网络配置方案,允许用户自定义网络拓扑,从而满足不同应用场景的需求。
Docker提供了多种网络模式,每种模式有不同的网络隔离和连接方式,主要包括:
容器要想访问外部网络,需要本地系统的转发支持。
sysctl net.ipv4.ip_forward
[root@localhost ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
如果为 0,说明没有开启转发,则需要手动打开。
sysctl -w net.ipv4.ip_forward=1
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1
如果在启动 Docker 服务的时候设定 --ip-forward=true,那么 Docker 就会自动设定系统的 ip_forward 参数值 为 1。
在Docker中,可以使用以下命令来进行网络配置:
# 查看网络列表 docker network ls # 查看一个Docker网络的详细信息 docker network inspect [网络名称] # 断开容器与网络的连接 docker network disconnect [网络名称] [容器名称或ID] # 删除一个已存在的Docker网络 docker network rm [网络名称] # 创建一个名为 my-bridge-network 的Docker桥接网络,并指定子网和网关 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my-bridge-network # 启动容器时指定网络(--net [网络名称]) docker run -d -p 8090:80 --mount type=volume,source=nginx_volume,target=/usr/share/nginx/HTML --name nginx-container --net my-bridge-network nginx:latest # 启动容器时指定网络和固定IP地址 docker run -d --net [网络名称] --ip [新的IP地址] --name [容器名称] [镜像名称] # 将容器连接到一个已存在的Docker网络 docker network connect [网络名称] [容器名称或ID]
示例:
1)创建自定义桥接网络
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my-bridge-network cf8f2d55247f6c854dae9241858455445e1e1cad7c82a8bec47265fac9275122 [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 592cddf71fad bridge bridge local c1993b581192 host host local cf8f2d55247f my-bridge-network bridge local c21728fbfa4d none null local
2)启动容器时指定网络
[root@localhost ~]# docker run -itd --net my-bridge-network --name busybox-container-1 busybox ea264b47898086b2209686fef01e07c5981704dcaab28e8eba833da2ddaff74d [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea264b478980 busybox "sh" 4 seconds aGo Up 3 seconds busybox-container-1
3)启动容器时指定网络和固定IP地址
[root@localhost ~]# docker run -itd --net my-bridge-network --ip 192.168.4.110 --name busybox-container-2 busybox cc10a9bb6f9514eb2182cae9973dc6e1a63421f80d42af909b36aa108f03f83d [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cc10a9bb6f95 busybox "sh" 8 seconds ago Up 7 seconds busybox-container-2 ea264b478980 busybox "sh" 3 minutes ago Up 3 minutes busybox-container-1
4)检查两个容器间的网络是否能连通
[root@localhost ~]# docker exec -it busybox-container-1 ping busybox-container-2 PING busybox-container-2 (192.168.4.110): 56 data bytes 64 bytes from 192.168.4.110: seq=0 ttl=64 time=0.209 ms 64 bytes from 192.168.4.110: seq=1 ttl=64 time=0.354 ms 64 bytes from 192.168.4.110: seq=2 ttl=64 time=0.218 ms 64 bytes from 192.168.4.110: seq=3 ttl=64 time=0.141 ms 64 bytes from 192.168.4.110: seq=4 ttl=64 time=0.104 ms ^C --- busybox-container-2 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 0.104/0.205/0.354 ms
可以看出这两个容器间的网络是连通的。
5)启动一个容器但不指定网络
[root@localhost ~]# docker run -itd --name busybox-container-3 busybox 55ef9654c71a499dec30b7f0ad30ede6db819cbe5c32c4b2cb27597337ca6833 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 55ef9654c71a busybox "sh" 3 seconds ago Up 3 seconds busybox-container-3 cc10a9bb6f95 busybox "sh" 12 minutes ago Up 12 minutes busybox-container-2 ea264b478980 busybox "sh" 15 minutes ago Up 15 minutes busybox-container-1 [root@localhost ~]# docker exec -it busybox-container-1 ping busybox-container-3 ping: bad address 'busybox-container-3'
可以发现不同网络下的两个容器间是 ping 不通的。
6)使用 docker network connect 命令可以使得原本不在同一网络下的容器之间也能够互相通信
在 Docker 中,docker network connect [网络名称] [容器名称或ID] 命令主要用于将一个已存在的容器连接到另一个已存在的网络上。
[root@localhost ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 10
可以发现这时候就可以 ping 的通了。
7)查看容器的 /etc/hosts 信息
[root@localhost ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 11
8)查看一个Docker网络的详细信息
[root@localhost ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 12
至此本文就全部介绍完了,希望对您有所帮助!