docker知识总结成图

本文将大部分docker知识按图总结,便于理解。

存储

本章我们学习以下内容:

  1. docker 为容器提供了两种存储资源:数据层和 Data Volume。
  2. 数据层包括镜像层和容器层,由 storage driver 管理。
  3. Data Volume 有两种类型:bind mount 和 docker managed volume。
  4. bind mount 可实现容器与 host 之间,容器与容器之间共享数据。
  5. volume container 是一种具有更好移植性的容器间数据共享方案,特别是 data-packed volume container。
  6. 最后我们学习如何备份、恢复、迁移和销毁 Data Volume。

存储分类

https://www.cnblogs.com/CloudMan6/p/7152775.html

共享数据

分为主机与容器之间、容器之间共享。

https://www.cnblogs.com/CloudMan6/p/7163399.html

主机与容器

  1. bind volume
  2. docker managed volume

容器与容器-bind volume

容器与容器-volume container

创建专门的volume容器来实现

容器与容器-data-packed volume container

把数据封装在容器里,不依赖于主机,适合与不需要改变的静态配置文件。

  1. 创建带有数据的镜像:

    1
    2
    3
    FROM busybox:latest
    ADD htdocs /usr/local/apache2/htdocs
    VOLUME /usr/local/apache2/htdocs # 相当于 -v 选项
  2. 创建容器: docker build -t datapacked ., docker create --name vc_data datapacked

  3. 使用: 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有哪些driver

创建

使用docker machine创建docker环境:

  1. ssh-copy-id 目标机器
  2. docker-machine create –driver generic –generic-ip-address=192.168.xxx.xxx hostname
  3. docker-machine ls

管理远程docker

  1. 查看环境变量:docker-machine env hostname
  2. 切换到远程shell: eval $(docker-machine env hostname)
  3. 升级到最新版: docker-machine upgrade host1 host2
  4. 在不同机器间拷贝文件: docker-machine scp host1:/xxx host2:/xxx

docker网络

参考: https://www.cnblogs.com/CloudMan6/p/7259266.html

单主机网络

none

host

bridge

joined

跨主机网络

  1. docker自带的: overlay,macvlan
  2. 第三方网络:

如果有第三方网络,docker一定会提供相应接口供他们实现,是什么?

答: libnetwork & CNM

CNM 的组成 : sandbox, endpoint, network

那分别是什么意思?包含了哪些内容?

TODO

例子:

overlay

  1. 使用consul进行服务发现
  2. 创建网络: docker network create -d overlay ov_net1, 查看: docker network inspect ov_net1
  3. 容器使用网络: docker run xx --network ov_net1 xxx, 查看ip:docker exec xxx ip r
  4. 验证跨主机通信: docker exec xxx1 ping xxx2

了解overlay的实现

  1. 连通性

黄色虚线框代表 network namespace

了解 ip netns命令: https://www.cnblogs.com/sparkdev/p/9253409.html

1. `ln /var/run/docker/netns /var/run/netns`
2. 使用 `ip netns 查看主机上的网络域名空间`
  1. 隔离性

不同的overlay网络是不能通信的

macvlan

  1. 打卡网卡混杂模式: ip link set ens32 promisc on

  2. 创建macvlan网络(多个主机都要运行):

    1
    2
    3
    4
    docker network create -d macvlan \
    --subnet=192.168.77.0/24\
    --gateway=192.168.77.1
    -o parent=enp0s9 mac_net1
  3. 连接macvlan(位于不同的主机): docker run -itd --name box1 --ip=192.168.77.20 --network mac_net1 busybox

  4. 测试联通性: 相互能ping通ip,但主机名不行

  5. 分析macvlan原理: https://www.cnblogs.com/CloudMan6/p/7383919.html

    1. 没有创建bridge,因为是直接通过物理网卡的
    2. 进入容器查看ip a,发现有eth0@ifx,这就是虚拟出的网卡
    3. 连接示意图如下:
  6. 用sub-interface实现多macvlan网络: 源于macvlan会独占网卡,因此一个网卡只能创建一个网络,但可以通过链接到网卡的子网卡上(也就是使用VLAN,可以接1-4094个网络),盗图如下:

  7. 不同的macvlan通信:使用路由中转

第三方网络方案

flannel

  1. 是什么?
    centos开发的容器网络解决方案,主要为kubernates设计,但也可以单独使用
  2. 它的基本原理?
    通过为每隔主机分配子网,然后容器从子网中分配IP,无需NAT和端口映射就可以跨主机通信
  3. 具体如何实现?
    1. flannel在每个主机都有agent,叫fanneld,用来分配subnet
    2. 主机间信息共享:通过etcd实现,这些信息是: 网络配置、已分配子网、IP等信息

实践

  1. 安装etcd: https://etcd.io/

  2. 安装flannel: https://github.com/coreos/flannel

  3. 配置flannel网络

  4. 容器连接网络: --bip , --mtu

  5. 测试连通性: 没有DNS只能通过ip访问; 没有隔离功能;

盗个图:

// TODO
使用host-gw作为backend

weave网络

  1. 安装: https://www.weave.works/docs/net/latest/install/installing-weave/

  2. 运行weave launch拉取docker镜像并运行weave, 完了之后如果有个防火墙警告,需要重新配防火墙:

    1
    2
    3
    4
    5
    WARNING: existing iptables rule

    '-A FORWARD -j REJECT --reject-with icmp-host-prohibited'

    will block name resolution via weaveDNS - please reconfigure your firewall.
  3. 查看网络配置,多了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"
    }
    ]
    },
    }
  4. 配置网络: (恢复之前的环境,执行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
  5. 查看网络结构:

    1. docker exec bbox1 ip a, 找到ethwe@ifxxx
    2. ip link, 找到上述网卡
    3. brctl show,看weave网络链接的网卡不止一个
    4. ip -d link: 深入探究
    5. 得出网络连接拓扑:
  6. 再运行一个bbox2,会发现可以通过hostname访问,说明有DNS服务,网络结构:

  7. weave 主机间连通性

  8. weave与外网连通

calico网络

  1. 3层网络,driver为calico,

  2. 同一个网络可通信,不同网络不行

  3. calico的network policy可自定义ACL,实现不同calico网络的通信

  4. policy的修改:配置文件calicoctl apply -f policy.yml

  5. calico可创建子网,先创建IP Pool

网络选择因素

没有最好,只有适合,下面是一些选择的总结。

  1. 网络拓扑:基于什么网络实现,vxlan、macvlan、overlay、underlay还是纯3层网络

  2. 是否需要分布式存储网络信息,比如etcd、consule

  3. 是否需要划分子网

  4. 连通与隔离性考虑

  5. 性能:underlay优于overlay,因为更底层