概述
目录
一.初级篇
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/
最后
以上就是唠叨大树为你收集整理的【Docker】学习纪录+操作纪录一.初级篇 二.高级篇(Docker与微服务实战)的全部内容,希望文章能够帮你解决【Docker】学习纪录+操作纪录一.初级篇 二.高级篇(Docker与微服务实战)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复