【Docker 基础教程】侃侃而谈Docker镜像

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【Docker 基础教程】侃侃而谈Docker镜像

💓前言


前面一篇文章说到了一些Docker的基本操作指令(启动终止服务,检测状态,拉取镜像,导入导出容器),今天将会介绍到Docker镜像的一些基本原理,更新镜像,向阿里云发布镜像,创建私有库。


💓一、Docker镜像的必知必会


🍇什么是镜像?


是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。


🥭分层的镜像


以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

3d33da2ea4fb45bf8d71c276c810e96e.png


🍇联合文件系统简介


UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录


🥭Docker镜像加载原理


docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。


5bf4dc36fe614e41b5e6aeaadbad06be.png


平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??


14f0089609a74ddf9f8a124a1465423e.png


对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。


🍇镜像为什么分层?


镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;

同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。


🥭镜像层与容器层


当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。


31c8bd85e4fe4aff9f6d075115028cdd.png


💓二、更新Docker镜像


主要讲述在Centos8内核之上安装vim碰到的问题,以及对应的解决方法。

更新镜像的意思就是启动一个容器之后,对容器实例进行功能上的修改或者添加,将其更新为一个新的功能更加强大的镜像。使用到的命令如下:

docker commit 提交容器副本使之成为一个新的镜像

docker commit -m ="提交描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]


💓三、提交镜像到阿里云

8d8d9c3a9f8a4efb93761359fcd1f453.png


生成更加强大的镜像

使用docker commit [options] 容器ID [repository[:tag]]


🍇创建阿里云账户


1a6e45a861c242fa92c09b7ed8d26fb8.png


🥭找到容器镜像服务启动个人实例

770e6d32302b4b4394eb447774e9ecd1.png


🍇创建命名空间


1cc50b25a80b4c95bec8d5bf33c98fd1.png


🥭创建镜像仓库

1b0261d016b241f89e3473962c3e2dd4.png


🍇成功获取到脚本

640ab93542ce445d9470839e7bcd1a58.png


🥭将镜像推送到阿里云


b9501644143244eca451cdb8b71b26f2.png


🍇推送与拉取(操作系统中需要用到的命令)


登录阿里云:


docker login --username=aliyun6913902006 registry.cn-hangzhou.aliyuncs.com


拉取镜像:


docker pull registry.cn-hangzhou.aliyuncs.com/zsc888/centosimages:[镜像版本号]


推送镜像:


docker login --username=aliyun6913902006 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zsc888/centosimages:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/zsc888/centosimages:[镜像版本号]


💓四、本地镜像发布到私有库


私有库与推送到阿里云工作原理一样,只不过一些地方涉及到公司隐私安全问题,不适合将镜像发布到云端。
这时候我们可以使用私有库,将镜像仓库创建到本地,即高效又私密。


🍇什么是私有库?


1 官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。

2 Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。


Docker Registry是官方提供的工具,可以用于构建私有镜像仓库


🥭Docker Registry


docker pull registry


拉取镜像


docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调


58015a04a9d245909d62d08ddd534c4d.png


🍇查看私有库包含的镜像


curl -XGET http://主机ip:5000/v2/_catalog


未上传的时候啥也没有

0e3ea369324841289f93a4001ad7927f.png


🥭给镜像文件打标签(修改格式)


按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag

自己host主机IP地址,填写同学你们自己的,不要粘贴错误,O(∩_∩)O

使用命令 docker tag 将zzyyubuntu:1.2 这个镜像修改为192.168.111.162:5000/zzyyubuntu:1.2

docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2

1c2cafd581aa4f5b8500b190b6d0f967.png


🍇修改配置


别无脑照着复制,registry-mirrors 配置的是国内阿里提供的镜像加速地址,不用加速的话访问官网的会很慢。2个配置中间有个逗号 ','别漏了,这个配置是json格式的。2个配置中间有个逗号 ','别漏了,这个配置是json格式的。2个配置中间有个逗号 ','别漏了,这个配置是json格式的。

vim命令新增如下红色内容:


vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"], "insecure-registries": ["主机ip:5000"]}

7ca8deffa7804832b584f903c56dcc84.png


上述理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker


🥭推送到私有库


docker push 镜像名

daf51610b4e6464995672d54173a53de.png

推送前

41121c5a312e49ec9f23357060215ab1.png


推送后,再次查看

71668e9d7c714131a6cacd73e58212ff.png


🍇思考


将本地镜像推进库的时候,如果镜像没有固定的格式,会将镜像向docker.io进行推送。

如果镜像文件进行固定格式修改,并且将格式内的ip地址加入到了docker 内部的/etc/docker/daemon.json文件

则会自动匹配,向指定位置进行推送。


f4c2177b24c44f9c8a317896c5ede643.png



相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
17天前
|
应用服务中间件 Linux nginx
Docker镜像-手动制作yum版nginx镜像
这篇文章介绍了如何手动制作一个基于CentOS 7.6的Docker镜像,其中包括下载指定版本的CentOS镜像,创建容器,配置阿里云软件源,安装并配置nginx,自定义nginx日志格式和web页面,最后提交镜像并基于该镜像启动新容器的详细步骤。
77 21
Docker镜像-手动制作yum版nginx镜像
|
17天前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
93 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
17天前
|
应用服务中间件 Linux nginx
Docker镜像管理篇
关于Docker镜像管理的教程,涵盖了Docker镜像的基本概念、管理命令以及如何制作Docker镜像等内容。
77 7
Docker镜像管理篇
|
17天前
|
应用服务中间件 Linux nginx
Docker镜像-基于DockerFile制作yum版nginx镜像
本文介绍了如何使用Dockerfile制作一个基于CentOS 7.6.1810的yum版nginx镜像,并提供了详细的步骤和命令。
58 20
|
16天前
|
Docker 容器
Docker Hub镜像公共仓库使用
这篇文章介绍了如何使用Docker Hub公共仓库进行镜像的创建、上传、下载和管理。
276 8
|
14天前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
23天前
|
存储 安全 Ubuntu
Docker 镜像与 Docker 容器的区别
【8月更文挑战第27天】
62 5
|
23天前
|
运维 Ubuntu Shell
掌握Docker容器的创建:从镜像到实例
【8月更文挑战第27天】
88 4
|
21天前
|
物联网 Serverless API
函数计算产品使用问题之怎么部署Docker镜像进行lora训练
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
24天前
|
存储 Docker 容器
阿里云私有docker仓库构建海外镜像
【8月更文挑战第25天】
105 3