这是无量测试之道的第171篇原创

镜像:是一个只读的Docker 容器模板,包含启动容器所需要的所有文件系统结构和内容。

简单来讲,镜像是一个特殊的文件系统,它提供了与容器运行时所需的程序,软件库、资源、配置等静态数据,镜像不包含任何动态数据,镜像内容在构建后不会被改变。

常用的镜像操作如图所示:

拉取镜像

命令格式:docker pull [Registry]/[Repository]/[Image]:[Tag]

Registry:注册服务器,Docker 默认会从 docker.io 拉取镜像,如果你有自己的镜像仓库,可以把 Registry 替换为自己的注册服务器。

Repository:镜像仓库,通常把一组相关联的镜像归为一个镜像仓库,library为 Docker 默认的镜像仓库。

Image:镜像名称

Tag:镜像标签,如果你不指定拉取镜像的标签,默认为latest。

例如:获取一个名称为busybox的镜像

命令:docker pull busybox

该命令会先从本地进行搜索,如果本地搜索不到busybox镜像,则会从docker hup网站下载镜像。

查看镜像

docker images

该命令可以列出本地所有镜像

使用ls查看指定镜像:docker image ls test_image

使用grep查看指定镜像:docker images |grep test_image

重命名镜像

命令格式:docker tag[SOURCE_IMAGE][:TAG][TARGET_IMAGE][:TAG]

该条命令含义是将镜像名称为:test_image且tag为:latest重命名为:

镜像名称为:test_image_copy且tag为:latest的一个新镜像,相当于复制,而不是直接将原镜像干掉。

使用docker images命令查看刚才重命名为:test_image_copy的镜像

可以看到镜像名称为:test_image与test_image_copy的两个镜像,IMAGE ID和SIZE是一模一样的。是因为它们指向的是同一个镜像文件,只是别名不同。

这也证实了前面所说的docker tag有类似于复制的功能。

删除镜像

docker rmi或者docker image rm命令

使用命令:docker rmi test_image_copy删除镜像名称为:test_image_copy后,再使用docker images查看所有本地镜像,发现test_image_copy镜像不在列表,说明删除成功

构建镜像

(1)、使用docker commit 命令从运行中的容器提交为镜像

例如:从运行中的容器提交为镜像

创建一个名为test_image的容器并进入test_image容器

命令:docker run --rm --name=test_image -it test_image sh

在test_image容器中创建一个文件并写入内容

命令:touch hello_world.txt&&echo "I like the world of docker.">hello_world.txt

此时在容器的根目录下已经创建了一个名为hello_world.txt的文件并写入了:I like the world of docker的内容。

新打开一个命令行窗口,运行以下命令提交镜像

命令:docker commit test_image test_image:hello_world

该命令返回的内容为容器ID

使用docker image ls 命令查看镜像

可以看到本地镜像列表新增一个名称为:test_image,TAG为:hello_world的镜像,且IMAGE ID与同名镜像的IMAGE ID不一样。

(2)、使用docker build 命令从Dockerfile 构建镜像【最重要、最常用的构建镜像的方式】

使用Dockerfile构建镜像具有以下特性:

1)、Dockerfile 的每一行命令都会生成一个独立的镜像层,并且拥有唯一的ID

2)、Dockerfile 的命令是完全透明的,通过查看Dockerfile 的内容,可以知道镜像是如何一步步构建的。

3)、Dockerfile 是纯文本的,方便跟随代码一起存放在代码仓库并做版本管理。

以下是Dockerfile 常用操作指令

下面通过一个实例来熟悉以上这些指令,以下代码片段是一个Dockerfile:

FROM centos:7

COPY nginx.repo /etc/yum.repos.d/nginx.repo

RUN yum install -y nginx

EXPOSE 80

ENV HOST=mynginx

CMD ["nginx","-g","daemon off;"]

Dockerfile 指令详细分析:

[1]、第一行:FROM centos:7

表示:是基于 centos:7 这个镜像来构建自定义镜像。这里需要注意,每个 Dockerfile 的第一行除了注释都必须以 FROM 开头。

[2]、第二行:COPY nginx.repo /etc/yum.repos.d/nginx.repo

表示:拷贝本地文件 nginx.repo 文件到容器内的 /etc/yum.repos.d 目录下。这里拷贝 nginx.repo 文件是为了添加 nginx 的安装源。

[3]、第三行:RUN yum install -y nginx

表示:在容器内运行yum install -y nginx命令,安装 nginx 服务到容器内,执行完第三行命令,容器内的 nginx 已经安装完成。

[4]、第四行:EXPOSE 80

表示:声明容器内业务(nginx)使用 80 端口对外提供服务。

[5]、第五行:ENV HOST=mynginx

表示:定义容器启动时的环境变量 HOST=mynginx,容器启动后可以获取到环境变量 HOST 的值为 mynginx。

[6]、第六行:CMD ["nginx","-g","daemon off;"]

表示:定义容器的启动命令,命令格式为json 数组。这里设置了容器的启动命令为 nginx ,并且添加了 nginx 的启动参数 -g 'daemon off;' ,使得 nginx 以前台的方式启动。

镜像的实现原理

其实 Docker 镜像是由一系列镜像层(layer)组成的,每一层代表了镜像构建过程中的一次提交。下面以一个镜像构建的 Dockerfile 来说明镜像是如何分层的。

FROM test_image

COPY test /tmp/test

RUN mkdir /tmp/testdir

上面的 Dockerfile 由三步组成:

第一行:基于test_image 创建一个镜像层;

第二行:拷贝本机test 文件到镜像内;

第三行:在/tmp 文件夹下创建一个目录testdir。

为了验证镜像的存储结构,我们使用docker build命令在上面 Dockerfile 所在目录构建一个镜像:

$ docker build -t test_image .

这里Docker 使用的是 overlay2 文件驱动,进入到/var/lib/docker/overlay2目录下使用tree .命令查看产生的镜像文件:

$ tree .

# 以下为 tree . 命令输出内容

|-- 3e89b959f921227acab94f5ab4524252ae0a829ff8a3687178e3aca56d605679

| |-- diff # 这一层为基础层,对应上述 Dockerfile 第一行,包含 busybox 镜像所有文件内容,例如 /etc,/bin,/var 等目录

... 此次省略部分原始镜像文件内容

| `-- link

|-- 6591d4e47eb2488e6297a0a07a2439f550cdb22845b6d2ddb1be2466ae7a9391

| |-- diff # 这一层对应上述 Dockerfile 第二行,拷贝 test 文件到 /tmp 文件夹下,因此 diff 文件夹下有了 /tmp/test 文件

| | `-- tmp

| | `-- test

| |-- link

| |-- lower

| `-- work

|-- backingFsBlockDev

|-- bec6a018080f7b808565728dee8447b9e86b3093b16ad5e6a1ac3976528a8bb1

| |-- diff  # 这一层对应上述 Dockerfile 第三行,在 /tmp 文件夹下创建 testdir 文件夹,因此 diff 文件夹下有了 /tmp/testdir 文件夹

| | `-- tmp

| | `-- testdir

| |-- link

| |-- lower

| `-- work

...

通过上面的目录结构可以看到,Dockerfile 的每一行命令,都生成了一个镜像层,每一层的 diff 夹下只存放了增量数据,如下图所示。

分层的结构使得 Docker 镜像非常轻量,每一层根据镜像的内容都有一个唯一的 ID 值,当不同的镜像之间有相同的镜像层时,便可以实现不同的镜像之间共享镜像层的效果。

总结:

Docker 镜像是静态的分层管理的文件组合,镜像底层的实现依赖于联合文件系统(UnionFS)。

充分掌握镜像的原理,可以帮助我们在今后的实践中构建出最优的镜像,同时也可以帮助我们更好地理解容器和镜像的关系。

end

如果今天的分享对你有帮助的话,请毫不犹豫:关注、分享、点赞、在看、收藏呀~

你的鼓励将会是我创作的最大动力。

点个赞,点个在看再走啦~~~

docker运行yyets_Docker 镜像配置,看这一篇足矣。相关推荐

  1. docker运行centos镜像发布python项目

    前情提要:centos镜像容器已经按上一篇安装好了Python3环境:docker运行centos镜像 安装python3.9环境_苍穹之跃的博客-CSDN博客指定安装的文件夹为: /home/pyt ...

  2. linux vim 终端 行首 行尾_不会vi/vim,看这一篇足矣

    今日分享:Don't allow your rituals to become ruts. -- Todd Henry ❞ vi/vim 的重要性不言而喻,比如登录服务器操作.那么如何掌握呢?看这一篇 ...

  3. Docker安装及镜像配置(常用命令介绍)

    一.安装Docker 官网 https://docs.docker.com/engine/install/centos/ # 1.卸载旧的版本 yum remove docker \docker-cl ...

  4. docker运行yyets_docker实战

    Docker 安装 MySQL MySQL 是世界上最受欢迎的开源数据库.凭借其可靠性.易用性和性能,MySQL 已成为 Web 应用程序的数据库优先选择. 1.查看可用的 MySQL 版本 2.拉取 ...

  5. docker运行yyets_docker 安装 运行 卸载

    一.卸载docker 安装时使用什么工具安装的docker就用什么工具卸载docker: 1.yum卸载docker 查看已安装的docker yum list installed | grep do ...

  6. docker运行yyets_docker常规操作——启动、停止、重启容器实例

    一.启动一个已经停止的容器实例 docker start 容器ID或容器名,建议使用容器ID,容器ID支持模糊查询而容器名称不支持 1. 先查看已经暂停的容器实例信息 2. 通过docker star ...

  7. 使用docker运行redis镜像,端口无法映射

    问题描述 运行redis镜像报端口映射错误,出现报错: docker: Error response from daemon: driver failed programming external c ...

  8. docker运行yyets_docker常用命令

    镜像导出 docker save -o web.tar web 镜像导入 docker load -i web.tar 查看所有镜像 docker images 删除镜像 docker image r ...

  9. docker运行yyets_docker: 存放各种docker image构建脚本或者快速启动的docker-compose文件。一处构建,处处可用,方便健忘人士和减轻国内开发人员的负担。...

    说明 存放各种docker image构建脚本或者快速启动的docker-compose文件. 实现:一处构建,处处可用,方便健忘人士和减轻国内开发人员的负担. 最后,我会在有空的时候尽量完善各个镜像 ...

最新文章

  1. 最常见的 35 个 Python 面试题及答案
  2. Windows XP自带的定时关机功能以及我的基于此的小程序
  3. 【QGIS入门实战精品教程】3.3:QGIS如何打开ArcGIS创建的文件数据库(GDB)?
  4. dagger2 注入_使用Dagger 2在GWT中进行依赖注入
  5. vc++6.0 模拟鼠标点击代码 木马程序的编写 VC 模拟键盘输入
  6. django自动转化前端模板中static的css,js引用
  7. xpwifi热点设置android,WinXP笔记本设置WiFi热点的方法
  8. 【航线运输驾驶员理论考试】飞行原理
  9. matlab无法打开wps的xls文件,WPS无法打开XLS文件怎么办 XLS文件出现异常无法打开怎么处理...
  10. 网络安全设备常见弱口令
  11. MySQL中IN对NULL的处理
  12. IDL数据类型之数组
  13. 15天深度复习JavaWeb的详细笔记(四)——HTML、CSS
  14. 基于GAN的图像配准汇总
  15. mac m1无法读取移动硬盘
  16. 华为手机助手安卓版_渲美手机恢复助手安卓版安卓版下载-渲美手机恢复助手安卓版app下载...
  17. Centos执行shell命令返回127错误
  18. 数字电路31(已知状态图设计同步时序电路)
  19. c语言六度空间问题及答案大全,C 六度空间理论的实现
  20. Cocos2d-x学习笔记(十二)3D特效

热门文章

  1. 蓝光视频转换工具AnyMP4 Blu-ray Ripper Mac
  2. 2 ubuntu18.04安装mcl_3dl
  3. 杨彦兵博士|相机光通信简介
  4. 技术干货 | 详谈AI芯片分类和关键技术
  5. 小贴士丨夏季空调使用小窍门,省电又舒适
  6. 92. 反转链表 II(翻转部分链表)
  7. Java split函数
  8. android日期和时间,Android获取手机日期和时间
  9. Hadoop完全分布式搭建过程、maven和eclipse配置hadoop开发环境、配置Map/Reduce Locations、简单wordcount测试!
  10. 【区块链108将】万链资本郝泽萱:我们要做区块链领域的红杉和高盛