目录
Docker三剑客之一:docker-machine
Docker三剑客之一:docker-compose
Docker三剑客之一:docker-swarm
创建swarm集群
创建集群服务
部署swarm监控
使用yml文件的形式创建集群
Docker Machine 是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境。Docker Machine 项目基于 Go 语言实现的,支持在常规Linux操作系统、虚拟化平台、openstack、公有云等不同环境下安装配置docker host。
Docker Machine安装:
创建machine: machine指的是docker daemon主机,其实就是在host上安装和部署docker。
上传docker-machine-Linux-x86_64-0.16.2到docker1 中
mv docker-machine-Linux-x86_64-0.16.2 /usr/local/bin/
cd /usr/local/bin/
mv docker-machine-Linux-x86_64-0.16.2 docker-machine
chmod +x docker-machine
docker-machine ##说明安装成功
docker2已经安装 docker
创建machine要求免密登陆远程主机: # ssh-keygen # ssh-copy-id 目标ip
ssh-keygen
vim /etc/hosts
ssh-copy-id docker3
ssh docker3##测试可以通过免密连接
docker-machine create --driver generic --generic-ip-address=172.25.254.3 docker3 ##创建主机 docker3但是失败了,找不到路径
get-docker.sh ##更改repo地址
--driver generic
指定驱动为普通驱动--engine-install-url
指定安装脚本地址,--generic-ip-address
需要安装docker的客户端ip以及主机名
docker-machine ls #查看节点 可以看到连的是docker3的2376端口
cd /etc/yum.repos.d/
ls #会自己出现docker-ce.repo源
开启一个2376端口用于远程连接
cd /etc/sysctl.d/
ls
scp docker.conf docker3:/etc/sysctl.d/
使之生效
docker-machine create --driver generic --generic-ip-address=172.25.254.2 docker2 #由于docker2上已经安装docker,所以很快只需添加节点
添加成功,查看节点:
docker-machine env docker2 显示访问docker2所需的环境变量
根据提示执行:eval $(docker-machine env docker2),可以直接切入目标主机。
切换到docker3上
rpm -qa | grep bash
#需要安装bash扩展
docker主机上生成的配置文件,从配置文件中可以看出,docker daemon启用了TLS验证功能,docker-machine已经为其生成好了所需的证书文件
安装一个bash脚本确定操作的是哪个主机
vim .bashrc
添加:PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
docker-machine config docker2
#查看打印docker2的配置信息
Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/compose 上
我们知道使用Dockerfile模板文件可以让用户很方便的定义一个单独的应用容器,其实在工作中,经常会碰到需要多个容器相互配合来完成的某项任务情况,例如工作中的web服务容器本身,往往会在后端加上数据库容器,甚至会有负责均衡器,比如LNMP服务
Compose 就是来做这个事情的,它允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)
Compose 中有两个重要的概念:
服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义
mkdir compose
cd compose/
ls
docker-compose
docker run --rm -it nginx bash ##查看nginx中的配置文件
cd -
ls
mkdir proxy
cd proxy/
ls
\vi nginx.conf
vim nginx.conf ##修改配置文件
建立docker-compose.yml文件
version: "3.7" # 指定 compose 文件的版本
services: # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
Swarm deamon只是一个调度器(Scheduler)+路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,会收集重建集群信息。
Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持
docker-compose down
docker ps -a
cd harbor/
ls
./install.sh --help
./install.sh --with-chartmuseum #启用helmchart插件
docker-compose ps
docker swarm init #初始化后会出现一个token
docker swarm join --token SWMTKN-1-4v7u4pqspl5squgymmpu9zzkvw5d01vp0gu35arjkau3m3fkpy-e1ft59wjflb3l7n0f6997ffum 172.25.254.2:2377
docker node ls #查看节点部署
cat daemon.json ##默认镜像仓库
scp -r daemon.json certs.d/ docker3:/etc/docker/
vim /etc/hosts
scp -r daemon.json certs.d/ docker3:/etc/docker/
scp -r daemon.json certs.d/ docker4:/etc/docker/
在docker3,4上
cd /etc/docker
ls
systemctl daemon-reload #加载
systemctl reload docker
docker info
因为之前的实验设置了内容信任,从本地拉取镜像需要验证,所以清理之前的镜像仓库
docker-compose down ##停止容器
ls
./prepare #清理
df -h /
ls
rm -fr docker-compose.yml
docker volume ls
docker volume prune #删除卷
cd /data #仓库信息都在/data里面
ls
cp -r certs/ ~
ls
rm -fr * ##删除/data的内容
cp -r ~/certs/ .
ls
pwd
cd
cd harbor/
ls
./install.sh --help
./install.sh --with-chartmuseum #重新启动
docker push reg.westos.org/library/busybox:latest
docker push reg.westos.org/library/nginx:latest
现在1是仓库,2、3、4是工作节点,其中2是leader
docker service ls #查看集群服务
docker service create --name webservice -p 80:80 --replicas 3 nginx ##创建集群内服务webservice
docker service lsdocker ps
测试负载均衡
此时三个节点均可以访问到
docker search myapp
docker search ikubernetes/myapp:v1
docker search ikubernetes
docker pull ikubernetes/myapp:v1
docker pull ikubernetes/myapp:v2
docker tag ikubernetes/myapp:v1
docker tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
docker tag ikubernetes/myapp:v2 reg.westos.org/library/myapp:v2
docker push reg.westos.org/library/myapp:v1
docker push reg.westos.org/library/myapp:v2 #上传镜像到本地仓库
docker service rm webservice #删除集群服务
docker service ls
docker service create --name webservice -p 80:80 --replicas 3 myapp:v1
docker service scale webservice=6 .##拉伸服务容器个数拉伸为6个
docker service ls
docker service ps webservice #可以看到有6个容器
节点ip后加hostname.html可以查看容器id,以上结果说明是三个容器在负载均衡提供服务
docker service scale webservice=3
docker service ps webservice
docker service rm webservice ##删除服务
docker service ls
在docker1上传监控镜像到仓库:
docker pull dockersamples/visualizer
docker tag dockersamples/visualizer:latest reg.westos.org/library/visualizer:latest
docker push reg.westos.org/library/visualizer:latest
docker service ls
docker node ls ##查看集群节点
docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock visualizer ##启动监控
docker service ls
docker service create --name webservice -p 80:80 --replicas 3 myapp:v1 ##创建服务
在监控页面可以看到
docker service scale webservice=6
docker service scale webservice=20
同样也可以缩减为10个
docker service update --image myapp:v2 --update-parallelism 2 --update-delay 2s webservice##滚动更新
--image 指定要更新的镜像
--update-parallelism 指定最大同步更新的任务数
--update-delay 指定更新间隔
docker service rollback webservice ##更新回滚
删除原来的集群服务
docker service rm webservice
docker service rm viz
docker service ls
vim docker-compose.yml #编辑部署文件
docker stack deploy -c docker-compose.yml mycluster #
stack在部署的时候自动为服务创建了网络;
-c指定文件;mycluster是指定的名称
docker service ls #可以看到有三个副本
docker service ps mycluster_webservice ##查看服务
vim docker-compose.yml
docker stack deploy -c docker-compose.yml mycluster 更新
在yml文件中更改版本数为v2
docker stack rm mycluster #删除监控
docker service ls
docker node ls #查看集群节点
docker node promote docker3 ##将docker3提升为master
docker node ls #暂时还没就绪
docker node demote docker2 ##将docker2降级
docker node ls ##已经没有查看的权限了
docker3已经成功升级为master
docker swarm leave #worker节点脱离集群
docker node ls
docker node rm docker2 ##删除集群节点
docker node rm docker4
docker node ls
docker swarm leave
docker swarm leave --force #master也脱离集群
docker node ls