镜像:是一个只读的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:7COPY nginx.repo /etc/yum.repos.d/nginx.repoRUN yum install -y nginxEXPOSE 80ENV HOST=mynginxCMD ["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_imageCOPY test /tmp/testRUN 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)。充分掌握镜像的原理,可以帮助我们在今后的实践中构建出最优的镜像,同时也可以帮助我们更好地理解容器和镜像的关系。

欢迎关注【无量测试之道】公众号,回复【领取资源】,
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

 添加关注,让我们一起共同成长!

Docker 镜像配置相关推荐

  1. docker配置python环境_PyCharm使用Docker镜像搭建Python开发环境

    在我们平时使用PyCharm的过程中,一般都是连接本地的Python环境进行开发,但是如果是离线的环境呢?这样就不好搭建Python开发环境,因为第三方模块的依赖复杂,不好通过离线安装包的方式安装.本 ...

  2. Spring Boot 2.3.0 发布:支持Java14、打包Docker镜像、优雅关机配置...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 冷冷gg 来源 | https://www.oschin ...

  3. react不同环境不同配置angular_DevOps 前端项目(angular、vue、react)打包静态资源生成一份Docker镜像支持部署不同环境...

    1.前言 为了尽可能地轻量化前端镜像(非node承载),将前端编译成静态资源通过nginx承载. 与后端程序不同的是,当使用静态资源方式时页面是直接加载到浏览器进行渲染,无法读取服务端机器中 env ...

  4. Docker镜像仓库Harbor之搭建及配置

    Docker镜像仓库Harbor之搭建及配置 1.Harbor 介绍 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署 ...

  5. Docker镜像加速器配置

    使用Docker拉取镜像时会出现如下错误: 16.04: Pulling from library/ubuntu 22dc81ace0ea: Pulling fs layer 1a8b3c87dba3 ...

  6. 由Docker的MySQL官方镜像配置的容器无法启动问题解决办法(修改配置后无法启动)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 为了方便阅读,我在原文基础上加了一些批注,说明我自己的情况,用红色标示. 这篇文章记录了我在使用 D ...

  7. centos7配置Docker镜像加速器

    创建并编辑文件 [root@localhost ~]# cd /etc/docker/ [root@localhost docker]# [root@localhost docker]# ls key ...

  8. sqlplus 镜像_【Docker】拉取Oracle 11g镜像配置

    以下是基于阿里云服务器Centos 7操作 1.拉取Oracle11g镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_1 ...

  9. docker中linux用户名密码,linuxea:尽可能不在docker镜像中嵌入配置或者密码

    切勿将配置或机密信息嵌入Docker镜像中.相反,在构建Docker镜像时,期望使用业务流程运行时将配置和机密的信息提供给容器,这些包含:Kubernetes Secrets,Docker Secre ...

最新文章

  1. 定义了浮动元素后margin-bottom失效的解决办法
  2. 纠结于ajax开发中 response的contentType 问题
  3. [系统集成] RT(Request Tracker)执行自定义脚本及发送微信、短信的实现方法
  4. php ajax城市联动,php+ajax 城市联动
  5. 微软是如何使用 C# 重写 C# 编译器并将其开源的
  6. 使用MVC连接数据库及MVC应用的一般命名
  7. LabVIEW自带函数实现SQL Server操作(下)
  8. 学会用感情营销是最高的智慧
  9. 删除oracle的注册,oracle数据库账号删除oracle收集系统统计信息
  10. 可展开/折叠的Android TextView:ExpandableTextView
  11. 小程序 Vant Weapp 使用插槽自定义 Cell 的左侧图标
  12. 从零开始做游戏 - 上上下下左右左右BABA
  13. mysql count函数 null_MySql中COUNT(XXX OR NULL)
  14. python求周长_作业-python面向对象编程-计算周长和面积
  15. Jupyter notebook中自定义支持天软TSl语言的魔术命令
  16. 谈一谈Java中的“静态”
  17. 【MVC架构】MVC视图
  18. 【RK356X Android11】开发之4G模块(广和通模块NL668)
  19. Vue.js基础入门到实战视频学习教程
  20. 天大2021年秋学期考试《电工技术实验》离线作业考核试题

热门文章

  1. 网络 || icmp协议 || 三层交换机
  2. CESM(CIME)笔记
  3. STM8开发实例-ADC
  4. 饥荒mod制作初学笔记
  5. 16、【斯纳克图书馆管理系统】列印索书号
  6. 几何简约工作总结汇报PPT模板
  7. 线上插画网络培训班哪个好(推荐+选择技巧)
  8. 常见鸟的种类及特点_常见鸟类 我国鸟类常见种类及分布
  9. RTU和DTU分别是什么?
  10. 计算机显示没有可以的ip地址,我的电脑的IP地址显示不出来怎么办