文章目录

  • 1.lo & ech0 & docker0/podman0的理解
  • 2.veth-pair技术的理解
  • 3.docker中--link功能的作用
  • 4.自定义网络





以下使用的是centos8系统,centos8中对docker做了升级和增强,可以把podman就当做docker

1.lo & ech0 & docker0/podman0的理解

docker迁移sqlserver docker迁移到podman_docker

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容器效果:

docker迁移sqlserver docker迁移到podman_podman_02

说明服务器本身,已经可以连通容器内部了!

2.veth-pair技术的理解

veth-pair 就是一对的虚拟设备接口,它都是成对出现的。一端连着协议栈,一端彼此相连着。如下图所示:

docker迁移sqlserver docker迁移到podman_docker_03

正因为有这个特性,它常常充当着一个桥梁,连接着各种虚拟网络设备。典型的例子像“两个 namespace 之间的连接”,“Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等,以此构建出非常复杂的虚拟网络结构,比如 OpenStack Neutron。

对这个技术想详细了解的,可参考:《veth-pair是什么》

docker迁移sqlserver docker迁移到podman_自定义网络_04

docker迁移sqlserver docker迁移到podman_docker迁移sqlserver_05

上图就是容器与宿主机连通的原理:

  • 宿主机上,只要安装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地址

docker迁移sqlserver docker迁移到podman_网络基础_06

进入到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 容器内无法访问网络》