本文将大部分docker知识按图总结,便于理解。
存储
本章我们学习以下内容:
- docker 为容器提供了两种存储资源:数据层和 Data Volume。
- 数据层包括镜像层和容器层,由 storage driver 管理。
- Data Volume 有两种类型:bind mount 和 docker managed volume。
- bind mount 可实现容器与 host 之间,容器与容器之间共享数据。
- volume container 是一种具有更好移植性的容器间数据共享方案,特别是 data-packed volume container。
- 最后我们学习如何备份、恢复、迁移和销毁 Data Volume。
存储分类
https://www.cnblogs.com/CloudMan6/p/7152775.html
共享数据
分为主机与容器之间、容器之间共享。
https://www.cnblogs.com/CloudMan6/p/7163399.html
主机与容器
- bind volume
- docker managed volume
容器与容器-bind volume
容器与容器-volume container
创建专门的volume容器来实现
容器与容器-data-packed volume container
把数据封装在容器里,不依赖于主机,适合与不需要改变的静态配置文件。
创建带有数据的镜像:
1
2
3FROM busybox:latest
ADD htdocs /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs # 相当于 -v 选项创建容器:
docker build -t datapacked .
,docker create --name vc_data datapacked
使用:
docker run --volumes-from vc_data httpd
存储的生命周期
创建、共享、使用、备份、迁移、恢复备份、销毁。
现在说出这些阶段如何实现。
Rex-Ray分布式存储方案
学习如何使用https://rexray.io/
docker machine
https://docs.docker.com/machine/install-machine/
学习docker machine是干嘛的
怎么使用
创建
使用docker machine创建docker环境:
- ssh-copy-id 目标机器
- docker-machine create –driver generic –generic-ip-address=192.168.xxx.xxx hostname
- docker-machine ls
管理远程docker
- 查看环境变量:
docker-machine env hostname
- 切换到远程shell:
eval $(docker-machine env hostname)
- 升级到最新版:
docker-machine upgrade host1 host2
- 在不同机器间拷贝文件:
docker-machine scp host1:/xxx host2:/xxx
docker网络
参考: https://www.cnblogs.com/CloudMan6/p/7259266.html
单主机网络
none
host
bridge
joined
跨主机网络
- docker自带的: overlay,macvlan
- 第三方网络:
如果有第三方网络,docker一定会提供相应接口供他们实现,是什么?
答: libnetwork & CNM
CNM 的组成 : sandbox, endpoint, network
那分别是什么意思?包含了哪些内容?
TODO
例子:
overlay
- 使用consul进行服务发现
- 创建网络:
docker network create -d overlay ov_net1
, 查看:docker network inspect ov_net1
- 容器使用网络:
docker run xx --network ov_net1 xxx
, 查看ip:docker exec xxx ip r
- 验证跨主机通信:
docker exec xxx1 ping xxx2
了解overlay的实现
- 连通性
黄色虚线框代表 network namespace
了解 ip netns
命令: https://www.cnblogs.com/sparkdev/p/9253409.html
1. `ln /var/run/docker/netns /var/run/netns`
2. 使用 `ip netns 查看主机上的网络域名空间`
- 隔离性
不同的overlay网络是不能通信的
macvlan
打卡网卡混杂模式:
ip link set ens32 promisc on
创建macvlan网络(多个主机都要运行):
1
2
3
4docker network create -d macvlan \
--subnet=192.168.77.0/24\
--gateway=192.168.77.1
-o parent=enp0s9 mac_net1连接macvlan(位于不同的主机):
docker run -itd --name box1 --ip=192.168.77.20 --network mac_net1 busybox
测试联通性: 相互能ping通ip,但主机名不行
分析macvlan原理: https://www.cnblogs.com/CloudMan6/p/7383919.html
- 没有创建bridge,因为是直接通过物理网卡的
- 进入容器查看ip a,发现有
eth0@ifx
,这就是虚拟出的网卡 - 连接示意图如下:
用sub-interface实现多macvlan网络: 源于macvlan会独占网卡,因此一个网卡只能创建一个网络,但可以通过链接到网卡的子网卡上(也就是使用VLAN,可以接1-4094个网络),盗图如下:
不同的macvlan通信:使用路由中转
第三方网络方案
flannel
- 是什么?
centos开发的容器网络解决方案,主要为kubernates设计,但也可以单独使用 - 它的基本原理?
通过为每隔主机分配子网,然后容器从子网中分配IP,无需NAT和端口映射就可以跨主机通信 - 具体如何实现?
- flannel在每个主机都有agent,叫fanneld,用来分配subnet
- 主机间信息共享:通过etcd实现,这些信息是: 网络配置、已分配子网、IP等信息
实践
安装etcd: https://etcd.io/
安装flannel: https://github.com/coreos/flannel
配置flannel网络
容器连接网络:
--bip , --mtu
测试连通性: 没有DNS只能通过ip访问; 没有隔离功能;
盗个图:
// TODO
使用host-gw作为backend
weave网络
安装: https://www.weave.works/docs/net/latest/install/installing-weave/
运行
weave launch
拉取docker镜像并运行weave, 完了之后如果有个防火墙警告,需要重新配防火墙:1
2
3
4
5WARNING: existing iptables rule
'-A FORWARD -j REJECT --reject-with icmp-host-prohibited'
will block name resolution via weaveDNS - please reconfigure your firewall.查看网络配置,多了weave:
docker network ls
,docker network inspect weave
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# docker network inspect weave
{
"Name": "weave",
"Id": "a96fe9925c0e970ddb7c0e8334f8a625c9eef1307b994183b7bfa331616be050",
"Created": "2019-07-15T09:19:51.673661228+09:00",
"Scope": "local",
"Driver": "weavemesh",
"EnableIPv6": false,
"IPAM": {
"Driver": "weavemesh",
"Options": null,
"Config": [
{
"Subnet": "10.32.0.0/12"
}
]
},
}配置网络: (恢复之前的环境,执行
eval $(weave env --restore)
)1
2
3
4
5# weave env
export DOCKER_HOST=unix:///var/run/weave/weave.sock ORIG_DOCKER_HOST=
# eval $(weave env)
# docker run --name bbox1 -itd busybox查看网络结构:
docker exec bbox1 ip a
, 找到ethwe@ifxxxip link
, 找到上述网卡brctl show
,看weave网络链接的网卡不止一个ip -d link
: 深入探究- 得出网络连接拓扑:
再运行一个bbox2,会发现可以通过hostname访问,说明有DNS服务,网络结构:
weave 主机间连通性
weave与外网连通
calico网络
3层网络,driver为calico,
同一个网络可通信,不同网络不行
calico的network policy可自定义ACL,实现不同calico网络的通信
policy的修改:配置文件
calicoctl apply -f policy.yml
calico可创建子网,先创建IP Pool
网络选择因素
没有最好,只有适合,下面是一些选择的总结。
网络拓扑:基于什么网络实现,vxlan、macvlan、overlay、underlay还是纯3层网络
是否需要分布式存储网络信息,比如etcd、consule
是否需要划分子网
连通与隔离性考虑
性能:underlay优于overlay,因为更底层