介绍
docker安装好时,默认和创建一个网桥docker0
docker0 相当于一个虚拟的交换机,给容器分配ip
网络配置模式
- bridge :这个是默认配置,相当容器组主机的网络桥接起来
- none: 默认是不配置网络,也不分配网络
- host: 相当于虚拟机的仅主机模式,可以物理机互通,但不可以上网
- container: 相当于的将网络网络放到一个已经有网络的容器中,与该容器共享网络
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b768c4bd8731 bridge bridge local
0d7ef85d0f72 host host local
11e1747f3978 none null local
简单点来说,docker容器启动,虚拟的网卡都是成对存在的。docker在的docker0上开了一个veth9b9d00f@if14的网卡连接的了容器里的eth0@if15,达到一个桥接的结果,实现网络互通!
自定义网络
帮助命令
docker network --help
docker network create --help
创建一个mynet的为bridege的虚拟网卡
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b768c4bd8731 bridge bridge local
0d7ef85d0f72 host host local
68516e4c9b36 mynet bridge local
11e1747f3978 none null local
[root@localhost ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "68516e4c9b36810df729440efe177730ade4209a19b3a2e9f586cfee49942b96",
"Created": "2022-04-17T11:43:32.558890099-04:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
自定义网段的和网关的虚拟网卡
[root@localhost ~]# docker network create mynet1 --subnet 192.168.10.0/24 --gateway 192.168.10.1
3453ddd57b644c775857c7bb479d194ecd1d7db838fbc0cb0107f86f09efa7dd
[root@localhost ~]#
[root@localhost ~]# docker network inspect mynet1
[
{
"Name": "mynet1",
"Id": "3453ddd57b644c775857c7bb479d194ecd1d7db838fbc0cb0107f86f09efa7dd",
"Created": "2022-04-17T11:46:47.125733042-04:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.10.0/24",
"Gateway": "192.168.10.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
启动容器
把容器b1 ,b2分配到我们自定义的网卡当中,
[root@localhost ~]# docker run -it --name b1 --net mynet busybox ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@localhost ~]# docker run -it --name b2 --net mynet1 busybox ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:c0:a8:0a:02 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.2/24 brd 192.168.10.255 scope global eth0
valid_lft forever preferred_lft forever
启动容器,自定义容器 b3 ,b4的IP
[root@localhost ~]# docker run -it --name b3 --net mynet busybox ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@localhost ~]# docker run -it --name b4 --net mynet1 --ip 192.168.10.14 busybox ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:c0:a8:0a:0e brd ff:ff:ff:ff:ff:ff
inet 192.168.10.14/24 brd 192.168.10.255 scope global eth0
valid_lft forever preferred_lft forever
注:
我这里mynet不是自定义网段,所以不能自定义IP地址
还有就是我这里直接查看IP地址,后台没有容器运行的,所以b3和b1的ip是一样的
网络互通
b1与b2可以正常通信!!!
方法1: --link(在docker )
[root@localhost ~]# docker run -itd --name b1 --net mynet busybox
3a9b42906fb36552842dd7c608e070fe4c2c95845f01c493c8903337c2f400f1
^[[A[root@localhost ~]# docker run -itd --name b2 --link b1 --net mynet busybox
964030f83c84216164971a7c5aa1e5b81347670761658ef7dde6e0b9cf075dee
[root@localhost ~]# docker attach b1
/ # ping b2
PING b1 (192.168.10.0.2): 56 data bytes
64 bytes from 192.168.0.2: seq=0 ttl=64 time=0.038 ms
64 bytes from 192.168.0.2: seq=1 ttl=64 time=0.075 ms
^C
--- b1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.038/0.056/0.075 ms
/ # exit
[root@localhost ~]# docker attach b2
/ # ping b1
ping: bad address 'b1'
–link缺点
需要两台容器都需要–link,且在容器run时就要添加,其实–link是修改了容器里的/etc/hosts文件。添加了地址解析!
方法2
–connect
[root@localhost ~]# docker network connect mynet b2
[root@localhost ~]# docker attach b1
/ # ping b2
PING b2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.081 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.082 ms
^C
--- b2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.081/0.081/0.082 ms
/ #
[root@localhost ~]# docker attach b2
/ # ping b1
PING b1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.056 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.180 ms
^C
--- b1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.056/0.118/0.180 ms
<<<<<<<<<<<<<<<<<<<<<<<<个人学习笔记,有错误欢迎指出!!>>>>>>>>>>>>>>>>>>>>>>>>>>