<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg>
讯享网
容器虚拟化技术,解决了运行环境和配置问题的软件容器
镜像文件:image文件生成容器实例,本身也是一个文件,称为镜像文件
容器实例:一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器仓库。
docker安装方法
3.1 帮助启动类命令
启动docker:
停止docker:
重启docker:
查看docker状态:
开机启动docker:
查看docker概要信息:
查看docker总体帮助文档:
查看docker命令帮助文档:
3.2 镜像命令
1.列出本地主机上的镜像:
option说明: -a 列出本地所有的镜像
-q 只显示镜像ID
2.搜索docker镜像:
option说明:–limit N 只列出N个镜像
只列出前五个redis镜像
3.下载镜像:
option说明:没有TAG就是最新版
4.查看镜像/容器/数据卷所占的空间:
5.删除某个镜像:
option说明:-f 强制删除
- 面试题:docker虚玄镜像是什么?
仓库名、标签名都是<none>的镜像,俗称虚玄镜像
3.3 容器指令
1.新建+启动容器:
启动交互式容器
option说明:
–name=“容器新名字” 为容器指定一个名称
-d 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
-i 以交互模式运行容器,通常与-t同时使用
-t 为容器重新分配一个伪输入终端,通常与-i同时使用,也即启动交互式容器(前台有伪终端,等待交互)
-P 随机端口映射,大写P
-p 指定端口映射,小写p
pl: 启动交互式ubuntu,要退出终端,使用exit
2.列出当前正在运行的容器:
option说明(常用):
-a 列出当前所有正在运行的容器+历史上运行过的
-l 显示最近创建的容器
-n 显示最近n个创建的容器
-q 静默模式,只显示容器编号
3.退出容器
两种退出方式:
exit:run进去容器,exit退出,容器停止
ctrl+p+q:run进去容器,ctrl+p+q退出,容器不停止
4.启动已经停止运行的容器
5.重启容器
6.停止容器
7.强制停止容器
8.删除已经停止运行的容器
9.查看容器日志
10.查看容器内运行的进程
11.查看容器内部细节
12.进入正在运行的容器并以命令行交互
1.
2.
推荐使用docker exec 命令,因为退出容器终端不会导致容器的停止
而使用docker attach会导致容器的停止
13.从容器中拷贝文件到主机上
容器->主机
14.导入和导出容器
1.export导出容器的内容作为一个tar归档文件[对应import命令]
2.import从tar包中的内容创建一个新的文件系统再导入为镜像[对应export命令]
15.为容器重命名
4.1 commit命令
4.2 本地镜像发布到阿里云
阿里云开发者平台
创建仓库镜像:
1.选择控制台,进入容器镜像服务
2.选择个人实例
3.创建命名空间
4.创建镜像仓库
5.进入管理界面获得脚本
4.3 本地镜像发布到私有库
2.运行私有库Registry,相当于本地有个私有Docker hub
-v /zzyyuse/myregistry/:/tmp/registry --privileged=true
-v 表示指定容器卷,左侧/zzyyuse/myregistry/表示宿主机上路径
右侧/tmp/registry表示容器内路径,实现宿主机和容器内部数据的互通
3.案例演示创建一个新镜像,ubuntu安装ifconfig命令
6.修改配置文件使之支持http

讯享网
7.push推送到私服库
8.curl验证私服库上有什么镜像

9.pull到本地并运行
容器卷记得加入 --privileged=true
有点类似redis中的aof和rdb文件
将docker容器内的数据保存进宿主机的磁盘中
运行一个带有容器卷存储功能的容器实例
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
5.1 宿主vs容器之间映射添加容器卷
pl:
查看数据卷是否挂载成功

5.2 读写规则映射添加说明
1.读写(默认):
rw表示容器内和宿主机都可以读写
2.只读:(要使容器内部只能读,不能写)
ro表示容器内只读,宿主机可读可写
5.3 卷的继承和共享
容器1完成和宿主机的映射
容器2继承容器1的卷规则
–volumes-from 父类 ,父类这里为u1(容器1的名称)
6.1 总体步骤
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像
- 停止容器
- 移除容器
6.2 安装mysql
1.拉取镜像文件:
2.启动mysql:
3.重新进入mysql容器:
4.登入mysql:
5.(实际工作中使用)挂容器数据卷,使mysql数据可以持久化
讯享网
进入宿主机:
并将如下内容写入文件
6.3 安装redis
- 拉取镜像文件: 容器卷记得加入
- 在centos宿主机下新建目录/app/redis
- 将一个redis.conf文件模板拷贝进/app/redis目录下
- /app/redis目录下修改redis.conf文件
1.开启redis验证
2.允许redis外地连接:必须注释掉
3.将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败。
另外,一定要用对应版本的conf文件,否则会导致意想不到的结果。 - 运行镜像
- 测试redis-cli连接上来

1.1 新建主服务器容器实例3307
讯享网
1.2 进入 /mydata/mysql-master/conf目录下新建my.cnf
输入内容:
1.3 修改完配置后重启master实例
1.4 进入mysql-master容器
1.5 master容器实例内创建数据同步用户
1.6 新建从服务器容器实例3308
讯享网
1.7 进入/mydata/mysql-slave/conf目录下新建my.cnf
输入内容:
1.8 修改完配置后重启slave实例
1.9 在主数据库中查看主从同步状态

1.10 进入mysql-slave容器
1.11 在从数据库中配置主从复制
参数说明:
master_host:主数据库的IP地址
master_port:主数据库的运行端口
master_user:在主数据库创建的用于同步数据的用户账号
master_password:在主数据库创建的用于同步数据的用户密码
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态获取Position参数
master_connect_retry:连接失败重试的时间间隔,单位为秒
1.12 在从数据库中查看主从同步状态

1.13 在从数据库中开启主从同步
1.14 查看从数据库状态发现已经同步

1.15 主从同步测试
主机添加数据:

从机同步数据:

2.1 1~2亿条数据需要缓存,请问如何设计这个存储案例(本章建议直接看原视频)
分布式存储
哈希取余分区

2亿条数据就是2亿个k,v,单机处理不太行,需要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:hash(key)%N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。
优点:简单,直接有效,只需要预估好数据规划好节点,就能保证一段时间的数据支撑。使用hash算法让固定的一部分请求落在同一台服务器上,这样没台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。
缺点:原来规划好的节点,进行扩容或者容缩就比较麻烦了,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:hash(key)%3会变成hash(key)%?。此时地址经过取余运算的结果将会发生很大变化,根据公式获取的服务器也会变得不可控。
某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。
一致性哈希算法分区
设计目标是为了解决分布式缓存数据变动和映射问题,提出一致性hash解决方案,目的是当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系。
3大步骤:1.算法构建一致性哈希环
2.服务器IP节点映射
3.key落到服务器的落键规则
优点:容错性,扩展性
缺点:一致性哈希算法的倾斜问题
哈希槽分区
1.为什么会出现:一致性哈希算法的数据倾斜问题,哈希槽实质就是一个数组,数组[0,2^14-1]形成hash slot空间。
2.解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。
3.多少个hash槽,一个集群只能有16384个槽(0~16383),这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给那个主节点。集群会记录节点和槽的对应关系。解决了节点和槽关系后,接下来就需要对key求hash值,然后对16384取余,余数是几就落入对应的槽里。slot=CRC16(key)%16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。
2.2 三主三从redis集群扩缩容
1.端口及主从说明(内部分配应该是随机的)

2.redis集群配置
1.关闭防火墙+启动docker服务
2.新建6个docker容器实例
1.
2.
3.
4.
5.
6.
参数说明:
–cluster-enabled 表示是否开启集群
–appendonly 表示是否开启持久化
运行以上命令以后使用docker ps查看一下:

3.进入容器redis-node-1并为6台机器构建集群关系(以一台主机为例)
进入容器:
构建主从关系:
进入docker容器后才能执行以下命令,注意要改成自己的IP地址
–cluster-replicas 1 表示为每个master创建一个slave节点





2.3 主从容错迁移案例
1.数据读写存储
启动6机构成的集群并通过exec进入
对6381新增两个key
连上6381机器
新增key-value

防止路由失效加参数-c并新增两个key
-c 表示以集群环境打开redis

查看集群信息

2.容错切换迁移

1.主机6381和从机切换,先停止主机6381
2.再次查看集群信息
进入2号主机容器
进入redis集群
查看节点信息

3.先还原之前的三主三从
启动已经关闭的redis主机1容器
进入redis集群
查看集群状态(发现原来宕机的redis主机1已经变成了从机)

一般重启原来的主机以后还是要让原来宕机的主机作为主机而不是从机
先启动redis主机1(6381)
再停掉原来的redis从机(6384)
再启动6384
4.查看集群状态

此时发现主机1(6381)再次成为了主机
重启6384

发现6384又变成了从机
总结:主机1宕机,从机4上位成为主机,主机1开机成为了从机,想要使原来的主机1还是主机,4号机继续做从机,需要关闭4号机,再开启4号机。
2.4 主从扩容需求分析
三主三从不够用,需要再添加一主一从。
1.新建6387、6388两个节点,新建后启动,查看是否8节点
2.进入6387容器实例内部
3.将新增的6387节点(空槽号)作为master节点加入原集群
容器内容运行命令:
将新增的6387作为master节点加入集群
redis-cli –cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
6387就是将要作为master新增节点
6381就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

4.检查集群情况

5.重新分派槽号

输入4096(因为槽位从0~16383也就是16384个槽位,除以4得到4096)

ID要填入新加入节点的ID

最后填入all

6.检查集群情况

重新分配后单个节点的槽位号不一定是一整块连续的,可能分为几个区间
7.为主节点6387分配从节点6388
根据自己实际ID和IP及端口号修改即可
8.检查集群情况

可以看到6387对应的从机也添加成功
2.5 主从缩容案例
删除6387主机和6388从机,恢复3主3从。
1.先删除6388从机
redis容器内执行以下命令:
根据自己情况修改即可


2.清出来的槽位重新分配
与扩容时槽位分配类似,但有所不同

查看集群情况

3.再删除6387

4.恢复成3主3从

DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的文本。
DockerFile官网
构建三步骤:
1.编写DockerFile文件
2.docker build命令构建镜像
3.docker run依照镜像运行容器实例
1.DockerFile内容基础知识
1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建一个新的镜像层并对镜像进行提交
2.Docker执行DockerFile的大致流程
1.docker从基础镜像运行一个容器
2.执行一条指令并对容器作出修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的下一条指令直到所有指令都执行完成
3.DockerFile常用保留字指令
1.FROM
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM
2.MAINTAINER
镜像维护者的姓名和邮箱地址
3.RUN
- shell格式:
- exec格式:
RUN是在docker build时运行
4.EXPOSE
当前容器对外暴露出的端口
5.WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
6.USER
指定该镜像以什么样的用户去执行,如果都不指定,默认是root
7.ENV
用来在构建镜像过程中设置环境变量
8.ADD
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
9.COPY
类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>
10.VOLUME
容器数据卷,用于数据保存和持久化工作
11.CMD
- shell格式:
- exec格式:
- 参数列表格式:。在指定了指令后,用CMD指定具体的参数
注意:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
12.ENTRYPOINT
也是用来指定一个容器启动时要运行的命令
类似于CMD指令,但是ENTRYPOINT不会被docker run后面的指令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序
命令格式:
ENTRYPOINT可以和CMD一起用,一般是变参才会使用CMD,这里的CMD等于是在给ENTRYPOINT传参。
当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENYRYPOINT指令,他两个组合会变成<ENTRYPOINT>“<CMD>”
案例如下:假设已通过DockerFile构建了nginx:test镜像:
讯享网
4.自定义镜像mycentosgo1.19
要求:Centos镜像具备vim+ifconfig+go1.19(不想用java,只能用go来代替)
1.新建文件夹myfile
2.编写Dockerfile文件
3.构建
注意,上面TAG后面有个空格,有个点

进入容器并运行相关命令测试,发现已经可用

虚玄镜像:在Dockerfifile中编写
讯享网
查看镜像

查看虚玄镜像

删除虚玄镜像:

5.新建微服务并发布部署到docker容器
2.编写Dockerfile
讯享网
3.构建容器

4.运行容器

5.访问测试
访问成功,获取到结果

network能干吗?
容器间的互联和通信以及端口映射
容器IP变动时候可以通过服务名直接网络通信而不受到影响
1.network是什么?
docker不启动:默认网络情况

docker启动后,网络情况

2.network常用命令
查看docker network命令帮助信息:

查看docker网络:
创建一个网络:
删除一个网络:
查看网络数据源:
3.网络模式
虚拟网桥,默认为该模式 host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等 container 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等
bridge模式:,默认使用docker0
host模式:指定
none模式:指定
container模式:
自定义网络模式:,自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)
4.network底层和容器映射变化
启动两个ubuntu
查看它们的ip


我们发现u1的ip为172.17.0.2,u2的ip为172.17.0.3,如果我们把u2移除
再新建一个容器:
查看u3的ip

发现其ip地址也为172.17.0.3,仿佛和u2冲突,但u2已经被删除,说明docker容器内部的ip是有可能发生改变的
1.compose下载
官网
官网下载
1.对于Ubuntu 和Debian, 运行:
2.对于以RPM为基础的发行版本(如centos), 运行:
讯享网
2.compose核心概念
- 服务(service)一个个应用容器实例,比如订单微服务,mysql容器,nginx容器
- 工程(project)由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义
3.docker-compose使用的三个步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务
- 最后,执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
4.compose常用命令
:查看帮助
:启动所有docker-compose服务
:启动所有docker-compose服务并后台运行
停止并删除容器、网络、卷、镜像
进入容器实例内部
查看当前docker-compose编排过的运行的所有容器
查看当前docker-compose编排过的容器进程
查看容器输出日志
检查配置
检查配置,有问题才有输出
重启服务
启动服务
停止服务
5.compose编排微服务
编写docker-compose.yml文件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/183705.html