继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Docker网络管理与容器互联

青春有我
关注TA
已关注
手记 1199
粉丝 205
获赞 1008

暴露端口

容器运行起来后,其内部的服务怎么对外提供服务呢?
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306  -v /home/docker/Volumn/mysql:/var/lib/mysql daocloud.io/library/mysql:5.7.4

• 端口映射

-p 宿主机端口:容器内服务端口
如果需要暴露多个内部端口,执行多次-p参数

查看端口映射配置
docker port 容器 端口

容器互联

Docker 的容器互联,会创建一种父子级别的关系。父容器可以看到他的子容器提供的信息
在源与接收容器之间创建一个隧道,接收容器可以查看源容器的指定信息
启动一个容器

    docker@ubuntu:~$ docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress mysql(这里的3306可以不暴露)
    e8989322bd650f0fa9f619cb546dec7a1a853e0318cbcb3e45b4792ab53d1d5e
    docker@ubuntu:~$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    e8989322bd65        mysql               "docker-entrypoint.sh"   3 seconds ago       Up 2 seconds        0.0.0.0:3306->3306/tcp   mysql
再启动一个容器,并且与mysql容器互联
    docker@ubuntu:~$ docker run -d -p 8080:8080 --name tomcat --link mysql:tomcat-to-mysql tomcat
    f696d61edc2e242cca83c8575ae9045e2a4683883d7b893c56a49630c0a1bb5c

使用--link参数,第一个 mysql 是要连接的容器的名称,第二个 tomcat-to-mysql 是这个连接的别名
避免了暴露端口到外部网络上
--link,容器互联技术让容器之间安全的连接
可以连接多个父容器到子容器

网桥

Docker在启动的时候(注意,这里说的是启动Docker,不是启动个Docker容器),
会自动在宿主机中创建 docker0 虚拟网桥。

Docker容器在启动的时候,一般会创建名为veth*的虚拟网卡


webp

82fc3907-c7bd-4736-8786-d054d0fade54.png

同一台宿主机上的容器,都是使用同一虚拟网桥(docker0),默认情况下通过容器互联技术连接


webp

18700e61-378c-422c-9afa-ec7b8aae6f4c.png

跨主机容器互联

网桥

一旦实现了跨主机容器的互联问题,Docker的强大之处才能被真正体现出来。因为可以实现多主机的集群

实现容器互联的方式有多种,下面一种种介绍

• 网桥

生产一般不用,因为在配置中有很多难点

网络拓扑示意图


webp

139e42c6-8c22-4c55-bea4-8cc88d262d1f.png

同一台宿主机上的docker容器使用宿主机上的docker0(图中的br0)网桥进行相互通信
如果我们将连接容器的网桥也桥接到docker主机提供的网卡(图中的eth0)上
并且将网桥(br0)分配的ip地址与docker主机的ip地址设置为同一ip段,
那么就相当于将docker主机中的容器与docker主机的网络连接在了一起

1、多台Ubuntu操作系统,并且处于同一网段
2、安装网桥管理工具
sudo apt-get install bridge-utils
3、两台Ubuntu虚拟机的ip为:192.168.160.131、192.168.160.132
4、新建网桥
这里我们不再使用docker默认提供的docker0网桥,在两台虚拟机中都新建一个需主机ip同一网段的网桥

在两台主机中添加br0网桥
sudo brctl addbr br0

为新网桥分配与宿主机同一网段的ip
Host1: $ sudo ifconfig br0 192.168.160.151 netmask 255.255.255.0
Host2: $ sudo ifconfig br0 192.168.160.152 netmask 255.255.255.0

桥接本地网卡
sudo brctl addif br0 ens33
本地网卡名称可以通过   cat /etc/network/interfaces 进行查看

修改docker配置,使用新网桥(br0)代替旧网桥(docker0)
$sudo vim /etc/default/docker
Host1: DOCKER_OPTS=" -b=br0 –fixed-cidr='192.168.160.151/26'"
Host2: DOCKER_OPTS=" -b=br1 –fixed-cidr='192.168.160.152/26'"
这里,-b 用来指定容器连接的网桥名字
–fixed-cidr用来限定为容器分配的IP地址范围
关于/26啥意思,见 http://blog.csdn.net/aerchi/article/details/39396423

重启Docker服务
$ sudo service docker restart

验证
在两台宿主机中各自启动一个容器,然后ping一下会发现是通的

注意:实际失败,桥接本地网卡后直接导致虚拟机挂了

采用修改网络配置文件的方式添加网桥
在 /etc/network/interfaces 文件中新增以下内容
auto br0
iface br0 inet static
address 192.168.168.141
netmask 255.255.255.0
geteway 192.168.160.2
bridge_ports ens33

修改docker配置与上述一致

还是不行,虚拟机直接挂了

实际情况下应该是可以的,这里不行是因为我的VMWare的问题,导致IP分配麻烦


webp

7f6d1963-bab4-45e4-a924-5a49460a6d48.png

Open vSwitch

• Open vSwitch
生产常用这个,是一个虚拟交换机软件
Open vSwitch是一个高质量、多层虚拟交换机,使用Apache 2.0许可协议
目的是让大规模网络自动化,可以通过编程扩展,同时支持标准的管理接口和协议

webp

3a9f29c2-c97a-4152-bf68-8a18fdd1a679.png

br0:虚拟网桥,使用虚拟网桥实现同主机中容器的互联
obr0:使用ovs创建的网桥,ovs创建的网桥使用gre实现跨主机的网络连接
gre:通用路由封装协议。


webp

9d99ead3-5ccf-45a9-9cbb-9ded4b5a5a84.png

准备工作

1、sudo apt-get install openvswitch-switch,安装Open vSwitch
2、两台宿主机:192.168.160.131、192.168.160.132,使用VMWare虚拟机创建
3、sudo apt-get install bridge-utils,安装网桥管理工具

webp

d178d35d-524d-442b-be3a-42aa0dbce286.png

检查ovs状态:sudo ovs-vsctl show


webp

2d68268d-dc0f-41eb-89f5-a1a09bbd5e4f.png

webp

92a4e1a5-f626-42f2-b6a8-ee62a05eec7c.png

创建ovs网桥
sudo ovs-vsctl add-br obr0
添加gre接口
sudo ovs-vsctl add-port obr0 gre0
设置gre接口,指定需要连接的另一台宿主机的地址
HOST1:sudo ovs-vsctl set interface gre0 type=gre options:remote_ip=192.168.160.132
HOST2:sudo ovs-vsctl set interface gre0 type=gre options:remote_ip=192.168.160.131

这里有一个疑问:如果我要连接多台宿主机该怎么办?
个人看法是添加多个ovs网桥
查看当前ovs设置状态


webp

31208b14-a17e-428f-9a6d-6dd286979ec9.png

创建并设置br0,本机容器使用的网桥
sudo brctl addbr br0
HOST1:sudo ifconfig br0 192.168.1.1 netmask 255.255.255.0
HOST2:sudo ifconfig br0 192.168.2.1 netmask 255.255.255.0

为br0网桥添加ovs网桥的连接
sudo brctl addif br0 obr0

查看网桥连接状态


webp

c2b8c31f-3bd4-4324-90f2-3b8ae64365d2.png

配置docker,用新建的br0网桥代替docker0
$sudo vim /etc/default/docker
DOCKER_OPTS=" -b=br0"
重启docker服务

sudo service docker restart

ps -ef|grep docker,我们可以看到此时使用的是br0网桥

验证:
启动一个ubuntu容器,ifconfig查看容器内的网络情况,发现网卡ip就是我们设置的ip
容器内ping另一台宿主机能够ping通

找不到ifconfig命令
apt-get install net-tools

找不到ping命令
apt-get install inetutils-ping

如果需要安装的软件找不到,apt-get update,更新一下软件源

两个宿主机中的容器ip,分别处于192.168.1和192.168.2网段,他们之间现在是ping不通的
还需要配置一下路由表

查看当前路由表


webp

3594d250-b4d4-4757-bda9-e15483d33f3c.png

添加路由表
sudo ip route add 192.168.2.0/24 via 192.168.160.132 dev ens33
192.168.2.0是新网段
192.168.160.132为去哪台宿主机找192.168.2.0网段
ens33为当前主宿主机的网卡设备中

这个时候,我们再分别在两台宿主机上启动容器,他们就可以互相访问了。
经验证,成功

当宿主机重启后,发现ovs网桥还在,br0网桥不见了,新增的路由表也不见了
配置永久网桥与永久路由表:/etc/network/interfaces
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
bridge_ports obr0
up ip route add 192.168.2.0/24 via 192.168.160.132 dev ens33
Ubuntu的网络相关配置都是在此配置文件中

weave

webp

2974ca0d-d4c3-447d-a74b-2723e3f64ddc.png



作者:Koko_滱滱
链接:https://www.jianshu.com/p/2e59b1cfb552


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP