docker-网络

著论准过秦,作赋拟子虚。这篇文章主要讲述docker-网络相关的知识,希望能为你提供帮助。
?docker结合负载实现网站高可用?
【docker-网络】?下图为一个小型的网络架构图,其中nginx,使用docker运行?

?容器之间的互联?

docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间
可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量

通过容器名称互联

同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,
容器内部ip地址是dhcp随机分配的,所以如果通过内部访问的话,自定义名称是相对比较固定的

#先创建第一个容器,后续会使用到这个容器的名称
docker run --name nginx-1 -d -p 8801:80 jack/nginx-1.10.3:v1 nginx

#创建第二个容器
docker run -d --name nginx-2 --link nginx-1 -p 8802:80 jack/centos-nginx nginx

通过自定义容器别名互联
#格式
docker run -d --name 新容器名称--link 目标容器名称:自定义的名称 -p 本地端口:容器端口镜像名称shell命令

docker run -d--name nginx-3 --link nginx-1:custom_vm_name -p 8803:80 jack/centos-nginx/usr/sbin/nginx

#查看当前docker的网卡信息
docker network list

#host 网络使用方式
docker run -it -d --name nginx-host-test --net=host jack/centos-nginx nginx

?通过网络跨主机互联?
Docker的网络有四种类型
同一个宿主机之间的各容器之间是可以直接通信的,但是如果访问到另外一台宿主机的容器呢

#1.host模式
使用参数:-net=host
启动的容器如果指定使用host模式,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和ip
地址,因此在容器里面查看到的Ip信息就是宿主机的信息,访问容器的时候直接使用宿主机ip+容器端口即可;不过
容器的其他资源,必须文件系统,系统进程等还是和宿主机保持隔离
此模式的网络性能最高,但是各容器之间端口不能相同,适用于运行容器端口比较固定的业务
docker run -d --name net_host --net=host jack/centos-nginx nginx
host模式不支持端口映射,且容器无法启动


#2.none模式
使用参数 -net=none
使用none模式后,docker容器不会进行任何网络配置,其没有网卡,没有Ip,也没有路由,因此默认无法与外界通信,
需要手动添加网卡配置ip,所以极少使用
docker run -d --name net_none --net =none jack/ccentos-nginx nginx


#3.container模式 较少使用
使用参数-net=container:名称或id指定
使用此模式创建的容器需要指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网,新创建的容器不会创建
自己的网卡,也不会配置自己的ip,而是和一个已经存在的被指定的容器共享ip和端口范围,因此这个容器的端口不能和
被指定的端口冲突,除了网络之外的文件系统,进程信息等仍然保持,相互隔离,两个容器的进程可以通过lo网卡保持通信
docker run -d --name nginx-web1 jacck/nginx-1.10.3:v1 nginx
docker run -it --name net_container --net=container:nginx-web1


#4.bridge 模式
docker的默认模式,即不指定任何模式就是bridge模式,也是使用比较多的模式
此模式创建的容器会为每一个容器分配自己的网络ip等信息,并将容器连接到一个虚拟网桥与外界通信
docker network inspect bridge
docker run -d --name net_bridge jacck/nginx-1.1-.3:v1 /usr/sbin/nginx


docker跨主机实现
a宿主机的容器可以访问 b宿主机上的容器
实现原理:
在宿主机做一个网络路由就可以实现a宿主机的容器访问b宿主机的目的
复杂网络或大型网络可以使用google开源的k8s进行互联


Docker的默认网段是172.17.0. x/24, 而且每个宿主机都是一样的,因此要做路由的前提就是各个主机的网络不能
一致,具体如下
为避免影响,先在各服务器删除之前创建的所有容器。
docker rm -f `docker ps -a -q`
#修改各宿主机网段
docker1 ~]# vim /usr/lib/systemd/system/docker.s ervice
----------------------------------------------------------------
18 ExecStart=/usr/bin/dockerd-current --bip=172.16.10.1/24
----------------------------------------------------------------
systemctl daemon-reload
systemctl restart docker

docker run -d --name test-net-vm jacck/nginx-1.10.3:v1 nginx

#添加静态路由
在各宿主机添加静态路由,网关指向对方的Ip
iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT
route add -net 172.16.20.0/24 gw 192.168.10.206

iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT
route add -net 172.16.10.0/24 gw 192.168.10.205

#抓包
tcpdump -i eth0 -vnn icmp


    推荐阅读