Docker 镜像概念及操作

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker 镜像概念及操作

🟧1. 镜像

🟠1.1 什么是镜像

🎈镜像其实就是一种轻量级的、可以被执行的独立软件包,它包含了运行某个软件所需要的所有内容。通常,我们将应用程序和配置依赖打包形成一个可交付的运行环境(包括代码、运行时所需要的库、环境变量和配置文件等),这个打包好的运行环境就称为镜像 (image) 文件。


🟠1.2 联合文件系统

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


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


🟠1.3 Docker 镜像加载原理

🎈Docker 的镜像由一层层的文件系统组成,这样层级的文件系统叫做 bootfs(boot file system),属于联合文件系统。bootfs 主要包含 bootloader 和 kernel,bootloader 主要用来引导加载 kernel,Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是引导文件系统 bootfs.


🎈bootfs 与典型的 Linux/Unix 系统类似,包含了 bootloader 和 kernel,当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs.


🎈bootfs 的上一层是 rootfs(root file system),包含的是 Linux 系统中的 /dev/, /proc, /bin, /ect 等标准目录和文件。实际上,rootfs 就是各种不同操作系统的发行版,例如 ubuntu,centos 等。

image.png

🖌思考:通常在虚拟机中创建的 CentOS 都有数G以上,为什么在 Docker 中才200M左右?

🎈其实是因为,对于一个精简版的操作系统,rootfs 可以非常小,只需要包含基本的命令、工具和程序库即可,因为底层直接使用宿主机的 kernel,自己只需要提供 rootfs 便可。此外,即使存在不同的 Linux 发行版本,但是 bootfs 基本都是一致的,可以公用 bootfs.

🟠1.4 Docker 镜像为什么要采用分层结构

镜像分层的一个最大优点就是,共享资源,便于复用。

🎈例如,如果多个镜像都是从相同的 base 镜像构建的,那么 docker 主机只需要在磁盘上保存一份 base 镜像,同时在内存中也只要加载一份 base 镜像便可以为所有容器服务,镜像的每一层都可以被共享。

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

🏰 所有对容器的改动,无论添加、删除还是修改文件都只会发生在容器层中

image.png

🟧2. Docker 镜像实例 commit 操作

关于 docker 镜像实例 commit 的命令

docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

下面将演示在 ubuntu 镜像上安装 vim:

首先,下载 ubuntu 镜像

docker pull ubuntu

之后,在本地运行下载的 ubuntu 镜像

docker run -it ubuntu /bin/bash

成功运行之后,进入容器,在容器内执行以下两条命令

apt-get update            //更新包管理工具
apt-get -y install vim    //安装vim

2e718f6de6d94987ae2f2182c528d9c8.png

安装完成之后,退出当前容器,在容器外部 commit 已经安装完vim的镜像,容器ID就是上图中箭头所指,fa2e8f0e41bc

docker commit -m="add vim cmd" -a="hzz" fa2e8f0e41bc hzz/myubuntu:1.1

查看刚刚commit的镜像

docker images

2e718f6de6d94987ae2f2182c528d9c8.png

运行 docker 中新 commit 的容器,容器ID就是上图中箭头所指,a92ac9f96e17

docker run -it a92ac9f96e17

执行 vim 命令

vim a.txt

可以发现,进入到了vim编辑模式,comiit的镜像安装vim成功

🌈 Docker 中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似 Java 继承一个 base 基础类,自己再按需扩展。新的镜像是从 base 镜像一层层叠加生成的,每安装一个软件,就在现有镜像的基础上增加一层。2e718f6de6d94987ae2f2182c528d9c8.png

🟧3. 发布本地镜像

🟠3.1 发布本地镜像到阿里云

🔸3.1.1 在阿里云创建远程仓库

首先,登录阿里云开发者平台,第一次使用可以支付宝账号或者淘宝账号登录注册。

2e718f6de6d94987ae2f2182c528d9c8.png

之后,进入控制台,在“全部产品与服务”搜索框中,输入搜索“容器镜像服务”,进入容器镜像与服务页面2e718f6de6d94987ae2f2182c528d9c8.png

在“实例列表”展示页面,选择新建“个人实例”

2e718f6de6d94987ae2f2182c528d9c8.png

之后,在个人实例页面,选择 “仓库管理->命名空间->创建命名空间”,自定义命名空间名称。

2e718f6de6d94987ae2f2182c528d9c8.png

创建了命名空间之后,便可以开始创建“镜像仓库”,创建步骤如下图所示

2e718f6de6d94987ae2f2182c528d9c8.png

2e718f6de6d94987ae2f2182c528d9c8.png

创建完成之后,便可以在仓库管理->镜像仓库中看到我们创建的镜像仓库,名称为 myubuntu.

2e718f6de6d94987ae2f2182c528d9c8.png

🔸3.1.2 推送镜像上云端

首先,点击 “myubunut”,进入仓库管理界面获取脚本

2e718f6de6d94987ae2f2182c528d9c8.png

图中已经给出了将本地镜像推送到阿里云仓库,只要根据我们的实际情况替换相关参数即可。

docker login --username=****** registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/huazaizai/myubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/huazaizai/myubuntu:[镜像版本号]

2e718f6de6d94987ae2f2182c528d9c8.png

🔸3.1.3 下载云端镜像到本地

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

2e718f6de6d94987ae2f2182c528d9c8.png

🟠3.2 发布本地镜像到私服库

🌈 在公司内部使用内网开发时,由于阿里云这样的公共镜像仓库可能不太方便,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。Docker

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

🔸3.2.1 推送镜像到私服库

首先,下载镜像

docker pull registry

运行私有库 registry,相当于本地有个私有 Docker Hub

//默认情况下,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便与宿主机联调
docker run -d -p 5000:5000 -v /hzz/myregistry/:/temp/registry --privileged=true registry

2e718f6de6d94987ae2f2182c528d9c8.png

安装完成后,在容器内执行以下命令,如果没有提示 command not found,表示安装成功

ifconfig

2e718f6de6d94987ae2f2182c528d9c8.png

之后,再 commit 安装好 ifconfig 的新镜像,commit 命令操作在容器外执行

//docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
docker commit -m="ifconfig cmd add" -a="hzz" 9927dae19b90 hzzubuntu:1.2

2e718f6de6d94987ae2f2182c528d9c8.png

curl 验证私服上存在的镜像, 记得这里要替换成自己的主机的IP地址

curl -XGET http://1.15.236.224:5000/v2/_catalog

2e718f6de6d94987ae2f2182c528d9c8.png

可以看到结果为空,这是因为私服上确实还没推送镜像,因此,出现这样的结果是与实际情况一致的。


之后,将新镜像 hzzubuntu:1.2 修改符合私服规范的 tag

//docker tag 镜像:tag host:port/repository/tag
docker tag hzzubuntu:1.2 1.15.236.224:5000/hzzubuntu:1.2

2e718f6de6d94987ae2f2182c528d9c8.png

由于 docker 默认不支持 http 方式推送镜像,因此需要修改配置文件使得支持 http

vim /etc/docker/daemon.json

添加的内容如下

{
        "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],  // 阿里云提供的镜像加速地址
        "insecure-registries": ["1.15.236.224:5000"]   // 根据自己的主机IP地址添加
}

修改完成之后,如果还不生效,可以考虑重启 docker 服务(非必要不重启

systemctl docker restart

将本地镜像推送到私服库

docker push 1.15.236.224:5000/hzzubuntu:1.2

2e718f6de6d94987ae2f2182c528d9c8.png

验证私服库上是否有镜像

curl -XGET http://1.15.236.224:5000/v2/_catalog

2e718f6de6d94987ae2f2182c528d9c8.png

从上图可以看到,私服库上已经有了刚推送的镜像!


🔸3.2.2 从私服库拉取镜像

首先,为了避免已有的本地镜像对拉取效果的影响,先将已有的 hzzubuntu:1.2 镜像删除掉

docker rmi -f dd26a41647d7  // hzzubuntu:1.2 镜像的ID,根据自己的情况替换

2e718f6de6d94987ae2f2182c528d9c8.png

查看所有镜像,确认已经删除

2e718f6de6d94987ae2f2182c528d9c8.png

拉取私服库上的镜像

docker pull 1.15.236.224:5000/hzzubuntu:1.2

2e718f6de6d94987ae2f2182c528d9c8.png

2e718f6de6d94987ae2f2182c528d9c8.png

拉取成功后,在本地运行镜像

docker run -it dd26a41647d7 /bin/bash
相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6天前
|
应用服务中间件 nginx 开发者
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
最近一段时间 Docker 镜像一直是 Pull 不下来的状态,感觉除了挂🪜,想直连 Docker Hub 是几乎不可能的。更糟糕的是,很多原本可靠的国内镜像站,例如一些大厂和高校运营的,也陆续关停了,这对我们这些个人开发者和中小企业来说是挺难受的。之前,通过这些镜像站,我们可以快速、方便地获取所需的 Docker 镜像,现在这条路也不行了。感觉这次动作不小,以后想直接访问 Docker Hub 是不可能了。所以我们得想办法搭建自己的私有镜像仓库。
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
|
2天前
|
JSON 数据格式 Docker
docker镜像源挂了后操作2024-6
简单操作实现docker镜像依然能顺利拉取。
119 11
|
7天前
|
Java Docker 容器
使用 Spring Boot 构建 Docker 镜像并进行多模式部署
使用 Spring Boot 构建 Docker 镜像并进行多模式部署
27 2
|
9天前
|
数据安全/隐私保护 开发者 Docker
国内docker公开镜像站的关闭!别急,docker_image_pusher 使用Github Action将国外的Docker镜像转存到阿里云私有仓库
通过使用 docker_image_pusher 这样的开源项目,我们能够轻松地解决国内访问 Docker 镜像拉取速度慢及拉去失败的问题,同时保证了镜像的稳定性和安全性。利用 Github Action 的自动化功能,使得这一过程更加简单和高效。
462 2
|
2天前
|
应用服务中间件 Linux nginx
详细解读docker国内镜像源docker镜像大全
详细解读docker国内镜像源docker镜像大全
147 0
|
2天前
|
Docker 容器
Docker镜像、容器操作
Docker镜像、容器操作
18 0
|
6天前
|
存储 数据管理 Linux
Linux - 记录问题:docker 迁移 更改镜像默认位置的注意事项
Linux - 记录问题:docker 迁移 更改镜像默认位置的注意事项
22 0
|
1月前
|
存储 安全 开发者
如何删除 Docker 镜像、容器和卷?
【5月更文挑战第11天】
101 2
如何删除 Docker 镜像、容器和卷?
|
1月前
|
安全 JavaScript Docker
修改docker镜像版本,容器大小缩小10%!
`shigen`,一位专注于Java、Python、Vue和Shell的博主,分享其通过修改Docker镜像版本实现容器瘦身的技巧。将服务从`1.0.0`更新至`1.0.1`,基于Alpine版Docker镜像,容器体积减小至原来的10%。文章展示了问题背景、选择轻量级镜像的原因及步骤,包括Docker镜像版本对比、构建和启动新容器的过程,并证实功能未受影响。`file-server`更新将发布在GitHub上,期待用户试用。一起学习,每天进步!
51 2
修改docker镜像版本,容器大小缩小10%!
|
1月前
|
关系型数据库 MySQL 应用服务中间件
docker镜像、容器数据卷
docker镜像、容器数据卷