暴露端口
容器运行起来后,其内部的服务怎么对外提供服务呢?
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*的虚拟网卡
82fc3907-c7bd-4736-8786-d054d0fade54.png
同一台宿主机上的容器,都是使用同一虚拟网桥(docker0),默认情况下通过容器互联技术连接
18700e61-378c-422c-9afa-ec7b8aae6f4c.png
跨主机容器互联
网桥
一旦实现了跨主机容器的互联问题,Docker的强大之处才能被真正体现出来。因为可以实现多主机的集群
实现容器互联的方式有多种,下面一种种介绍
• 网桥
生产一般不用,因为在配置中有很多难点
网络拓扑示意图
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分配麻烦
7f6d1963-bab4-45e4-a924-5a49460a6d48.png
Open vSwitch
• Open vSwitch
生产常用这个,是一个虚拟交换机软件
Open vSwitch是一个高质量、多层虚拟交换机,使用Apache 2.0许可协议
目的是让大规模网络自动化,可以通过编程扩展,同时支持标准的管理接口和协议
3a9f29c2-c97a-4152-bf68-8a18fdd1a679.png
br0:虚拟网桥,使用虚拟网桥实现同主机中容器的互联
obr0:使用ovs创建的网桥,ovs创建的网桥使用gre实现跨主机的网络连接
gre:通用路由封装协议。
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,安装网桥管理工具
d178d35d-524d-442b-be3a-42aa0dbce286.png
检查ovs状态:sudo ovs-vsctl show
2d68268d-dc0f-41eb-89f5-a1a09bbd5e4f.png
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设置状态
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
查看网桥连接状态
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不通的
还需要配置一下路由表
查看当前路由表
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
2974ca0d-d4c3-447d-a74b-2723e3f64ddc.png
作者:Koko_滱滱
链接:https://www.jianshu.com/p/2e59b1cfb552