Docker使用笔记

Docker使用笔记

Scroll Down

听说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