Docker 从入门到实践(极客学院) 学习笔记
主机规划
主机名称 IP 网关 虚拟机(vm1)
192.168.1.111/24 192.168.1.1**(路由器)** 虚拟机(vm2)
192.168.1.222/24 192.168.1.1
网桥实现
将物理网卡
和docker服务
绑定到同一网桥。
- 新建一个网桥
br0
- 将物理绑卡绑定到
br0
- docker服务启动时 也指定网桥为
br0
- 为docker服务器 进行地址划分(防止ip冲突)
这样所有的容器的ip与docker服务器所在主机都在同一个网段,从而实现互联。
自定义网桥
# vm1上创建网桥 --- 1
### 此种方式在重启机器时,会丢失
[root@localhost jhs]# brctl addbr br0
[root@localhost jhs]# ifconfig br0 192.168.1.111 netmask 255.255.255.0
# vim1上创建网桥 ---- 永久有效
### a.复制ifcfg-en333文件 ---> ifcfg-br0
[root@vm1 network-scripts]# cd /etc/sysconfig/network-scripts
[root@vm1 network-scripts]# cp ifcfg-ens33 ifcfg-br0
#### b.修改ifcfg-br0
[root@vm1 network-scripts]# vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.1.111
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
### c.将网桥绑定到物理网卡上
[jhs@vm1 ~]$ cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
### d.查看网桥创建成功
[jhs@vm1 ~]$ ip addr
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
link/ether 00:0c:29:ba:4d:b9 brd ff:ff:ff:ff:ff:ff
8: br0:
inet 192.168.1.111/24 brd 192.168.1.255 scope global noprefixroute br0
[jhs@vm1 ~]$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29ba4db9 no ens33
地址划分
将本地的物理网卡绑定到新建的网桥之上。
为了防止docker创建的容器IP冲突,对ip地址进行划分:
vm1上的docker服务使用网桥配置: -dr0
IP: 192.168.1.128/27
地址范围2: 即192.168.128.129~159
vm1上的docker服务使用网桥配置:
IP: 192.168.1.224/27
地址范围2: 即192.168.128.225~254
修改docker服务配置
[jhs@vm1 ~]$ vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://nfyf8ozp.mirror.aliyuncs.com"],
"bridge":"br0",
"fixed-cidr":"192.168.1.128/27"
}
[jhs@vm1 ~]$ systemctl restart docker
## 启动docker容器
[jhs@vm1 ~]$ docker restart cct1 cct2
### 查看网桥状态
[jhs@vm1 ~]$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29ba4db9 no ens33
veth0bd151a
veth1972d74
### 进入容器cct2,查看ip地址
[jhs@vm1 ~]$ docker attach cct2
[root@32e9b264bb56 /]# ip addr
29: eth0@if30: 192.168.1.129/24
这里有一些问题:就是ip的子网掩码是
/24
待研究。
Open vSwitch实现
将vos网桥obr1
注册为docker容器的网桥br1
的接口。 再通过通用隧道技术连接,直接发起访问。
- 建立ovs网桥
- 添加gre连接
- 配置docker容器虚拟网桥
- 为虚拟网桥添加ovs接口
- 添加不同docker容器网段路由
配置虚拟网桥br1
#1. 新建虚拟网桥
[root@vm1 openvswitch]# brctl addbr br1
#2. 配置虚拟网桥地址
[root@vm1 openvswitch]# ifconfig br1 172.17.1.0 netmask 255.255.255.0
#3. 配置docker容器网桥信息
[root@vm1 openvswitch]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://nfyf8ozp.mirror.aliyuncs.com"],
"bridge": "br1"
}
#4. 重启docker服务,并重启docker容器
[root@vm1 openvswitch]# systemctl restart docker
[root@vm1 openvswitch]# docker restart cct1
#5. 查看容器新分配的ip地址
[root@vm1 openvswitch]# docker exec cct1 ip addr
172.17.1.2/24
#6. 接下来同理,为vm2创建虚拟网桥br2,配置网段为172.17.2.0/24,
### 配置docker容器默认网桥为br2,然后创建容器vm2_cct1,
### 此时vm2中,查看新建容器的ip地址
[root@vm2 docker]# docker run -it --name vm2_cct1 jhs/cct
[root@93e702ef918d /]# ip addr
172.17.2.2/24
#在vm1的容器 cct1内,
[root@c3b34f281e52 /]# ping 192.168.1.222 #ping vm2 成功
[root@c3b34f281e52 /]# ping 172.17.2.2 #ping vm2上vm2_cct1 不通
#7. 在vm1主机上添加路由信息:
### 访问 172.17.2.0/16网段的请求,通过vm2 192.168.1.222路由转发
[root@vm1 docker]# ip route add 172.17.2.0/24 via 192.168.1.222
#8. 重新ping vm2上vm2_cct1 ---成功
[root@vm1 docker]# docker attach cct1
[root@c3b34f281e52 /]# ping 172.17.2.2
删除网桥前,往往需要使网桥下线:
ip link set dev docker0 down
brctl delbr docker0
疑惑: 上述步骤已经可以实现容器间互联了,仿佛不需要
ovs
了
配置ovs网桥
#1.vm1创建ovs网桥 ---obr1
[jhs@vm1 ~]$ sudo ovs-vsctl add-br obr1
#2. obr1 上创建接口
### 定义虚拟接口名称
### 指定接口类型为gre
[root@vm1 openvswitch]# ovs-vsctl add-port obr1 gre1 -- set interface gre1 type=gre option:remote_ip=192.168.1.222
[root@vm1 openvswitch]# ovs-vsctl show
5a41ab52-168b-4d79-8077-6a9ec545bec9
Bridge "obr1"
Port "gre1"
Interface "gre1"
type: gre
options: {remote_ip="192.168.1.222"}
Port "obr1"
Interface "obr1"
type: internal
ovs_version: "2.12.0"
#3. 为虚拟网桥添加ovs接口
[root@vm1 docker]# brctl addif br1 obr1
[root@vm1 docker]# brctl show
bridge name bridge id STP enabled interfaces
br1 8000.06cdb02dff1b no obr1
veth6f945c2
Weave实现
weave
weave通过在docker集群的每个主机上启动虚拟路由器,将主机作为路由器
,形成互联互通的网络拓扑,在此基础上,实现容器的跨主机通信。其主机网络拓扑参见下图:
####################### vm1 上安装
#1.下载,并将它存放在/usr/local/bin/weave
[root@vm1 docker]# sudo wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
#2. 修改weve权限,使它可以执行
[root@vm1 bin]# chmod a+x weave
#3. 启动weave
#### 类似docker拉取镜像,
[root@vm1 bin]# weave launch
#4. docker ps 可以查看到weave已经启动容器
[root@vm1 bin]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2dac48c39e8 weaveworks/weave:latest "/home/weave/weaver …" 2 minutes ago Up 2 minutes weave
####################### vm2 上安装(略...)
#5. vm2上启动weave,
### 制定远程机器vm1的:ip
[root@vm2 bin]# weave launch 192.168.1.111
fc37b4a9e618544c8116fd6f141965f3bfeb2270f64e43292e5d2a3c1ad13f55
#6. vm2上启动容器。
[root@vm2 bin]# docker run -it jhs/cct
[root@1149714622be /]#
#7. weave为上述的容器配置网络
[root@vm2 bin]# weave attach 10.2.0.22/24 1149714622be
10.2.0.22
#8. 查看容器的网络配置
[root@vm2 bin]# docker exec 1149714622be ip addr
18: ethwe@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state
inet 10.2.0.22/24 brd 10.2.0.255 scope global ethwe
### 多了一个 ethwe网卡: 地址就是刚刚命令配置的地址
###################### vm1 上启动容器
#9. vm1 启动容器
[root@vm1 bin]# docker run -it --name cct111 jhs/cct
#10 vm1 为容器配置weave地址
[root@vm1 bin]# weave attach 10.2.0.33/24 cct111
10.2.0.33
################ 查看两容器是否互通
#11. 进入 vm1, cct111(10.2.0.33) 访问 vm2容器1149714622be(10.2.0.22)
[root@vm1 bin]# docker attach cct111
[root@86db6808a37b /]# ping 10.2.0.22
PING 10.2.0.22 (10.2.0.22) 56(84) bytes of data.
64 bytes from 10.2.0.22: icmp_seq=1 ttl=64 time=2.35 ms
#11. 进入 vm2容器1149714622be(10.2.0.22), 访问 vm1的容器cct111(10.2.0.33)
[root@vm2 bin]# docker exec 1149714622be ping 10.2.0.22
PING 10.2.0.22 (10.2.0.22) 56(84) bytes of data.
64 bytes from 10.2.0.22: icmp_seq=1 ttl=64 time=0.047 ms
注意:
如下命令启动容器,在weave 2.0 之后不再支持:
[root@vm2 bin]# c2=$(weave run 10.0.1.2/24 -it jhs/cct)