Docker
1.Docker为什么出现
一款产品从开发到上线,一般都会有开发环境,测试环境,运行环境。
如果有一个环境中某个软件或者依赖版本不同了,可能产品就会出现一些错误,甚至无法运行。比如开发人员在windows系统,但是最终要把项目部署到linux。如果存在不支持跨平台的软件,那项目肯定也无法部署成功。
这就产生了开发和运维人员之间的矛盾。开发人员在开发环境将代码跑通,但是到了上线的时候就崩了。还要重新检查操作系统,软件,依赖等版本,这大大降低了效率。造成了搭环境一两天,部署项目两分钟的事件。
docker的出现就能解决以上问题:
开发人员把环境配置好,将需要运行的程序包运行成功,然后把程序包和环境一起打包给运维人员,让运维人员部署就可以了。这大大提高了项目上线的效率。
2.Docker简介
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机器上就可以一键部署好,大大简化了操作。
3.传统虚拟机和容器的对比
3.1虚拟机
虚拟机是可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:
- 启动慢
- 资源占用多
- 冗余步骤多
3.2容器虚拟化技术
Docker容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
3.3两者对比
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
4.docker的作用
一:更快速的应用交付和部署
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
二:更便捷的升级和扩缩容
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
三:更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
四:更高效的计算资源利用
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
5.Docker三要素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0irjeBY-1676271191688)(D:\typora\java路线学习\Redis\图片\image-20230210152403182.png)]
一:镜像(Image)
Docker 镜像(Image)就是一个只读的模板==(类与对象中的类)==。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
二:容器(Container)
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例==(对象实例)==。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
三:仓库(Repository)
仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等
6.Docker命令
永远的HelloWorld docker run hello-world
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
列出本地主机上的镜像 docker images (-a :列出本地所有的镜像(含历史映像层) -q :只显示镜像ID。)
下载镜像 docker pull 镜像名字[:TAG](没有TAG就是最新版)
查看镜像/容器/数据卷所占的空间 docker system df
删除镜像 docker rmi -f 镜像ID
删除多个镜像 docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部镜像 docker rmi -f $(docker images -qa)
启动已停止运行的容器 docker start
重启容器 docker restart
容器ID或者容器名停止容器 docker stop
容器ID或者容器名强制停止容器 docker kill 容器ID或容器名
删除已停止的容器 docker rm 容器ID
一次性删除多个容器实例 docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
新建+启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
前台交互式启动 docker run -it redis:6.0.8
后台守护式启动 docker run -d redis:6.0.8
docker run -it -p 8080:8080 tomcat
-p 小写,主机端口:docker容器端口 -P 大写,随机分配端口 i:交互 t:终端 d:后台
安装redis:
docker run -p 6379:6379 --name myredis -v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf
-d redis redis-server /etc/redis/redis.conf
:
前面是指linux主机,后面是redis容器,--name myredis
是给容器取名字,最后一行的redis
是指镜像名,redis-server启动Redis
进入正在运行的容器并以命令行交互 docker exec -it 容器ID bashShell
重新进入 docker attach 容器ID
上述两个区别attach 直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器的停止。exec 是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
从容器内拷贝文件到主机上 docker cp 容器ID:容器内路径 目的主机路径
提交容器副本使之成为一个新的镜像 docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
运行一个带有容器卷存储功能的容器实例 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名(将docker容器内的数据保存进宿主机的磁盘中) –privileged=true (使用该参数,container内的root拥有真正的root权限) -v (容器卷映射)
容器2继承容器1的卷规则 docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
连接redis集群: docker exec -it [redis容器名称] redis-cli -h [ip地址] -p [端口号] -c
添加redis主节点: docker run -it --rm redis redis-cli --cluster add-node [被添加的节点ip:端口] [添加目标节点ip:端口]
添加redis从节点: docker run -it --rm redis --cluster add-node --cluster-slave --cluster-master-id [主节点id] [被添加的节点ip:端口]
分配槽点: docker run -it --rm redis redis-cli --cluster reshard [需要分配的ip:端口]
平衡槽点: docker run -it --rm redis redis-cli --cluster rebalance --cluster-use-empty-masters [ip:端口]
7.构建redis集群
7.1新建6个docker容器redis实例
#节点-1
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
#节点-2
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
#节点-3
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
#节点-4
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
#节点-5
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
#节点-6
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 run:创建并运行docker容器实例
–name redis-node-6:容器名字
–net host:使用宿主机的IP和端口,默认
–privileged=true:获取宿主机root用户权限
-v /data/redis/share/redis-node-6:/data:容器卷,宿主机地址:docker内部地址
redis:6.0.8:redis镜像和版本号
–cluster-enabled yes:开启redis集群
–appendonly yes:开启aof持久化
–port 6386:redis端口号
7.2、构建集群关系
- 进入容器—这里以node1为例
docker exec -it redis-node-1 /bin/bash
-
构建关系
-
注意,进入docker容器后才能执行一下命令,且注意自己的真实IP地址,这里是ip为:192.168.88.128
redis-cli --cluster create 192.168.88.128:6381 192.168.88.128:6382 192.168.88.128:6383 192.168.88.128:6384 192.168.88.128:6385 192.168.88.128:6386 --cluster-replicas 1 #--cluster-replicas 1 表示为每个master创建一个slave节点
7.3、查看集群状态
- 查看集群状态—这里以node-1,6381作为切入点
redis-cli -p 6381 cluster info