Docker初步

Docker Machine

Docker Machine 是一个 docker 管理工具,它解决了 docker 的两个问题:

  1. docker 只能运行在 Linux 上
  2. docker 只能管理运行本机的 docker 镜像。

本质上 docker-machine 是一个虚拟机管理工具,它通过创建一个安装好 docker 的虚拟机(支持 VirtualBox,DigitalOcean,EC2 等),并设置对应的环境变量(DOCKER_HOST,DOCKER_MACHINE_NAME 等),使得本地的 docker 工具获得透明远程操作虚拟机的能力。从而使本身不支持 docker 的 Windows 和 Mac 系统能够直接使用 docker 命令。

Docker Compose

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。Compose 定位是 “定义和运行多个 Docker 容器的应用”。

Compose 中有两个重要的概念:

  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。-
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

Docker Install

Docker CE is supported on CentOS 7.3 64-bit.

  1. Set up the repository

Set up the Docker CE repository on CentOS:

sudo yum install -y yum-utils

sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

sudo yum makecache fast
  1. Get Docker CE

Install the latest version of Docker CE on CentOS:

sudo yum -y install docker-ce

Start Docker:

sudo systemctl start docker
  1. Test your Docker CE installation

Test your installation:

sudo docker run hello-world

DaoCloud Docker 镜像加速器

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://2f45f2ee.m.daocloud.io

Docker Swarm Mode

Docker 从 v1.12.0 后开始集成 swarm mode(swarmkit),关于 swarm 的所有操作可以直接使用 docker swarm 命令来完成。Docker Swarm 是 docker 原生的用于管理 docker 集群的工具,内置 kv 存储功能,不再需要外置的 etcd,目前的功能主要有:

  • Docker 节点集群的管理,包括集群的创建,master,worker 节点的加入删除。
  • 服务的管理,包括 service 的创建删除,update,scale 等。
  • 跨主机的网络管理(overlay)
  • 服务发现(内建 DNS 服务,服务可以通过 dns 发现)
  • 服务负载均衡 LB(端口暴露 routing meshing, VIP, DNS-round-robin)

Swarm 就是一个运行 docker engine 的节点(node)的集合。这个节点集合可以用来发布和编排服务。而加入到这个 swarm 中的 node 就是运行在 swarm mode。

容器网络方案

隧道方案

特点是对底层的网络没有过高的要求,一般来说只要是三层可达就可以,只要是在一个三层可达网络里,就能构建出一个基于隧道的容器网络。问题也很明显,一个大家共识是随着节点规模的增长复杂度会提升,而且出了网络问题跟踪起来比较麻烦,大规模集群情况下这是需要考虑的一个点。

Overlay

Overlay 网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在 IP 报文之上的新的数据格式。这样不但能够充分利用成熟的 IP 路由协议进程数据分发,而且在 Overlay 技术中采用扩展的隔离标识位数,能够突破 VLAN 的 4000 数量限制,支持高达 16M 的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。因此,Overlay 网络实际上是目前最主流的容器跨节点数据传输和路由方案。

Overlay 网络的实现方式可以有许多种,其中 IETF(国际互联网工程任务组)制定了三种 Overlay 的实现标准,分别是:虚拟可扩展 LAN(VXLAN)、采用通用路由封装的网络虚拟化(NVGRE)和无状态传输协议(SST),其中以 VXLAN 的支持厂商最为雄厚,可以说是 Overlay 网络的事实标准。

路由方案

路由技术从三层实现跨主机容器互通,没有 NAT,效率比较高,和目前的网络能够融合在一起,每一个容器都可以像虚拟机一样分配一个业务的 IP。但路由网络也有问题,路由网络对现有网络设备影响比较大,路由器的路由表应该有空间限制一般是两三万条。而容器的大部分应用场景是运行微服务,数量集很大。如果几万新的容器 IP 冲击到路由表里,导致下层的物理设备没办法承受;而且每一个容器都分配一个业务 IP,业务 IP 消耗会很快。

Calico

基于 BGP 协议的路由方案,支持很细致的 ACL 控制,对混合云亲和度比较高。 Calico 是一个纯 3 层的数据中心网络方案,而且无缝集成像 OpenStack 这种 IaaS 云架构,能够提供可控的 VM、容器、裸机之间的 IP 通信。 Calico 是一个基于 BGP 协议的虚拟网络工具,在数据中心中的虚拟机、容器或者裸金属机器(在这里都称为 workloads)只需要一个 IP 地址就可以使用 Calico 实现互连。 Workloads 间的网络隔离是通过 iptables 实现的。相比其他基于模拟的二层网络,Calico 更加简单

Calico 网络搭建

官方文档

  1. 安装 Docker
  2. 安装 ETCD
yum install etcd -y

搭建集群参考命令

etcd -name node1 -initial-advertise-peer-urls http://192.168.255.232:2380 \
-listen-peer-urls http://0.0.0.0:2380 \
-listen-client-urls http://0.0.0.0:2379,http://127.0.0.1:4001 \
-advertise-client-urls http://0.0.0.0:2379 \
-initial-cluster-token etcd-cluster \
-initial-cluster node1=http://192.168.255.232:2380,node2=http://192.168.255.233:2380 \
-initial-cluster-state new(/existing)

etcd -name node2 -initial-advertise-peer-urls http://192.168.255.233:2380 \
-listen-peer-urls http://0.0.0.0:2380 \
-listen-client-urls http://0.0.0.0:2379,http://127.0.0.1:4001 \
-advertise-client-urls http://0.0.0.0:2379 \
-initial-cluster-token etcd-cluster \
-initial-cluster node1=http://192.168.255.232:2380,node2=http://192.168.255.233:2380 \
-initial-cluster-state new(/existing)
  1. 安装 Calico

https://github.com/projectcalico/calicoctl/releases

mv calicoctl /usr/local/bin/
chmod +x /usr/local/bin/calicoctl

CalicoCtl 要求

  • 所有主机 IP 互通
  • ECTD 集群
  • 多主机网络 Docker
    • Docker 版本 1.9 及以上
    • Docker daemon 必须配置一个集群存储,配置 cluster-store
# vim /etc/docker/daemon.json
{
"cluster-store": "etcd://127.0.0.1:2379/calico"
}
calicoctl node run
calicoctl node status

创建 Calico 自定义网络 分配 IP 池

cat << EOF | calicoctl create -f -
apiVersion: v1
kind: ipPool
metadata:
cidr: 10.8.10.0/24
spec:
ipip:
enabled: false
nat-outgoing: true
disabled: false
EOF

使用 Calico 网络的容器之间,可以通过 IP 直接通讯。如果要对外提供服务,还需要配置 calico profile 策略以及 iptables 规则。

- apiVersion: v1
kind: profile
metadata:
name: calico_10_20
tags:
- calico_10_20
spec:
egress:
- action: allow
destination: {}
source: {}
ingress:
- action: allow
destination: {}
source: {}

开启 linux 包转发功能。

# vi/etc/sysctl.conf
# 修改net.ipv4.ip_forward = 0 改成 =1

测试

docker run --net calico_10_20 --name workload-A -tid busybox
docker run --net calico_10_20 --name workload-B -tid busybox

docker exec workload-A ping -c 4 workload-B
0%