百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Docker 镜像配置,看这一篇足矣 docker设置镜像

wptr33 2024-11-13 15:04 16 浏览

镜像:是一个只读的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)。充分掌握镜像的原理,可以帮助我们在今后的实践中构建出最优的镜像,同时也可以帮助我们更好地理解容器和镜像的关系。

相关推荐

C++企业级开发规范指南(c++开发gui)

打造高质量、可维护的C++代码标准一、前言C++作为一门功能强大的系统级编程语言,被广泛应用于操作系统、游戏引擎、高性能服务器、数据库系统等领域。知名互联网公司(如Google、Microsoft、腾...

C++|整型的最值、上溢、下溢、截断、类型提升和转换

整数在计算机内以有限字长表示,当超出最值(有限字长)时,需要截断(溢出,求模)操作。不同字长的整型具有不同的值域,混合运算时,需要类型提升和转换。1整形最值在<limit.h>中有整型的...

C++|漫谈STL细节及内部原理(c++ std stl)

1988年,AlexanderStepanov开始进入惠普的PaloAlto实验室工作,在随后的4年中,他从事的是有关磁盘驱动器方面的工作。直到1992年,由于参加并主持了实验室主任BillWo...

C++11新特性总结 (二)(c++11新特性 pdf)

1.范围for语句C++11引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素vector<int>vec={1,2,3,4,5,6};f...

C++ STL 漫谈(c++中的stl到底指的什么)

标准模板库(StandardTemplateLibrary,STL)是惠普实验室开发的一个函数库和类库。它是由AlexanderStepanov、MengLee和DavidRMusser在...

C++学习教程_C++语言随到随学_不耽误上班_0基础

C++学习教程0基础学C++也可以,空闲时间学习,不耽误上班.2019年C语言新课程已经上线,随到随学,互动性强,效果好!带你征服C++语言,让所有学过和没有学过C++语言的人,或是正准备学习C++语...

C++遍历vector元素的四种方式(c++ 遍历vector)

vector是相同类型对象的集合,集合中的每个对象有个对应的索引。vector常被称为容器(container)。C++中遍历vector的所有元素是相当常用的操作,这里介绍四种方式。1、通过下标访问...

一起学习c++11——c++11中的新增的容器

c++11新增的容器1:array当时的初衷是希望提供一个在栈上分配的,定长数组,而且可以使用stl中的模板算法。array的用法如下:#include<string>#includ...

C++编程实战基础篇:一维数组应用之投票统计

题目描述班上有N个同学,有五位候选人“A,B,C,D,E”,请所有的同学投票并选举出班长,现在请你编写程序来他们计算候选人的得票总数,每位同学投票将以数字的形式投票“12345”分别代表五位候选人,...

C++20 新特性(6):new表达式也支持数组大小推导

new表达式也支持数组大小推导在C++17标准中,在定义并初始化静态数组时,是可以忽略数组大小,然后通过初始化数据来推导数组的大小。但使用new来定义并初始化动态数组时,并不支持这种自动推导数组大...

C++ 结构体(struct)最全详解(c++结构体用法)

一、定义与声明1.先定义结构体类型再单独进行变量定义structStudent{intCode;charName[20];charSex;intA...

自学 C++ 第 6 课 二维数组找最值

键盘输入一个m×n的二维数组,通过C++编程找出元素中的最大值,并输出其所在的位置坐标。例如,输入一个4×5的二维数组,数组元素分别为{{556623749},{578964563},...

从缺陷中学习C/C++:聊聊 C++ 中常见的内存问题

在写C/C++程序时,一提到内存,大多数人会想到内存泄露。内存泄露是一个令人头疼的问题,尤其在开发大的软件系统时。一个经典的现象是,系统运行了10天、1个月都好好的,忽然有一天宕机了:OOM(Out...

C++开发者都应该使用的十个C++11特性(上)

在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛。不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备。你也许看到过许多类似介绍各种C++11特性的文章。下...

深度解读C/C++指针与数组(c++指针和数组的区别)

指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。今天我们就来聊一聊数组和指针千丝万缕的关系;一维数组与...