• 【Docker】学习纪录+操作纪录


    目录

    一.初级篇

    1.Docker官网 https://www.docker.com/

    2.CentOS7+安装教程

    3.本地镜像发布到阿里云

    4.Docker私有库

      5.安装常用软件

      ①安装Tomcat

      ②安装mysql

        ③redis安装

      二.高级篇(Docker与微服务实战)

    1.Docker复杂安装

    1.1安装mysql主从复制

    1.2 Redis分布式存储

    2.虚悬镜像

    3.新建微服务工程并形成jar包

    4.docker network

    5.Docker Compose

    5.1安装Docker Compose

    5.2核心概念

    5.3 Docker Compose使用步骤

    5.4 Compose常用命令

    5.5 Compose编排微服务

    5.6 Portainer 轻量级可视化工具

    5.7 Docker容器监控之CIG(重量化)


    本篇文章是在学习Docker之中,自己写的笔记,有什么错误请大佬们指正!

    一.初级篇

    1.Docker官网 https://www.docker.com/

    2.CentOS7+安装教程


      ①cat /etc/redhat-release #查看版本
      ②如果之前有安装过,卸载重装
      ③yum -y install gcc #yum安装gcc相关
       yum -y install gcc-c++
      ④yum install -y yum-utils #安装需要的软件包
      ⑤yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      #配置阿里镜像库
      ⑥yum makecache fast  #更新yum软件包索引
      ⑦yum -y install docker-ce docker-ce-cli containerd.io #安装Docker引擎
      ⑧systemctl start docker #启动docker
      ⑨测试
      ps -ef|grep docker
      docker run hello-world
      docker version
      ⑩阿里云镜像加速
      到阿里云注册获得一个镜像加速器地址
      粘贴脚本直接执行
      


    3.本地镜像发布到阿里云


      进入阿里云【容器镜像服务】注册个人实例、命名空间、仓库,即有相关指令完成上传
      从阿里云拉取镜像同理
      


    4.Docker私有库


      ①下载镜像Docker Registry
      docker pull registry
      ②运行私有库Registry 相当于本地有个私有Docker hub
      docker run -d -p 5000:5000 -v /zxy/myregistry/:/tmp/registry --privileged=true registry
      ③docker pull ubuntu #下载一个ubuntu镜像
       docker run -it ubuntu /bin/bash #运行ubuntu
       apt-get update #更新镜像文件 加强
       apt-get install net-tools #为本ubuntu系统添加ifconfig功能
      ④进行提交
      docker commit -m="ifconfig cmd add" -a="zxy" 5bd7d1ae02c9 zxyubuntu:1.1
      ⑤curl验证私有库上有什么镜像
      curl -XGET http://localhost:5000/v2/_catalog
      ⑥将新镜像修改符合私服规范的tag
      docker tag zxyubuntu:1.1 localhost:5000/zxyubuntu:1.1 #修改规范 更符合上传命名规则
      ⑦修改配置文件使之支持http
      vim /etc/docker/daemon.json
      添加以下的json,注意逗号
      "insecure-registries":["localhost:5000"]
      这么做的理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制
      systemctl restart docker #重启
      ⑧发布到私有库里
      docker push localhost:5000/zxyubuntu:1.1
      ⑨再用curl验证私有库上有什么镜像
      curl -XGET http://localhost:5000/v2/_catalog
      ⑩测试私有库能不能用
      先删除有的 docker rmi -f localhost:5000/zxyubuntu:1.1
                 docker rmi -f zxyubuntu:1.1
      从私有库拉下来 docker pull localhost:5000/zxyubuntu:1.1


      
    5.安装常用软件


      搜索镜像、拉取镜像、查看镜像、启动镜像、停止容器、移除容器
      


      ①安装Tomcat


      docker pull tomcat #从dockerhub上拉下来
      docker images tomcat #查看tomcat镜像
      docker run -d -p 8080:8080 --name t1 tomca #运行tomcat镜像,以守护式进程启动,映射端口8080,命名为t1
      
      访问http://localhost:8080 会报错
      原因是新版tomcat的/bin/bash目录下有webapps和webapps.dist两个目录
      webapps里面没有任何东西 total为0,实际有东西的是webapps.dist目录下
      rm -rf webapps #删除webapps文件夹
      mv webapps.dist webapps #改名为webapps

      下载tomcat8:docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

      ②安装mysql


      docker pull mysql:8.0
      启动简单版:docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0 #启动mysql
      docker exec -it d14e2fbede9c /bin/bash # 进入容器
      mysql -uroot -p #进入mysql 
      
      里面有两大问题:
      第一.主机可用navicat连接docker上运行的mysql,但是发现docker创建的有字符编码问题
      show variables like 'character%';
      发现docker默认编码是拉丁
      
      第二.删除mysql运行的容器后数据全丢了
      
      解决:
      启动高级版:docker run -d -p 3306:3306 --privileged=true -v /zxyuse/mysql/log:/var/log/mysql -v /zxyuse/mysql/data:/var/lib/mysql -v /zxyuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8.0
      新建my.cnf 通过容器卷同步给mysql容器实例
      cd /zxyuse/mysql/conf
      vim my.cnf
      输入如下配置
      [client]
      default_character_set=utf8
      [mysqld]
      collation_server = utf8_general_ci
      character_set_server=utf8
      
      重启mysql容器,再查看编码,发现变成了utf8,数据也持久化了


      
      ③redis安装


      docker pull redis:6.0.8 #拉下来
      docker run -d -p 6379:6379 redis:6.0.8 #运行redis
      docker exec -it 90d7947c6aa4 /bin/bash #进入容器之中
      redis-cli #连接redis
      注意:redis的问题和mysql的问题也差不多,也得配容器数据卷,加入容器数据卷 记得加 --privileged=true
      第一.在CentOS宿主机上新建目录 /app/redis
      mkdir -p /app/redis
      第二.将一个redis.conf文件模板拷贝进/app/redis目录下(百度随便找一个)
      第三./app/redis目录下修改redis.conf文件
       开启redis验证    可选
        requirepass 123
     
       允许redis外地连接  必须
        注释掉 # bind 127.0.0.1

       daemonize no
        将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败

       开启redis数据持久化  appendonly yes  可选
       
      第四.使用redis6.0.8镜像创建容器
      docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

      第五.测试redis-cli连接上来
      docker exec -it ead7c995324b /bin/bash
      redis-cli
      set k1 v1
      select 10
      
      第六.请证明docker启动使用了我们自己指定的配置文件
      修改redis.conf 把database 改为9,重启redis
      
      第七. 测试redis-cli连接上来第2次
      发现select 10越界,证明成功


      
    二.高级篇(Docker与微服务实战)


    1.Docker复杂安装


    1.1安装mysql主从复制


    ①新建主服务器容器实例3307
    docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0

    ②进入/mydata/mysql-master/conf目录下创建my.cnf
    [mysqld]

    ## 设置server_id,同一局域网中需要唯一

    server_id=101 

    ## 指定不需要同步的数据库名称

    binlog-ignore-db=mysql  

    ## 开启二进制日志功能

    log-bin=mall-mysql-bin  

    ## 设置二进制日志使用内存大小(事务)

    binlog_cache_size=1M  

    ## 设置使用的二进制日志格式(mixed,statement,row)

    binlog_format=mixed  

    ## 二进制日志过期清理时间。默认值为0,表示不自动清理。

    expire_logs_days=7  

    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

    slave_skip_errors=1062

    ③修改配置,然后重启
    docker restart mysql-master

    ④进入mysql-master容器

    ⑤master容器实例内创建数据同步用户
    create user 'slave'@'%' identified by '123456'
    grant replication slave,replication client on *.* to 'slave'@'%'; #授权
    ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    flush privileges;


    ⑥新建从服务器3308
    docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0

    ⑦进入/mydata/mysql-slave/conf目录下新建my.cnf
    vim my.cnf

    [mysqld]

    ## 设置server_id,同一局域网中需要唯一

    server_id=102

    ## 指定不需要同步的数据库名称

    binlog-ignore-db=mysql  

    ## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用

    log-bin=mall-mysql-slave1-bin  

    ## 设置二进制日志使用内存大小(事务)

    binlog_cache_size=1M  

    ## 设置使用的二进制日志格式(mixed,statement,row)

    binlog_format=mixed  

    ## 二进制日志过期清理时间。默认值为0,表示不自动清理。

    expire_logs_days=7  

    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

    slave_skip_errors=1062  

    ## relay_log配置中继日志

    relay_log=mall-mysql-relay-bin  

    ## log_slave_updates表示slave将复制事件写进自己的二进制日志

    log_slave_updates=1  

    ## slave设置为只读(具有super权限的用户除外)

    read_only=1

    ⑧重启slave实例
    docker restart mysql-slave

    ⑨在主数据库中查看主从同步状态
    show master status;

    ⑩进入mysql-slave容器
    docker exec -it mysql-slave /bin/bash

    在从数据库中配置主从复制
    change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;

    解释:
    master_host:主数据库的IP地址;

    master_port:主数据库的运行端口;

    master_user:在主数据库创建的用于同步数据的用户账号;

    master_password:在主数据库创建的用于同步数据的用户密码;

    master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;

    master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;

    master_connect_retry:连接失败重试的时间间隔,单位为秒


    在从数据库中查看主从同步状态
    show slave status \G;

    在从数据库中开启主从同步
    start slave;

    再次查看主从同步状态
    show slave status \G;

    最后 测试。主机创建 从机读。

    1.2 Redis分布式存储


    问题?存1-2亿缓存数据该怎么办
    回答:哈希取余分区、一致性哈希算法分区、哈希槽分区

    哈希取余分区 有扩容缩容问题,容错性不高
    一致性哈希算法分区:一致性哈希环、服务器IP节点映射、key落到服务器的落键规则,解决了容错性、扩容性问题,有数据倾斜问题
    哈希槽分区:redis集群默认16384个槽

    ①创建六个Docker容器
    docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
    docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
    docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
    docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
    docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
    docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

    ②随便进入一个容器
    docker exec -it 524ece3eb60e /bin/bash

    为六个容器构建集群关系
    ps:注意真实ip
    redis-cli --cluster create 自己IP:6381 自己IP:6382 自己IP:6383 自己IP:6384 自己IP:6385 自己IP:6386 --cluster-replicas 1

    以6381为切入点,查看集群状态
    redis-cli -p 6381
    cluster info
    cluster nodes

    再进入6381端口的容器
    set k1 v1 发现error 因为我们不应该操作单机,应该操作集群
    set k2 v2 发现成功

    ③用集群方式进去
    redis-cli -p 6381 -c
    set k1 v1 发现成功

    ④查看集群信息 
    redis-cli --cluster check 自己IP:6381

    ⑤容错迁移
    docker stop redis-node-1 #干掉6381
    docker exec -it redis-node-2 bash
    redis-cli -p 6382 -c
    cluster nodes
    发现1号挂了 绑定的6号6386成为master

    恢复之前的3主3从
    docker start redis-node-1
    发现攻守易位,原先的6381是master,现在变成slave
    杀了6386,6381变回master,重启6386,6386变回slave

    ⑥主从扩容
    ps:哈希槽会重新分配

    步骤:
    新增主机6387和6388
    docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
    docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

    进入6387容器内部
    docker exec -it redis-node-7 /bin/bash

    新增节点
    redis-cli --cluster add-node 自己IP:6387 自己IP:6381

    检查状态
    redis-cli --cluster check 自己IP:6381

    重新分配哈希槽位
    redis-cli --cluster reshard 自己IP:6381
    然后会问如何分配槽位 现在4主 所以16384分4份,1份是4096,分给新机6387
    然后输入all 最后输入yes
    查看状态
    redis-cli --cluster check 自己IP:6381

    新节点的槽位是3个新区间,这是从其他节点分出来的,因为重新分配成本太高,所以其他节点分出来一点

    为主节点6387分配从节点6388
    redis-cli --cluster add-node 自己IP:6388 自己IP:6387 --cluster-slave --cluster-master-id 新主机id

    再次检查
    redis-cli --cluster check 自己IP:6382

    ⑦主从缩容
    步骤:
    先清除从节点6388
    redis-cli --cluster del-node 自己IP:6388 6388的id

    清出来的槽号重新分配
    redis-cli --cluster reshard 自己IP:6381
    依次输入 4096 6381的id 6387的id done
    等同于将6387的4096槽位分给6381

    再删除6387
    redis-cli --cluster del-node 自己IP:6387 6387的id

    恢复成3主3从

    2.虚悬镜像


    删除虚悬镜像的命令 docker image prune

    3.新建微服务工程并形成jar包


    ①通过IDEA新建一个普通微服务模块
    打包成jar包,扔到centos上

    ②通过dockerfile发布微服务部署到docker容器
    vim Dockerfile

    #基础镜像使用JAVA8
    FROM JAVA:8
    #作者
    MAINTAINER zxy
    #VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp 
    VOLUME /tmp
    #将jar包添加到容器中并改名为zxy_docker.jar
    ADD docker_boot-0.0.1-SNAPSHOT.jar zxy_docker.jar
    #运行jar包
    RUN bash -c 'touch /zxy_docker.jar'
    ENTRYPOINT ["java","- jar","/zxy_docker.jar"]
    #暴露6001端口作为微服务
    EXPOSE 6001    

    将微服务jar包和Dockerfile文件上传到同一个目录下/mydocker

    docker build -t zxy_docker:1.6 .

    ③运行容器
    docker run -d -p 6001:6001 镜像id

    ④测试

    4.docker network


    docker network ls
    docker network create aa_network
    docker network rm aa_network
    docker network inspect 网络名

    重启docker容器 ip地址会变动

    5.Docker Compose


    是Docker官方的开源项目,负责实现对Docker容器集群的快速编排

    5.1安装Docker Compose


    #下载Docker Compose
    curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    #更改权限
    chmod +x /usr/local/bin/docker-compose 

    #查看版本
    docker-compose --version

    5.2核心概念


    一文件 docker-compose.yml
    两要素 服务(service) 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器……
           工程(project) 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义
           


    5.3 Docker Compose使用步骤


    ①编写DockerFile定义各个微服务应用并构建出对应的镜像文件
    ②使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务
    ③最后,执行docker-compose up命令,来启动并运行整个应用程序,完成一键部署上线

    5.4 Compose常用命令


    docker-compose -h #查看帮助
    docker-compose up #启动所有docker-compose服务
    docker-compose up -d #启动所有docker-compose服务并后台运行
    docker-compose down #停止并删除容器、网络、卷、镜像
    docker-compose exec #yml里面的服务id #进入容器实例内部
    docker-compose ps #展示当前docker-compose编排过的运行的所有容器
    docker-compose top #展示当前docker-compose编排过的容器进程
    docker-compose logs yml里面的服务id #查看容器输出日志
    docker-compose config #检查配置
    docker-compose config -q #检查配置,有问题才输出
    docker-compose restart #重启服务
    docker-compose start #启动服务
    docker-compose stop #停止服务

    5.5 Compose编排微服务


    编写docker-compose.yml
    运行

    5.6 Portainer 轻量级可视化工具


    ①官网:http://www.portainer.io

    命令安装:docker run -d -p 8000:8000 -p 9000:9000 --name portainer     --restart=always     -v /var/run/docker.sock:/var/run/docker.sock     -v portainer_data:/data     portainer/portainer

    第一次登陆需要创建Admin,访问地址:xxx.xxx.xxx.xxx:9000

    ②Portainer常规操作:
    看着按钮点就行了

    5.7 Docker容器监控之CIG(重量化)


    ①原生命令:docker stats #可以看到当前宿主机上所有容器的CPU,内存以及网络流量等数据
                           #但是只能是当前宿主机的全部容器,数据资料是实时的,没地方存储,没有预警功能

    CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表

    ②操作:
    在宿主机/mydocker/cig 目录下创建docker-compose.yml(注意yml格式,空格等)
     
    version: '3.1'

    volumes:

      grafana_data: {}

    services:

     influxdb:

      image: tutum/influxdb:0.9

      restart: always

      environment:

        - PRE_CREATE_DB=cadvisor

      ports:

        - "8083:8083"

        - "8086:8086"

      volumes:

        - ./data/influxdb:/data

     cadvisor:

      image: google/cadvisor

      links:

        - influxdb:influxsrv

      command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086

      restart: always

      ports:

        - "8080:8080"

      volumes:

        - /:/rootfs:ro

        - /var/run:/var/run:rw

        - /sys:/sys:ro

        - /var/lib/docker/:/var/lib/docker:ro

     grafana:

      user: "104"

      image: grafana/grafana

      user: "104"

      restart: always

      links:

        - influxdb:influxsrv

      ports:

        - "3000:3000"

      volumes:

        - grafana_data:/var/lib/grafana

      environment:

        - HTTP_USER=admin

        - HTTP_PASS=admin

        - INFLUXDB_HOST=influxsrv

        - INFLUXDB_PORT=8086

        - INFLUXDB_NAME=cadvisor

        - INFLUXDB_USER=root

        - INFLUXDB_PASS=root
        
    ③启动 docker compose up

    ④访问cAdvisor收集服务 http://ip:8080/
    ⑤访问influxdb存储服务 http://ip:8083/
    ⑥访问grafana展现服务 http://ip:3000/


     

  • 相关阅读:
    基于图搜索的规划算法之A*家族(四):Lifelong Planning A*算法
    国内用ChatGPT可以吗
    搞了一个更完善的javaagent项目结构
    SpringCash
    【学习笔记】NOIP暴零赛
    H3C的IRF堆叠互联关系说明
    英集芯推出4串锂电池100W移动电源升降压方案SoC芯片IP5389
    Vue基础与常用指令,Element基础
    Apple Silicon配置二进制环境(一)
    考研信息管理系统
  • 原文地址:https://blog.csdn.net/qq_35852228/article/details/128033929