【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代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
26天前
|
机器人 网络安全 数据安全/隐私保护
autMan奥特曼机器人-对接Docker版本NTQQ详细教程
本文介绍了如何在服务器上搭建NTQQ机器人,通过官方NTQQ对接各框架,实现QQ登录的稳定运行。文章提到了需要准备一台服务器和相应的软件,并详细描述了通过SSH链接服务器、创建文件夹和配置文件、编辑配置文件地址端口、运行容器等步骤。同时,文章还介绍了VNC连接的使用和配置,以及使用watchtower进行NTQQ的更新。文章总结起来就是在服务器上搭建NTQQ机器人,实现QQ登录的稳定性和自动登录功能,同时提供了更新和维护的方法。
63 3
autMan奥特曼机器人-对接Docker版本NTQQ详细教程
|
13天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
399 28
|
26天前
|
缓存 监控 持续交付
|
9天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
15天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
85 2
|
16天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
29 1
|
17天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
22天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
36 1
|
25天前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
204 3
|
29天前
|
Docker 容器
docker:记录如何在x86架构上构造和使用arm架构的镜像
为了实现国产化适配,需将原x86平台上的Docker镜像转换为适用于ARM平台的镜像。本文介绍了如何配置Docker buildx环境,包括检查Docker版本、安装buildx插件、启用实验性功能及构建多平台镜像的具体步骤。通过这些操作,可以在x86平台上成功构建并运行ARM64镜像,实现跨平台的应用部署。
564 2