一、docker网络简介
docker网络从覆盖范围可分为单个host上的容器网络和跨多个host网络
docker安装时会自动在host上创建三个网络,我们可以用docker network ls查看
docker network ls
1.none网络
none网络就是什么都没有的网络,挂在这个网络下的容器除了lo,没有其他任何网卡,容器创建时,可以通过--network=none指定none网络。
docker run -it --network=none busybox
封闭意味着隔离,一些对安全性高并且不需要联网的应用可以使用none网络。
比如某个容器的唯一用途是成成随机密码,就可以放到none网络中避免密码被窃取。
2.host网络
连接到host网络容器共享docker host的网络栈,容器的网络配置与host完全一样。可以通过--network=host指定使用host网络
docker run -it --network=host busybox
在容器中可以看到host的所有网卡,并且连hostname也是host的。host网络的使用场景又是什么呢
直接使用docker host 的网络最大的好处就是性能。如果容器对网络传输效率有较高要求,则可以选择host网络,当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题。docker host上已经使用的端口就不能再用了。
docker host的另一个用途是让容器可以直接配置host网络,比如某些跨host网络解决方案,其本身也就一容器方式运行的,这些方案需要对网络进行配置,比如管理iptables
3.bridge网络
docker安装时会创建一个命名docker0的Linux bridge。比如不指定--network,创建的容器默认都会挂到docker0上
brctl show
注意:我是使用的阿里云服务器,由于阿里云服务器里边没有brctl命令,需要我们下载安装
yum install bridge-utils
当前docker0上没有任何其他网络,当运行容器时就会看到反应
查看网络配置
实际上eth0@if17和 brctl show 查看到的是一对 veth pair 。veth pair是一种成对出现的特殊网络设备,可以把他们想象成由一根虚拟网线连接起来的一对网卡。网卡的一头在容器中,一头挂在网桥docker0上,其效果就是将eth0if197也挂在了docker0上
可以通过命令查看网络配置信息
docker network inspect bridge
bridge网络配置的subnet就是172.17.0.0/16 并且网关是172.17.0.1.这个网关就是docker0
当前容器网络拓扑结构图:
二、自定义容器网络
处理none host bridge 这三个自动创建的网络,用户也可以根据业务需求创建user-definde网络
docker提供了三种user-definde网络驱动方式:bridge overlay 和macvian overlay和macvlan用于创建跨主机的网络
1.通过bridge驱动创建类似默认的bridge网络:
docker network create --driver bridge my_net
查看当前host网络结构变化:
查看my_net配置信息:
2.创建自己制定ip网段:
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 my_net2
查看详细信息:
创建实例查看:
docker run -it --network=my_net2 busybox sh
3.可以指定一个静态ip
docker run -it --network=my_net2 --ip 192.168.1.50 busybox sh
注意:只有使用--subnet创建的网络才能指定静态ip
如果my-net创建没有指定--subnet,指定静态ip会报错:
三、容器间的连通性
两个busybox容器都挂在my_net2上能够互通,:
1.启动第一台
docker run -it --network my_net2 busybox
2.启动第二台
docker run -it --network my_net2 busybox
3.ping下
可见同一网络中的容器,网关之间都是可以通信的
my_net2与默认bridge网络能通讯吗?
正常情况下 两个网络属于不同的网桥,不能通信,如果让容器互通
1.首先ping
2.查看路由表
ip r
3.查看ip forwarding
sysctl net.ipv4.ip_forward
4.查看iptables
iptables-save
为什么还不能通讯的原因:
iptables drop掉了网桥docker0与br-c2073之间的双向的流量
从规则的命令docker-isolation可知docker在设计上就是要隔离不同的network
注意:如何让容器之间通讯:
为容器添加一块同样的网卡。就可以通过docker network connect命令实现
ocker network connect my_net2 f87771
添加网卡后 会发现容器会多一个网卡接口
ping验证:
四、容器访问外部
docker host是可以访问外网的。容器是否也能访问外网
可见容器默认就能访问外网
nat上iptables规则:
iptables -t nat -S
五、外部世界如何访问容器
外部网络怎么才能访问容器 答案就是 端口映射
docker 可将容器对外提供服务的端口映射到host的某个端口,外网通过改端口访问容器。容器启动时通过- 参数映射端口:
docker run -d -p 80 httpd