文章目录
- 1.lo & ech0 & docker0/podman0的理解
- 2.veth-pair技术的理解
- 3.docker中--link功能的作用
- 4.自定义网络
以下使用的是centos8系统,centos8中对docker做了升级和增强,可以把podman就当做docker
1.lo & ech0 & docker0/podman0的理解
podman0地址:
- 这个地址10.88.0.1 ,相当于一个路由器的功能,本地服务通过这个路由,可以连接不同的容器
- 每次启动一个容器,就会产生一个容器ip地址,网段为10.88.0.xxx
查看某容器的网络地址信息:
[root@AutoTestServer ~]# podman exec -it uc_centos7 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.88.0.13 netmask 255.255.0.0 broadcast 10.88.255.255
inet6 fe80::64a2:daff:fee4:19c3 prefixlen 64 scopeid 0x20<link>
ether 66:a2:da:e4:19:c3 txqueuelen 0 (Ethernet)
RX packets 28396 bytes 288969745 (275.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13280 bytes 1062258 (1.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# eth0是容器内部地址,通过inet查看到:10.88.0.13是容器的地址
本地ping容器效果:
说明服务器本身,已经可以连通容器内部了!
2.veth-pair技术的理解
veth-pair 就是一对的虚拟设备接口,它都是成对出现的。一端连着协议栈,一端彼此相连着。如下图所示:
正因为有这个特性,它常常充当着一个桥梁,连接着各种虚拟网络设备。典型的例子像“两个 namespace 之间的连接”,“Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等,以此构建出非常复杂的虚拟网络结构,比如 OpenStack Neutron。
对这个技术想详细了解的,可参考:《veth-pair是什么》
上图就是容器与宿主机连通的原理:
- 宿主机上,只要安装docker工具,都会默认有个docker0地址,就是我们第一部分说的路由的功能
- 开启一个容器,默认也给到一个容器ip的地址
- veth-pai 技术,使得容器与docker0 之间可以互联互通
- docker中的所有的网络接口,都是虚拟的,因为虚拟接口传输速度很快!
3.docker中–link功能的作用
link的功能,主要是为了解决通过容器名去连接另一个容器名的问题。
- 如果容器很多的时候,想从container01 去连接container02的时候,原始的方法是通过容器ip地址,去连接另一个容器的ip地址
- 如果通过容器名去连接会方便很多
docker run -d -P --name tomcat03 --link tomcat02 tomcat
# 启动容器tomcat03,且tomcat03连接tomcat02容器
docker exec -it tomcat03 ping tomcat02
# 通过tomcat03去pingtomcat02,发现是可以ping通的
link功能的缺陷:
- link功能,只是单向的设置了连通,如上的设置,tomcat02是无法连接tomcat03的
- link功能,不是从根本上解决连通的问题,是通过修改host文件,让连通某个容器名的时候,跳转到该容器对应的ip地址
进入到tomcat03容器的hosts文件,发现已经配置了默认tomcat02跳转到该容器的ip地址
4.自定义网络
网络模式:
- bridge :桥接 docker(默认,自己创建也是用bridge模式)
- none :不配置网络,一般不用
- host :和宿主机共享网络
- container :容器网络连通(用得少!局限很大)
# 我们直接启动的命令,其实省略了--net 的信息,如下两个效果一样
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
查看容器的所有网络配置信息:
# docker network ls
[root@AutoTestServer ~]# docker network ls
NAME VERSION PLUGINS
podman 0.4.0 bridge,portmap,firewall,tuning
创建docker的虚拟网络:
# docker network create
# 我们可以自定义一个网络
# --driver bridge 通讯的模式
# --subnet 192.168.0.0/16 子网
# --gateway 192.168.0.1 网关
[root@AutoTestServer ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
/etc/cni/net.d/mynet.conflist
[root@AutoTestServer ~]# podman network ls
NAME VERSION PLUGINS
podman 0.4.0 bridge,portmap,firewall,tuning
mynet 0.4.0 bridge,portmap,firewall
检查某个网络的详细信息:
# podman network inspect xxxxx
[root@AutoTestServer ~]# podman network inspect mynet
[
{
"cniVersion": "0.4.0",
"name": "mynet",
"plugins": [
{
"bridge": "cni-podman1",
"hairpinMode": true,
"ipMasq": true,
"ipam": {
"ranges": [
[
{
"gateway": "192.168.0.1",
"subnet": "192.168.0.0/16"
}
]
],
"routes": [
{
"dst": "0.0.0.0/0"
}
],
"type": "host-local"
},
"isGateway": true,
"type": "bridge"
},
{
"capabilities": {
"portMappings": true
},
"type": "portmap"
},
{
"backend": "",
"type": "firewall"
}
]
}
]
- centos8系统,没有看到mynet网络包含的容器信息,也可能是centos8对应的命令修改了,后续找到再更细
- centos7系统,会出现此网络包含的容器相关信息(ip、网关等)
centos7系统,如果两个容器网段不同,无法连接!!!
# 可以通过connect命令,打通不同网段的容器
# 连通之后就是将容器放到该网络下,一个容器就包含了两个ip地址.
docker network connect mynet[网络名] tomcat01[容器名]
centos8所有容器互联互通,即使网段不同!!!!
[root@AutoTestServer ~]# podman inspect 8f0008028cb2 | grep IPAddress
"IPAddress": "10.88.0.16",
[root@AutoTestServer ~]# podman inspect d98ccf5dd6ed | grep IPAddress
"IPAddress": "",
"IPAddress": "192.168.0.2",
[root@AutoTestServer ~]# podman exec -it 8f0008028cb2 ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=63 time=0.096 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=63 time=0.077 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=63 time=0.073 ms
^C
--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2050ms
rtt min/avg/max/mdev = 0.073/0.082/0.096/0.010 ms
参考文章:
《podman 容器内无法访问网络》