Docker的四种网络模型:
Docker安装完成后,会自动创建三个网络,可使用“docker network ls”命令查看
默认创建的是bridge网桥的方式:
四种模式:
1 . null 无网卡的无网络模式,容器不需要和外界相连
2 . bridge 桥接式 ,直接桥接到docker0网卡上。(默认使用的方法)
3 .联盟式网络:让各个容器之间关于网络方面的名称空间是共用一个名称空间,然后再桥接到物理网卡上
4 . docker容器都直接共用,物理网卡上。
查看网络信息的命令:
docker network inspect bridge (查看bridge网络的信息)
docker container inspect web2 (查看某个容器的网络信息)
docker bridge 网络:
宿主机会自动创建docker0 网段,以后创建的每个容器都是docker0网段的IP地址,他们之间可以相互连接的。宿主机上的docker0就像一个虚拟的交换机,将各个容器相互连接起来。
Docker0为NAT桥,因此容器一般获得的是私有网络地址 。
每启动一个docker容器就会生成一对网卡,一个在宿主机上,一个在容器上。如下图:
宿主机生成的网卡:(并将其关连到docker0的网卡上)
每个docker容器里生成的网卡及IP地址:
每个docker容器里的网卡都可以ping通到宿主机的内网的IP地址,和外网的IP地址。
每创建一个docker容器就会生成一个iptables规则,将容器内的地址做转换,可以访问到外网。
docker bridge网络下的容器的几种网络模式:
1 .在同一个宿主机上的不同容器之间的访问:
如果有一个docker容器的nginx的服务,在另一个docker容器里应该是可以访问到nginx容器的nginx的web服务.
2 . 在宿主机上访问nginx容器的nginx的web服务。也是可以的。
3 . 另一台物理机要访问nginx容器的nginx的web服务器。无法直接访问,需要做地址关连,将nginx容器的IP地址关连到本地的内网或者外网的IP地址上去,这样外部的物理机就可以访问容器虚拟机的IP地址了。
暴露端口和地址的四种模式:
例1:
宿主机上有一台提供web服务的容器,现在需要从另一台物理机访问此宿主机上的提供web服务的容器。在创建容器的时候需要将端口号暴露出来。(宿主机不指定端口也不指定IP)
docker run –name tt –rm -it -p 80 magedu/http:1.0 (magedu/http:为本机创建的http的镜像文件)
此时已将web容器的http服务的80端口号暴露出来了,关连到宿主机上了,但关联的宿主机的端口是随便的,所以在宿主机上查看生成的iptables的规则,来看关连到宿主机上的哪个端口上了。
默认是将容器里的IP虚拟地址关连到宿主机上的所有的IP地址上的。
iptables -t nat -vnL
此时在另一台物理机上就可以通过宿主机的网卡来访问web容器的http服务了
curl 192.168.60.3:32768
也可以使用此命令docker port tt (在宿主机上查看tt容器暴露的端口)
当容器关掉之后,iptables的规则自动清除,宿主机随机关连的端口号也清除了。
例2:
将容器的IP虚拟地址关连到宿主机上指定的某一个IP上。(在浏览器上输入宿主机的指定的IP地址但端口号是随机的需要查看来获得才可以访问到)宿主机指定IP但不指定端口
docker run –name tt –rm -it -p 192.168.60.20::80 magedu/http:1.0
(192.168.60.20::80 :前面的地址为宿主机上的IP地址;::两个冒号之间为宿主机关连到容器上的端口号没写为随机端口 80为容器上要关连服务的端口号)
在宿主机上查看端口是否将容器的IP地址关连到宿主机上指定的IP地址。
例3:
将宿主机上指定的IP和指定的端口关连到虚拟机的IP地址上。(在浏览器上输入宿主机指定的IP和指定的端口号才可以访问到容器上)宿主机指定端口也指定IP
docker run –name tt –rm -it -p 192.168.60.20:80:80 magedu/http:1.0
例4:
不指定宿主机关连到容器的IP地址,但指定宿主机使用的端口号。(在浏览器上访问宿主机的所有IP地址,但端口号必须是指定的80;都可以连接到容器上)宿主机指定端口但不指定IP
docker run –name tt –rm -it -p 80:80 magedu/http:1.0
创建网络名称空间,和虚拟网卡,并使其通信
ip netns add r1
ip netns add r2 (创建两个网络名称空间;在linux界面上执行)
ip link add name veth1.1 type veth peer name veth1.2 (创建两个虚拟网卡对;在linux界面上执行))
默认都没有被激活,使用ifconfig是看不见这两个网卡的。使用ip link 来查看。
ip link set dev veth1.2 netns r1 (把一个虚拟网卡移到刚创建的网络名称空间里)
ip netns exec r1 ifconfig -a (此时查看r1的网络名称空间,发现有了一个虚拟网卡)
ip netns exec r1 ip link set dev veth1.2 name eth0 (可以将网卡名改为常用的网卡名称)
ifconfig veth1.1 10.0.0.1/24 up (将宿主机的里刚创建的一个虚拟网卡给个地址并激活)
此时在次查看宿主机上创建的虚拟网卡发现已经有了地址。
ifconfig:
ip netns exec r1 ifconfig eth0 10.0.0.2/24 up (将网络名称r1中的虚拟网卡激活并给个IP地址)
ip netns exec r1 ifconfig (再次啥看发现已经有IP地址了)
此时用宿主机来ping网络空间的虚拟IP地址:ping 10.0.0.2 (可以通的)
如果将在宿主机上的虚拟网卡移动到创建的网络名称空间r2里去,r1和r2两个名称空间就可以通信了。
ip link set dev veth1.1 netns r2
ip netns exec r2 ifconfig veth1.1 10.0.0.3/24 up (将移进到网络名称空间r2的虚拟网卡添加地址并且激活)
ip netns exec r2 ifconfig (查看网络名称空降r2已经有了地址)
ip netns exec r2 ping 10.0.0.2 (在r2网络名称空间里去pingr1的IP地址)
创建各种网络模式的容器:
docker run –name f1 -it –rm busybox:latest (创建一个busybox容器,退出后并删掉)
docker run –name f1 -it –network none –rm busybox:latest (创建一个null模式的容器)
docker run –name f1 -it –network none -h t1.magedu –rm busybox:latest (创建容器时,指定容器的主机名)
docker run –name f1 -it –network none -h t1.magedu –dns 8.8.8.8 –rm busybox:latest (创建容器时指定dns服务器的地址)
docker run –name f1 -it –network none -h t1.magedu –add-host www.magedu.com:192.168.7.7 –rm busybox:latest (指定hosts文件的dns解析地址)
创建一个使用共同虚拟网卡的两个容器:
docker run –name tt –rm -it magedu/http:1.0 (首先在宿主机上创建一个容器)
查看上面容器的IP地址:
在相同的宿主机上在创建一个和tt共用虚拟地址的容器:
docker run –name tt1 –network container:tt –rm -it magedu/http:1.0
此时在查看tt1的虚拟IP地址,发现和tt的虚拟IP地址是相同的。
此时两个容器共享一个虚拟IP地址,通过本容器的本地地址127.0.0.1可以相互来连接。
创建一个使用共同物理网卡的两个容器:
docker run –name tt1 –network host –rm -it magedu/http:1.0
docker run –name tt –network host –rm -it magedu/http:1.0
以上两个容器直接关连到宿主机上的所有的物理网卡上了。此时在浏览器上就可以直接访问容器里的虚拟机了,因为容器里的虚拟机的IP地址和宿主机的IP地址是相同的。
简单的配置虚拟机的http服务的主页面:
echo "hell" > /tmp/index.html (创建一个主页面)
httpd -h /tmp/ (启动的时候指定主页面的路径)
此时在浏览器上访问宿主机的IP地址,就能看到容器提供http服务的页面。
指定bridge 的IP地址,不使用系统默认172.17.0.0/16的IP地址:
停止docker服务:systemctl stop docker
vim /etc/docker/daemon.json (编辑添加加速器的配置文件)
systemctl start docker
查看新生成的网卡:
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/104362