听说docker这东西挺好用的,可以不用各种费心思的在新服务器上搭建各种集成环境,一次封装,多次使用,高效方便解决了服务器搭建部署的实质性问题,在此记录一下,仅作为个人使用笔记
上手docker首先需要理解两个重要的概念, 镜像和容器
什么是镜像?
镜像(docker image)就是一个打包好的安装文件,镜像中不仅包含你的应用,还包含应用运行需要的所有依赖和环境,上至一些library,下至操作系统。
什么是容器?
容器(docker container)就是我们在docker Engine环境中启动的镜像实例,容器和操作系统中其它进程没有区别,只不过拥有自己的网络和存储,与系统中其它的进程实现隔离,同时也与其它容器隔离。
systemctl命令,系统服务管理器指令
停止docker服务: systemctl stop docker
启动docker服务: systemctl start docker
重启docker服务: systemctl restart docker
查看docker状态: systemctl status docker
查看docker概要信息: docker info
设置开机自启docker: systemctl enable docker
稍微理解了镜像和容器概念,现在可以尝试启动
关于docker集群(Swarm)
集群的管理和编排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化时启动 swarm 模式或者加入已存在的 swarm。
Swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.
1)Random
顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运
行的容器的数量来计算应该运行容器的节点。
2)Spread
在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。
使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
3)Binpack
Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在
一个节点上面,与Spread模式恰好相反。
节点(Node)
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现
工作节点是任务执行节点,管理节点将服务 (service)下发至工作节点执行。
管理节点默认也作为工作节点,也可以通过配置让服务只运行在管理节点。
1)manager node 管理节点:执行集群的管理功能,维护集群的状态,选举一个 leader 节点去执行调度任务。
2)worker node 工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载 task。
服务(Service)
一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。
service 是运行在 worker nodes 上的 task 的描述,service 的描述包括使用哪个 docker 镜像,以及在使用该镜像的容器中执行什么命令。
任务(Task)
任务是在 docekr 容器中执行的命令,Manager 节点根据指定数量的任务副本分配任务给 worker 节点
一个任务包含了一个容器及其运行的命令。task 是 service 的执行实体,task 启动 docker 容器并在容器中执行任务。
docker swarm:集群管理,子命令有 init, join, leave, update。
docker service:服务创建,子命令有 create, inspect, update, remove, tasks。
docker node:节点管理,子命令有 accept, promote, demote, inspect, update, tasks, ls, rm。
集群命令:
常用命令
初始化集群
docker swarm init
创建并启动服务
docker service create --name canal canal:1.1.4
docker service create -p 8090:8090 canal
docker service create --replicas 5 canal
停止某个服务并删除
docker service rm canal
查看已经在运行的服务
docker service ls
查看某个服务运行状态
docker service ps canal
增加和删除端口映射
docker service update --publish-add 80:80 canal
docker service update --publish-rm 80:80 canal
缩容和扩容
docker service etlcanal=0
docker service etl canal=5
Docker Swarm集群配置
manager节点初始化,指定IP地址连接
docker swarm init --advertise-addr 47.106.146.183
--advertise-addr 选项表示管理节点公布它的IP是多少
在同一网络内的主机可以通过内网IP相连,不是就用公网IP连接组成集群。
其它节点必须能通过这个IP找到管理节点。
命令输出了加入swarm集群的命令,通过--token选项来判断是加入为管理节点还是工作节点
---如下主机加入成功成为工作节点---
root@work1:~# docker swarm join --token SWMTKN-1-2oxbxzgoy067hai5nsnybris3pooj8cug0f03eakka42ourroz-ds1hjtul57fdj6su6i352ir8u 47.106.146.183:2377
This node joined a swarm as a worker.
root@iZwz98i1ibppnrdsiei0hkZ:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
tyywb6ka8kz521keg1yo7o work1 Ready Active 19.03.8
q4hlzvbydrokddlyd127y9 * iZwz98i1ibppnrdsiei0hkZ Ready Active Leader 19.03.8
在管理节点部署任务给各个节点
- 首先查看网络是否有新建一个跨主机网络,若无,则新建一个
参数说明
- overlay overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案,即跨主机通信网络,使用docker原生overlay 网络,需满足两个条件:
1.Docker 运行在Swarm
2.使用键值存储的Docker主机集群
--attachable 用于集群服务或 独立容器用于与在其他Docker守护程序上运行的其他独立容器通信的覆盖网络
root@manager:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
1ce8b1da9c4c bridge bridge local
i0zwhsu18kxl cluster-net overlay swarm
cfa1eb89a489 docker_gwbridge bridge local
8df69e1bde78 host host local
n17o06g1l0ya ingress overlay swarm
f0c6fe3b8cb2 none null local
#在管理节点上创建一个新的overlay网络
docker network create -d overlay --attachable cluster-net
启动Web服务:
docker service create --replicas 1 --name dashboard --network=cluster-net -p 8686:8080 registry.cn-shenzhen.aliyuncs.com/icefire/dashboard:v1.3.4
参数说明:
-
-d: 后台运行容器,并返回容器ID;
-
-i: 以交互模式运行容器,通常与 -t 同时使用;
-
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
-
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-
运行canal时,监听的MySQL地址根据运行场景分别配置,如.4内网等,监听本机MySQL的binlog事件,配置docker0的IP地址即可;生产当在另外一台工作节点(APP服务器)运行canal和etl时,canal配置监听Web生产的内网地址即可;若是canal和etl都在web服务器部署运行则同上配置监听docker0的IP地址即可
在工作节点启动canal,保持数据一致性,但还不能保证高可用,后续可用zookeeper管理canal集群
docker run -itd --name=canal --network=cluster-net -p 11111:11111 -e canal.destinations=qcdbv2 -e canal.instance.master.address=127.0.0.1:3306 -e canal.instance.dbUsername=canaletl -e canal.instance.dbPassword=canal1qaz2wsx -e canal.instance.connectionCharset=UTF-8 canal/canal-server:v1.1.4
- 用服务方式启动ETL,给工作node打标签,下面代码段的意思是给worker1的docker打上了功能是etl的标签。func和etl是可以自己定的键值对。
docker node update --label-add func=etl worker1
- 然后在运行docker service create 的时候,指定–constraint参数即可指定特定的节点运行
docker service create --name etl --constraint 'node.labels.func == etl' --network=cluster-net registry.cn-shenzhen.aliyuncs.com/icefire/etl:prd_cn1.0.1
查看运行详情
管理节点查看运行的所启动的service:
root@iZuf6dnu8u2uq0y1j4zx4vZ:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
w5sqjm3lvv6u canal replicated 0/0 canal/canal-server:v1.1.4 *:11111->11111/tcp
sb3lnavdzqt5 dashboard replicated 1/1 registry.cn-shenzhen.aliyuncs.com/icefire/dashboard:v1.0.5 *:8686->8080/tcp
tvje9jrubykr etl replicated 1/1 registry.cn-shenzhen.aliyuncs.com/icefire/etl:prd_cn1.0.1
root@iZuf6dnu8u2uq0y1j4zx4vZ:~# docker service ps etl
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xqvd0omvncs6 etl.1 registry.cn-shenzhen.aliyuncs.com/icefire/etl:prd_cn1.0.1 iZuf60gwtfo8dfnxqjy43sZ Running Running 4 days ago
root@iZuf6dnu8u2uq0y1j4zx4vZ:~# docker service ps dashboard
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
lnewynplx8fm dashboard.1 registry.cn-shenzhen.aliyuncs.com/icefire/dashboard:v1.0.5 iZuf6dnu8u2uq0y1j4zx4vZ Running Running 30 minutes ago
一个小破站,偶尔也写写技术博客,个人随笔,欢迎小伙伴们的访问
今生的博客