修改docker0的IP,教程写的是/etc/default/docker文件,但是那是过时的配置,真正的配置是在/etc/docker/daemon.json,格式是json的:
1 { 2 "registry-mirror":"http://daocloud.io", 3 "bip":"10.103.200.1/24", 4 "fixed-cidr":"10.103.200.0/24", 5 "insecure-registry":"daocloud.io:5000" 6 }
安装openvswitch
安装流程可以参看:https://www.cnblogs.com/xkops/p/5568167.html
还需要安装bridge-utils,因为需要brctl。
遇到的问题:
ovs-vsctl: unix:/var/run/openvswitch/db.sock: database connection failed (No such file or directory)
启动方式不正确,之前的方式是service openvswitch start;但是这种方式不够,启动的时候会看到openvswitch-db没有启动的提示;openvswitchd启动成功
还需要通过ovs-ctl来进行启动(见下面的指令);
./home/ovs/rpmbuild/BUILD/openvswitch-2.3.2/utilities/ovs-ctl start (停止服务:/home/ovs/rpmbuild/BUILD/openvswitch-2.3.2/utilities/ovs-ctl stop)
执行ovs-vsctl add-br docker_tunnel2以及sudo ovs-vsctl add-port docker_tunnel gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.56.5的时候,会卡住;报错:
connection attempt failed (Permission denied)
不知原因为何;但是ctrl+c之后,看到其实已经创建成功;
怀疑是这个版本(2.3.2)的bug,于是下载了最新版2.5.4,启动服务后发现爆了异常:
ovs|00003|daemon_unix|EMER|/var/run/openvswitch/ovsdb-server.pid: pidfile check failed (Permission denied), aborting
ovs|00002|db_ctl_base|ERR|unix:/var/run/openvswitch/db.sock: database connection failed (Permission denied)
后来手动执行ovs-ctl的start,问题解决。
/home/ovs/rpmbuild/BUILD/openvswitch-2.3.2/utilities/ovs-ctl start
说明
本质上,你可以把单机想象成一个局域网,这样,两个网络之间想要通信,就需要把网关设置到对方的机器上面,现在宿主机即使网关,所以A向B的docker通信,需要向A的路由器增加一条静态路由,就是对于通往B的docker的请求的网关是要路由到B的IP上,然后又B的IP(路由器)在转交给B的docker。
什么是网桥呢?顾名思义,网桥的作用是做网络间的桥梁,所以网桥一定是网关,而且A域的网桥是B域的网关。因为网桥是基于链路层的协议,所以网桥及其本网一定要在一个Mac可以发现的网络内。
docker0是一个默认的docker的网桥,没有配置文件,是docker daemon每次启动的时候临时构建的一个网桥;这个网桥的作用就在于将docker和宿主机的网络连接在一起;所以docker可以通过网桥将网络请求发送到宿主机,然后宿主机再把请求发送到Lan中;所以docker默认是可以PING通宿主机网络中的各个节点,但是相反,Lan中的节点却无法PING通docker的IP;所以需要就是让网络节点能够把对于docker的请求路由到 docker所在的宿主机(此时宿主机的角色是网关),然后由宿主机将请求发给docker0(网桥),docker0再给docker的网卡。
下图可以看到,网桥其实是一个连接器,链接的dockerd的网卡以及宿主机的网卡。