zoukankan      html  css  js  c++  java
  • Docker使用笔记

    听说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
    
     
    
    一个小破站,偶尔也写写技术博客,个人随笔,欢迎小伙伴们的访问
    
    今生的博客
  • 相关阅读:
    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
    jQuery UI组件库Kendo UI使用技巧小分享
    Kendo UI ListView模板功能,让Web开发更轻松
    UI组件套包DevExpress ASP.NET Core v20.2新版亮点:全新的查询生成器
    Devexpress WinForms最新版开发.NET环境配置Visual Studo和SQL Server对应版本
    全新的桌面应用数据可视化呈现方式,Sankey Diagram控件你了解多少?
    java中的递归方法
    连接数据库查询 将查询结果写入exce文件中
    java连接mysql数据查询数据
  • 原文地址:https://www.cnblogs.com/coldfirecx/p/13666449.html
Copyright © 2011-2022 走看看