Docker 镜像配置,看这一篇足矣 docker设置镜像
wptr33 2024-11-13 15:04 22 浏览
镜像:是一个只读的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)。充分掌握镜像的原理,可以帮助我们在今后的实践中构建出最优的镜像,同时也可以帮助我们更好地理解容器和镜像的关系。
相关推荐
- HIVE 窗口函数详解(hive常用开窗函数)
-
什么是窗口函数窗口函数是SQL中一类特别的函数。和聚合函数相似,窗口函数的输入也是多行记录。不同的是,聚合函数的作用于由GROUPBY子句聚合的组,而窗口函数则作用于一个窗口,这里,窗口...
- SQL高效使用20招:数据分析师必备技巧
-
基础优化技巧善用EXPLAIN分析执行计划EXPLAINSELECT*FROMordersWHEREorder_date>'2024-01-01';...
- 答记者问之 - Redis 的高效架构与应用模式解析
-
问:极客程序员你好,请帮我讲一讲redis答:redis主要涉及以下核心,我来一一揭幕Redis的高效架构与应用模式解析...
- MySQL通过累计求新增(mysql新增表字段语句)
-
前两天的那篇内容《MySQL递归实现单列分列成多行》...
- 一文讲懂SQL窗口函数 大厂必考知识点
-
大家好,我是宁一。今天是我们的第24课:窗口函数。...
- 圣诞快乐:用GaussDB T 绘制一颗圣诞树,兼论高斯数据库语法兼容
-
转眼就是圣诞的节日,祝大家节日快乐。用GaussDBT(也就是GaussDB100)绘制一棵圣诞树,纯国产,更喜庆。话不多说,上图:SQL如下:SELECTCASEWHENENMOTE...
- Minitab:功能强大的质量管理、统计分析及统计图形软件
-
一、Minitab简介Minitab软件是为质量改善、教育和研究应用领域提供统计软件和服务的先导,是全球领先的质量管理和六西格玛实施软件工具及持续质量改进的良好工具软件,她具有强大的功能和简易的可视化...
- 如何熟练使用SQL查询(如何熟练使用sql查询内容)
-
要熟练使用SQL查询(StructuredQueryLanguage),你需要系统地从语法入门,到实战练习,再到性能优化与多表查询的掌握。下面是一条循序渐进、实战驱动的学习路径:第一阶段:S...
- SAP SE38如何在多个系统间同步代码
-
上一篇文章写了如何在多个系统之间同步开发对象:多套SAPERP之间一键同步ABAP开发内容,有兄弟问有没有简单办法同步SE38程序代码的,因为使用请求的方式同步代码有点小题大做了。...
- 技术栈:刷了百道SQL题,还是不会用?你应该这样补短板
-
这是来自用户的提问,也是很多人遇到的困惑:...
- mysql窗口函数为了解决更加复杂的问题
-
为了解决复杂问题的窗口函数我们先讲一下窗口函数是什么窗口和普通的函数作用相同在不同列上进行查询和返回比如我们有如下的表...
- MariaDB开窗函数(开窗函数 mysql)
-
在使用GROUPBY子句时,总是需要将筛选的所有数据进行分组操作,它的分组作用域是整张表。分组以后,为每个组只返回一行。而使用基于窗口的操作,类似于分组,但却可以对这些"组"(即窗口...
- 一篇文章搞定MySQL中的窗口函数(mysql常用的窗口函数)
-
我是孙斌,北理数学系毕业,分享数据分析相关知识,点击右上角“关注”,学习更多数据分析知识。在MySQL中,分组groupby一般和聚合函数连用,如groupby+sum,这样能够得到每个组的总和,...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)