目录
一.初级篇
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之中,自己写的笔记,有什么错误请大佬们指正!
①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
⑩阿里云镜像加速
到阿里云注册获得一个镜像加速器地址
粘贴脚本直接执行
进入阿里云【容器镜像服务】注册个人实例、命名空间、仓库,即有相关指令完成上传
从阿里云拉取镜像同理
①下载镜像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
搜索镜像、拉取镜像、查看镜像、启动镜像、停止容器、移除容器
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
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,数据也持久化了
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越界,证明成功
①新建主服务器容器实例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亿缓存数据该怎么办
回答:哈希取余分区、一致性哈希算法分区、哈希槽分区
哈希取余分区 有扩容缩容问题,容错性不高
一致性哈希算法分区:一致性哈希环、服务器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从
删除虚悬镜像的命令 docker image prune
①通过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
④测试
docker network ls
docker network create aa_network
docker network rm aa_network
docker network inspect 网络名
重启docker容器 ip地址会变动
是Docker官方的开源项目,负责实现对Docker容器集群的快速编排
#下载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
一文件 docker-compose.yml
两要素 服务(service) 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器……
工程(project) 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义
①编写DockerFile定义各个微服务应用并构建出对应的镜像文件
②使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务
③最后,执行docker-compose up命令,来启动并运行整个应用程序,完成一键部署上线
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 #停止服务
编写docker-compose.yml
运行
①官网: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常规操作:
看着按钮点就行了
①原生命令: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/
上一篇:C语言学习笔记(十)
下一篇:MySQL批量入库的几种方式详解