为什么会出现Docker
任何事物的出现都是由需求直接或间接驱动的
需求是什么
虚拟化的巨大损耗
什么是虚拟化
为了方便管理、贴合日益增多的软件开发场景的基础设施需求,
我们使用虚拟化将原本需要每次初始化服务端软件运行环境进行制作标本,
每次通过加载标本加快软件部署,
通过软件模拟硬件环境, 统一适配了多环境多语言多版本以及敏捷开发的部署需求
为什么虚拟化
软件开发需要高频尝试,
不同版本的软件安装会冲突,
卸载 既浪费时间又无法保证达到效果,
修改配置文件浪费时间以及容易出错
某些软件必然会冲突
不熟悉的软件有冲突的不确定性
纯硬件过于复杂
需要隔离 性能(CPU/Memory/网络/磁盘)/环境/场景
Docker之前虚拟化技术的缺陷型
也叫做重型虚拟化(典型代表: OpenStack)
文件系统浪费
系统启动慢以及有系统使用的多余步骤
裸机性能损耗高
…
Docker怎么做到的
如何解决文件系统浪费和系统启动慢和系统使用的多余步骤
1、裁剪传统系统, 包括了功能的删减和适配
2、基于AUFS(AnotherUnionFS) (联合文件系统)基础镜像层只读和运行容器层可写 实现共用
3、通过共用多个镜像的Dockerfile中相同的部分 实现共用
这样的好处就是:
当一个机器上的Docker虚拟化容器非常多时,
1、不同种类型的镜像会通过Dockerfile共用镜像层, 判断依据为: 镜像仓库的UUID
2、同种类型的镜像会直接基于已有的镜像层进行修改上层修改
不仅仅如此:
以简洁的方式简化了文件系统的使用
如何解决裸机性能损耗度高和系统启动慢
传统虚拟化需要通过软件模拟硬件, 每次加载的过程很长,
Docker通过共享OS(Linux), 实现进程级的使用, 基于cgroup和namespace实现隔离
性能损耗度为百分之几
每次创建Docker容器仅仅是启动一个进程
Docker还做到哪些
Docker镜像
构建镜像
精简需求:
单顺序、无分支判断、无计算、简洁
仅仅通过一个Dockerfile文件以及 docker build -t Dockerfile 即可高效构建到本地docker镜像仓库
案例为:
FROM 基础镜像
ADD 本地目录 镜像中的目录
RUN 基础镜像中的指令
ENTRYPOINT ["启动指令"]
注意: 每个运行的docker容器需要一个常驻前台的进程运行, 否则会导致自动关闭
推送镜像
修改本地镜像名称
推送镜像之前需要对镜像进行设置及镜像仓库地址以及名称
语法为: docker tag 本地镜像ID 远程镜像仓库/镜像名称:版本
注意:
该版本默认为latest
可以曲线救事, 例如: tag本地镜像为难以拉取的远程仓库的镜像
通过docker login 以及docker push 本地镜像ID即可
注意: 在写CI的过程中建议使用如下写法
cat dockerregistry-auth | docker login ${DOCKER_REGISTRY_URL} --username ${DOCKER_REGISTRY_USERNAME} --password-stdin
删除本地镜像
在CI流程中, 通常是构建完成了即推送到docker远程镜像仓库中, 而本地镜像即可删除
语法为: docker rmi 镜像ID
拉取镜像
docker pull 远程镜像仓库地址/镜像名称:版本
注意:
私有镜像仓库需要登录时登录即可
来源:CSDN
作者:Tristan.L
链接:https://blog.csdn.net/qq_35559756/article/details/103642329