Docker使用笔记

微信扫一扫,分享到朋友圈

Docker使用笔记

一个程序猿弱鸡折腾的一个小破站,偶尔也写写技术博客,个人随笔,欢迎小伙伴们的访问

今生的博客

[TOC]

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

集群命令:

“`shell

常用命令

初始化集群

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地址连接

“`shell

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守护程序上运行的其他独立容器通信的覆盖网络

“`shell

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服务:

“`shell

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集群

“`shell

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是可以自己定的键值对。

“`shell

docker node update –label-add func=etl worker1

“`

– 然后在运行docker service create 的时候,指定–constraint参数即可指定特定的节点运行

“`shell

docker service create –name etl –constraint ‘node.labels.func == etl’ –network=cluster-net registry.cn-shenzhen.aliyuncs.com/icefire/etl:prd_cn1.0.1

“`

## 查看运行详情

“`shell

管理节点查看运行的所启动的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

一个程序猿弱鸡折腾的一个小破站,偶尔也写写技术博客,个人随笔,欢迎小伙伴们的访问

今生的博客

微信扫一扫,分享到朋友圈

Docker使用笔记

通达OA v11.7后台SQL注入到RCE[0day]

上一篇

Windows 10默认已禁用USB驱动器缓存 1903版本起无需点击安全弹出

下一篇

你也可能喜欢

Docker使用笔记

长按储存图像,分享给朋友