※,Docker 网络
Docker网络有自己的子命令,主要包括以下几种。
docker network ls 用于列出运行在本地Docker主机上的全部网络。
docker network create 创建新的Docker网络。默认情况下,在Windows上会采用NAT 驱动,在Linux上会采用Bridge 驱动。读者可以使用-d 参数指定驱动(网络类型)。docker network create -d overlay overnet 会创建一个新的名为overnet的覆盖网络,其采用的驱动为Docker Overlay 。
docker network inspect提供Docker网络的详细配置信息。
docker network prune删除Docker主机上全部未使用的网络。
docker network rm 删除Docker主机上指定网络
※,Docker覆盖网络
docker network create 是创建新网络所使用的命令。-d参数允许用户指定所用驱动,常见的驱动是Overlay。也可以选择使用第三方驱动。对于覆盖网络,控制层默认是加密的。需要指定-o encrypted对数据层进行加密(会导致额外的性能开销)。
docker network ls用于列出Docker主机上全部可见的容器网络。Swarm模式下的Docker主机只能看到已经接入运行中的容器的网络。这种方式保证了网络Gossip开销最小化。
docker network inspect用于查看特定容器网络的详情。其中包括范围、驱动、IPv6、子网配置、VXLAN网络ID以及加密状态。
docker network rm 删除指定网络。
※,docker内嵌dns服务器
※,用于故障排除的容器和服务日志:(深入浅出docker pdf版本 P165):
在使用docker过程中遇到问题时,检查daemon日志以及容器日志(应用日志)是非常有必要的。在Linux上,的daemon日志的存储位置取决于当前系统正在使用的初始化方式。如果是Systemd,日志会存储在Journald,并且可以通过journalctl 查看。
- ·journalctl -h' //查看各个选项的含义
- `journalctl -u docker.service· // -u是unit的意思。只查看docker系统日志。左右方向键可以查看被截掉的部分。
- ·journalctl -u docker.service --no-pager· // --no-pager 选项可以让输出不分页,直观效果就是不需要按左右方向键查看被截掉的部分了。
- ·journalctl -u docker.service --no-pager -r -n 10· // -r选项倒序排列。-n 10表示只输出10行。 在一起的效果是:只输出最后10行日志内容。常用。
- ·journalctl -u docker.service --no-pager -r -n 10 | vim -· //这个可以将其放在vim编辑器中查看,方便查询等操作。·vim -·暂不清楚是什么个意思和原理。
※,培训课程文件记录
# docker网络架构:CNM、libnetwork、驱动
- CNM(Container Network Model):CNM 是设计标准。在 CNM 中,规定了 Docker 网络架构的基础组成要素。ppt
- Libnetwork 是 Docker 对 CNM 的一种实现,提供了 Docker 核心网络架构的全部功能。go语言实现,开源库。
- 驱动:驱动通过实现特定网络拓扑的方式来拓展该模型的能力。不同的驱动可以通过插拔的方式接入 Libnetwork 来提供定制化的网络拓扑。
- 本地驱动(原生驱动):Docker 封装了一系列本地驱动,覆盖了大部分常见的网络需求。
其中包括单机桥接网络(Single-Host Bridge Network)、多机覆盖网络(Multi-Host Overlay)
- 远程驱动(第三方驱动)。
# 原生驱动支持:
- bridge:见下单机桥接网络
- host: 与宿主机共享网络栈。容器可以操纵宿主机的网络配置,很危险一般不用。
- null:
- container: --network=container:id/name
- macvlan: 跨主机互联的一种网络方案
- overlay: 大多是借助网络插件实现跨主机互联 (内核版本大于等于3.16)
# 远程驱动方案常见的有:Pipework、Flannel、Weaveworks、Open vSwitch(虚拟交换机)、Calico等等。
- flannel:借助ETCD或CONSUL实现跨主机通信
- calico:同flannel类似,借助ETCD或CONSUL实现跨主机通信
- weaveworks: 无需借助其他工具# bridge单机桥接网络:
- 每个 Docker 主机都有一个默认的单机桥接网络(docker inspect id),在 Linux 上网络名称为 bridge.
默认的“bridge”网络被映射到内核中为“docker0”的 Linux 网桥.
- 一对veth,一端在容器中,一端在docker0网桥上。PPT图解。
- `docker network ls`
- docker network inspect bridge
- docker network create mynet // 创建自定义单机桥接网络 brctl show; docker network inspect mynet
- docker network create 创建新的Docker网络。默认情况下,在Windows上会采用NAT 驱动,在Linux上会采用Bridge 驱动。使用-d 参数指定驱动(网络类型)
- docker network create -d overlay overnet 会创建一个新的名为overnet的覆盖网络,其采用的驱动为Docker Overlay 。
- docker run -itd --name box1 --network mynet busybox
- 原生bridge不支持dns解析,自定义桥接网络支持dns解析。
- docker network prune //删除未被使用的所有网络
- docker network rm <networkName> // 删除指定网络
# swarm集群部署 跨主机通信 各节点环境最好保持一致
- docker swarm init --advertise-addr 192.168.1.107:2377 --listen-addr 192.168.1.107:2377
- 在当前初始化swarm的主机上运行docker swarm join-token worker 和 docker swarm join-token manager命令来获取添加新的工作节点和管理节点到swarm的命令和Token(一个主机节点是作为工作节点还是作为管理节点接入完全取决于使用了哪个Token)。然后在其他主机上执行获取到的命令即可加入这个swarm。
- docker node ls
- docker network create -d overlay ol-net
- 将服务接入overlay网络。docker service create --name bbox-service --replicas 3 --network ol-net busybox sleep 3600
- docker service ls
- docker service ps bbox-service
- docker service scale bbox-service=5 //缩减、扩容
※,docker 跨主机互联的几种方案 https://www.bilibili.com/video/BV1Mz4y1C7hT
方案一、
※,添加静态路由
方案二、
※,
※,centos7中 flanneld 的安装与使用:关键点:systemd的使用!!!
★,安装:
- ·yum install -y flannel·,安装后的变化如下:
- ·/etc/sysconfig/flanneld· //产生了flanneld的配置文件,需要将其中的etcd地址改一下。
- ·/usr/libexec/flannel/mk-docker-opts.sh· //产生了一个用于生成 docker环境变量的脚本(主要是用于指定docker的--bip参数)
- ·/usr/lib/systemd/system/docker.service.d/flannel.conf· //产生了 systemd 下的docker.service的 drop-in 文件,并且通过 systemctl status docker 发现竟然已经自动加载了此drop in文件!里面指定了一个环境变量文件:`/run/flannel/docker`
- `/run/flannel/` //产生了一个文件夹
- ·ETCDCTL_API=2 etcdctl mk /atomic.io/network/config '{ "Network": "10.33.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }'· // 往etcd中配置自己指定的网段。
- ·systemctl start flanneld·//启动flanneld后发生的事情如下:
- flanneld 读取etcd中的网段,然后生成一个此网段中的ip地址,将其记录到·/run/flannel/subnet.env·文件。
- flanneld etcd集中配置中注册当前主机的ip地址。比如:key: ·/atomic.io/network/subnets/10.33.7.0-24· value: `{"PublicIP":"10.70.128.163","BackendType":"vxlan","BackendData":{"VtepMAC":"da:8a:c2:d4:12:08"}}`
- 通过 systemd下flanneld.service中的配置(ExecStartPost),生成·/run/flannel/docker·, 这个/run/flannel/docker文件中指定了docker启动参数--bip,这个bip由flanneld产生,和flanneld在同一个子网。这样就只要重启下docker即可。
- ip a可以看到多了一个flanneld.1的 虚拟网卡
- ·systemctl daemon-reload· //重新加载systemd下的配置文件(这一步主要是重新加载·/usr/lib/systemd/system/docker.service.d/flannel.conf·,但是这个加载 在flanneld安装的时候就已经自动做过了,所以这一步无需做)
- ·systemctl restart docker·//重启docker ,然后发现docker0的ip变成了和flanneld在一个字网的地址。这样跨主机的docker容器就可以通信了。
- 注意:重启docker的过程中docker做了一件事:修改了iptables中的filter表中的FORWARD链的规则!!!!
- ==============问题排查================
- 如果还有不能互通,基本就是防火墙的问题了。
- ·systemctl stop firewalld·
- `iptables -P FORWARD ACCEPT`// 将filter表的FORWARD链的默认策略改为ACCEPT。
- ·setenforce 0· //selinux 策略设为Permissive。
★,docker容器如何通过flanneld进行跨主机通信:
A主机上docker0网桥的IP假设为:10.33.41.1/24,flanneld的IP地址为:10.33.41.0/32。A上有个容器IP: 10.33.41.2/24,A主机上的路由表为:
A上的容器的路由表为:
B主机上docker0网桥的IP假设为:10.33.7.1/24,flanneld的IP地址为:10.33.7.0/32。其上有个容器IP: 10.33.7.2/24
A主机在容器内ping B 主机: ping 10.33.7.2的过程为:
-
容器里执行·ip r get 10.33.7.2·,得到结果·10.33.7.2 via 10.33.41.1 dev eth0 src 10.33.41.2· //可以看到 去往10.33.7.2需要经过网关设备eth0(实际就是docker0,在容器里叫eth0)。src是封包的源IP,目的ip当然是10.33.7.2了。注意10.33.41.1是docker0网关(而不是一个待去往的目的IP!!),网关的作用是数据到达网关后由网关决定下一步去往哪里,到达docker0后,docker0再根据宿主机的路由表·ip r get 10.33.7.2·得到结果·10.33.7.2 dev flannel.1 src 10.33.41.0·,即需要经过flanneld这个虚拟网卡。flanneld根据etcd中的配置信息拿到10.33.7.0这个网段的物理机的ip地址,然后flanneld重新封包,目的IP是 10.33.7.0这个网段的物理机的ip地址。到达B主机后,flanneld解包,然后将包传给docker0,然后传给容器。从而通信。
-
※,