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
    
     
    
    一个小破站,偶尔也写写技术博客,个人随笔,欢迎小伙伴们的访问
    
    今生的博客
  • 相关阅读:
    Hadoop性能调优、YARN的内存和CPU配置
    linux权限之su和sudo的差别
    Hadoop JobHistory
    Hive存储格式
    左边元素和右边一样高
    状态码
    document.ready(function(){}),window.onload,$(function(){})的区别
    模糊查询实例
    jq实时监测输入框内容改变
    博客遇到的问题
  • 原文地址:https://www.cnblogs.com/coldfirecx/p/13666449.html
Copyright © 2011-2022 走看看