【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/


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九洲带鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值