【云原生|Docker系列第3篇】Docker镜像的入门实践

news2025/6/9 19:26:26

在这里插入图片描述

欢迎来到Docker入门系列的第三篇博客!在前两篇博客中,我们已经了解了什么是Docker以及如何安装和配置它。本篇博客将重点介绍Docker镜像的概念,以及它们之间的关系。我们还将学习如何拉取、创建、管理和分享Docker镜像,这是使用Docker的重要步骤之一。

Docker镜像是Docker的核心概念之一,它提供了一个可执行的软件包,其中包含了运行应用程序所需的一切:代码、运行时环境、系统工具、库以及依赖项等。

通过学习Docker镜像的概念,您将能够更好地理解Docker的工作原理,并利用Docker提供的强大功能来开发、测试和部署应用程序。接下来,让我们深入探索Docker镜像的世界吧!

目录

  • 1. Docker镜像
    • 1.1 Docker镜像的特点
    • 1.2 Docker镜像的获取
      • 1.2.1 拉取镜像
      • 1.2.2 使用Dockerfile构建镜像
    • 1.3 Docker镜像的管理
      • 1.3.1 查看镜像列表
      • 1.3.2 删除镜像
      • 1.3.3 导出和导入镜像
  • 2. 使用Dockerfile定制镜像
    • 2.1 Dockerfile定制镜像
    • 2.2 Dockerfile指令
      • 2.2.1 COPY 复制文件
      • 2.2.2 FROM 指定基础镜像
      • 2.2.3 RUN 执行命令
      • 2.2.4 ADD 更高级的复制文件
      • 2.2.5 CMD 容器启动命令
      • 2.2.6 WORKDIR 设置工作目录
      • 2.2.7 EXPOSE 暴露端口
      • 2.2.8 ENV 设置环境变量。
  • 3. Docker镜像的分享和推送
    • 3.1 分享Docker镜像
    • 3.2 推送Docker镜像
  • 总结

1. Docker镜像

Docker镜像是Docker的核心构建块,它是一个轻量级、可执行的软件包,用于构建和运行容器化应用程序。一个Docker镜像包含了运行应用程序所需的一切,包括应用程序的代码、运行时环境、系统工具、库以及依赖项等。

1.1 Docker镜像的特点

  • 轻量级:Docker镜像采用了分层存储的机制,不同层之间可以共享相同的文件,从而减少了存储空间的占用。
  • 可移植性:Docker镜像具有良好的可移植性,可以在不同的主机和环境中运行,无需关注底层操作系统的差异。
  • 版本控制:每个Docker镜像都有唯一的标识符,称为镜像ID,可以用于对镜像进行版本控制和管理。
  • 可复用性:可以通过基于已有的Docker镜像构建新的镜像,从而实现镜像的复用和扩展。

1.2 Docker镜像的获取

获取Docker镜像通常有两种方式:拉取公共镜像仓库中的镜像,或者通过构建自定义镜像来创建。

1.2.1 拉取镜像

Docker镜像可以从公共的镜像仓库中拉取,最著名的镜像仓库就是Docker Hub。您可以在Docker Hub上找到数以万计的官方和社区维护的Docker镜像。使用docker pull命令可以拉取镜像,命令格式如下:

docker pull <镜像名称>:<标签>

例如,要拉取官方的Ubuntu镜像:

docker pull ubuntu:latest

在这里插入图片描述

1.2.2 使用Dockerfile构建镜像

1.3 Docker镜像的管理

在使用Docker时,我们可能需要对镜像进行管理,包括查看镜像列表、删除镜像、导出和导入镜像等操作。

1.3.1 查看镜像列表

要查看本地主机上已有的镜像列表,可以使用docker images命令。该命令将显示镜像的仓库名称、标签、镜像ID、创建时间和大小等信息。

docker images ls

在这里插入图片描述

1.3.2 删除镜像

要删除本地主机上的一个或多个镜像,可以使用docker rmi命令。需要指定要删除的镜像的镜像ID或者仓库名称和标签。

docker rmi <镜像ID或名称>:<标签>

1.3.3 导出和导入镜像

有时候,我们可能需要将一个镜像导出到一个文件中,或者从一个文件中导入一个镜像。可以使用docker save命令将镜像导出到一个tar文件中,然后使用docker load命令从tar文件中导入镜像。

导出镜像:

docker save -o <导出文件名.tar> <镜像名称>:<标签>

导入镜像:

docker load -i <导入文件名.tar>

2. 使用Dockerfile定制镜像

2.1 Dockerfile定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
以我们刚刚定制nginx镜像为例子,我们在一个空白目录中,建立一个文本文件,并命名为Dockerfile:

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

在这里插入图片描述
其内容为:

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

其中命令我们后面再详细讲述,我们使用它构建镜像,dockerfile构建镜像命令格式如下:

docker build -t <镜像名称>:<标签> <Dockerfile路径>

接下来您可以使用以下命令构建镜像:

docker build -t myimage:latest .

在这里插入图片描述
然后我们再运行这个镜像,你可以选择直接命令行运行,也可以直接在docker客户端运行,这里为了方便理解,我用docker客户端运行这个镜像:
在这里插入图片描述
随便填个端口:
在这里插入图片描述

打开网页访问这个端口:
在这里插入图片描述

2.2 Dockerfile指令

2.2.1 COPY 复制文件

格式如下:

COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:

COPY package.json /usr/src/app/

<源路径> 可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则,如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

2.2.2 FROM 指定基础镜像

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
在 Docker Hub 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 node、openjdk、python、ruby、golang 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。

格式如下:

FROM <镜像名字>

如:

FROM nginx

2.2.3 RUN 执行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

  • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
  • exec 格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式。

2.2.4 ADD 更高级的复制文件

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
比如 <源路径> 可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层 RUN 指令进行解压缩。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下载,处理权限、解压缩、然后清理无用文件更合理。因此,这个功能其实并不实用,而且不推荐使用。
例如:

FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

2.2.5 CMD 容器启动命令

指定容器启动时要执行的命令,可以有多个 CMD,但只有最后一个生效。

CMD ["python", "app.py"]

2.2.6 WORKDIR 设置工作目录

设置工作目录,后续的指令将在该目录下执行。

WORKDIR /app

2.2.7 EXPOSE 暴露端口

声明容器运行时需要监听的端口。

EXPOSE 80

2.2.8 ENV 设置环境变量。

ENV APP_VERSION=1.0

3. Docker镜像的分享和推送

Docker镜像的分享和推送是与团队合作和社区共享的重要环节。您可以将自己创建的镜像分享给其他开发者,也可以将镜像推送到公共的或私有的镜像仓库中。

3.1 分享Docker镜像

要分享一个Docker镜像,可以通过导出和导入的方式进行。首先,使用docker save命令将镜像导出到一个tar文件中,然后通过邮件、文件共享等方式与其他人共享该文件。

docker save -o <导出文件名.tar> <镜像名称>:<标签>

接收方可以使用docker load命令从tar文件中导入镜像。

docker load -i <导入文件名.tar>

3.2 推送Docker镜像

如果您希望将镜像推送到Docker Hub或其他镜像仓库中,可以使用docker push命令。推送镜像之前,您需要先登录到镜像仓库。

docker login

然后,使用docker push命令将镜像推送到仓库。

docker push <镜像名称>:<标签>

总结

在本篇博客中,我们深入探讨了Docker镜像的概念。我们学习了如何获取和管理Docker镜像,包括拉取镜像、构建自定义镜像以及导出和导入镜像。我们还介绍了如何通过Dockerfile制作镜像以及Dockerfile的指令。最后,我们了解了如何分享和推送Docker镜像,以便与他人共享和合作。

通过学习和掌握Docker镜像的基本概念,您将能够更好地利用Docker来开发、测试和部署应用程序。容器化技术的出现使得应用程序的开发和部署更加灵活、高效,并带来了诸多优势。在接下来的博客中,我们将继续探索Docker的更多功能和应用场景,下一篇文章我们会进入Docker容器的入门实践。

希望本篇博客对您理解Docker镜像起到了很好的指导作用。继续探索Docker的世界,您将发现更多令人兴奋的功能和应用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链表OJ(LeetCode)

文章目录 1.移除链表元素2.反转链表3.链表的中间结点4.倒数第k个结点5.合并两个有序链表6.链表分割7.链表的回文结构8.相交链表9.环形链表10.环形链表Ⅱ1.常规思路2.新型思路【无码】 1.移除链表元素 法一&#xff1a;遍历删除 struct ListNode {int val;struct ListNode* nex…

采集极验4滑块验证码图片数据

在网络安全领域&#xff0c;验证码是一种常见的用于验证用户身份或防止恶意机器人攻击的技术。而极验4滑块验证码作为一种广泛应用的验证码形式&#xff0c;其具有较高的安全性和防御能力。本文将以获取极验4滑块验证码图片数据为主题&#xff0c;介绍相关技术和方法。 一、极…

【Jenkins入门到实战】忽如一夜春风来,千树万树梨花开

自动化运维之Jenkins 前提条件&#xff1a;安装好jdk &#xff08;版本要求11-17&#xff09;并配置好环境变量 一、Jenkins 1、Jenkins是什么 Jenkins是一个开源的持续集成服务&#xff0c;用于实施软件开发和发布流程。它帮助软件开发和运维团队在构建、测试和部署软件上实…

cesium的使用

cesium的使用 cesium的使用创建一个vue项目 vuevitecesium参数的使用常用点位标记删除动态渲染路线借助truf.js的算法进行渲染地块的实现topojson cesium的使用 1.下载或者安装cesium的插件 官方文档 下载下来后创建文件夹整个包引入 2.生成token 新的包应该有默认token如果没…

前端学习记录~2023.7.10~CSS杂记 Day5

前言一、样式化表格1、一个典型的 HTML 表格2、进行样式化&#xff08;1&#xff09;间距和布局&#xff08;2&#xff09;简单地排版&#xff08;3&#xff09;图形和颜色&#xff08;4&#xff09;图案&#xff08;5&#xff09;样式化标题 最终效果如下 ![在这里插入图片描述…

【Spring Cloud Alibaba】Nacos的服务注册和发现(discovery)的使用

【Spring Cloud Alibaba】系列文章 标题链接【Spring Cloud Alibaba】Nacos的安装与介绍以及Nacos集群的安装https://masiyi.blog.csdn.net/article/details/129530053【Spring Cloud Alibaba】Nacos config的使用和高阶用法https://masiyi.blog.csdn.net/article/details/129…

LabVIEW通过嘴唇图像识别为残疾人士开发文本输入系统

LabVIEW通过嘴唇图像识别为残疾人士开发文本输入系统 近年来&#xff0c;计算机已经成为现代人日常生活中的一种信息器具。人们可以使用计算机来处理复杂的文件&#xff0c;获取新信息并在线购物等。但是&#xff0c;上面讲的使用电脑的所有好处对普通人来说都很方便&#xff…

React05-样式隔离

一、样式隔离方案 css 的样式是全局样式&#xff0c;在书写react组件时&#xff0c;如果写了相同的样式类名&#xff0c;很容易造成样式污染。 在 vue 中&#xff0c;vue 官方提供了样式隔离方法&#xff0c;在组件代码中的 style 标签中加入 scoped&#xff0c;可以让这部分…

Python案例分析|使用Python图像处理库Pillow处理图像文件

本案例通过使用Python图像处理库Pillow&#xff0c;帮助大家进一步了解Python的基本概念&#xff1a;模块、对象、方法和函数的使用 使用Python语言解决实际问题时&#xff0c;往往需要使用由第三方开发的开源Python软件库。 本案例使用图像处理库Pillow中的模块、对象来处理…

Java中的JDBC编程(数据库系列6)

目录 前言&#xff1a; 1.什么是Java的JDBC编程 2.JDBC的数据库驱动包的导入过程 3.JDBC代码的编写 3.1创建并初始化一个数据源 3.2和数据库服务器建立连接 3.3构造SQL语句 3.4执行SQL语句 3.5释放必要的资源 3.6整体代码的展示及演示 3.7代码的优化 3.8 查询操作的…

「深度学习之优化算法」(十四)麻雀搜索算法

1. 麻雀搜索算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   麻雀搜索算法(sparrow search algorithm)是根据麻雀觅食并逃避捕食者的行为而提出的群智能优化算法。提出时间是2020年,相关的论文和研究还比较少,有可能还有一些正在发表中,受疫情影响需要论…

关于学习过程中的小点

nfev : 函数求值次数njev : Jacobian 评估的数量nit :算法的迭代次数 permute(dims)#维度转换 torch.split #[按块大小拆分张量] Pytorch.view Pytorch中使用view()函数对张量进行重构维度&#xff0c;类似于resize()、reshape()。用法如下&#xff1a;view(参数a,参数b,...)&a…

Nacos1.4.2单机与集群的安装部署

CentOS 部署Nacos1.4.2 下载 nacos 下载链接&#xff1a;https://github.com/alibaba/nacos/tags 如何选择我们下载的 nocas 版本&#xff1f; 查看 Spring Cloud Alibaba 与 nacos 版本对应关系&#xff1a;SpringCloudAlibaba 组件对应关系说明 本项目使用 nacos 1.4.2 …

Python(十七)数据类型转换——str()函数和int()函数

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

2023年上半年:C#、Python和一些实用语言

文章目录 C#Pythonerlang和exilirfortranR语言 最近半年的开发任务主要集中在C#和Python上&#xff0c;所以博客内容也几乎围绕这两个部分&#xff0c;偶尔会穿插一些其他语言。下面就对2023年上半年的博客做一个总结。 C# 主要用C#写了一个文本阅读器&#xff0c;提供生成目…

学C的第二十八天【字符串函数和内存函数的介绍(一)】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第二十七天【指针的进阶&#xff08;三&#xff09;】_高高的胖子的博客-CSDN博客 前言&#xff1a; &#xff08;1&#xff09;. C语言中对于字符和字符串的处理很是频繁&…

linux驱动开发:驱动开发框架,linux内核字符设备驱动开发过程

一、驱动框架 1.Linux内核模块和字符驱动的关系 模块是Linux进行组建管理的一种方式, 结构体:对设备的管理内核需要抽象出来一个结构体来描述设备所有的共性信息写驱动需要申请一个结构体并赋值(初始化),然后注册给内核让内核统一管理 驱动:由内核统一管理,所以驱动…

NUXT3学习笔记2

1、配置Ant design Vue (两个安装方式随便选一种&#xff0c;yarn会安装的更快) npm i ant-design-vue --save yarn add ant-design-vue 2、使⽤的 Vite&#xff0c;你可以使⽤ unplugin-vue-components 来进⾏按需加载。 yarn add unplugin-vue-components --save 在nuxt.…

设计模式——享元模式

享元模式 定义 享元模式&#xff08;Flyweight Pattern&#xff09;是池技术的重要实现方式。 使用共享对象可以有效地支持大量的细粒度对象。 优缺点、应用场景 优点 可以大大减少应用程序创建对象的数量&#xff0c;降低程序内存占用。 缺点 提高了系统的复杂度&…

5分钟上手IP代理服务

一 IP代理服务 在网上找了一个性价比高的IP代理服务&#xff0c;一个IP地址1分钱。 二 API协议 调用方式为http协议&#xff0c;响应数据格式支持JSON和txt&#xff0c;都是比较常用的方式。 三 源码范例 包括一些主流的编程语言&#xff0c;一分钟上手。 我用的python比较…