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

在这里插入图片描述

欢迎来到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.rhkb.cn/news/78230.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

循环结构进阶

二重循环 import java.util.Scanner;public class Demo01 {public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 二重循环 外循环班级 内循环学生for (int i1; i<3; i) { // 外循环班级System.out.println("请输入第" i "…

Leetcode-每日一题【剑指 Offer 17. 打印从1到最大的n位数】

题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。 示例 1&#xff1a; 输…

机器学习、人工智能、深度学习三者的区别

目录 1、三者的关系 2、能做些什么 3、阶段性目标 1、三者的关系 机器学习、人工智能&#xff08;AI&#xff09;和深度学习之间有密切的关系&#xff0c;它们可以被看作是一种从不同层面理解和实现智能的方法。 人工智能&#xff08;AI&#xff09;&#xff1a;人工智能是一…

什么是serialVersionUID?

serialVersionUID是干啥的&#xff1f; Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。 在进行反序列化时&#xff0c;JVM会把传来的字节流中的serialVersionUID与本地相应实体&#xff08;类&#xff09;的serialVersionUID进行比较&#xff0…

结构体和 Json 相互转换(序列化反序列化)

关于 JSON 数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也 易于机器解析和生成。RESTfull Api 接口中返回的数据都是 json 数据。 Json 的基本格式如下&#xff1a; { "a": "Hello", "b": "…

如何申请中国境内提供金融信息服务业务许可

依据《外国机构在中国境内提供金融信息服务管理规定》《外国机构在中国境内提供金融信息服务申请许可说明》等政策&#xff0c;外国机构在中国境内提供金融信息服务业务许可要求如下&#xff1a; 金融信息服务定义 所称的外国机构&#xff0c;是指外国金融信息服务提供者。 …

java环境搭建 Ubuntu Linux

jdk的安装和配置环境变量 使用apt sudo apt install default-jdk若是安装成功了在终端输入java -version来查看是否安装成功 使用官网下载的jdk包 直接在百度上搜索jdk&#xff0c;选择图片这个 网址:jdk下载网址 若是arm就选择带有arm的&#xff0c;反之选择x64的&#…

go逆向符号恢复

前言 之前一直没怎么重视&#xff0c;结果发现每次遇到go的题都是一筹莫展&#xff0c;刷几道题练习一下吧 准备 go语言写的程序一般都被strip去掉符号了&#xff0c;而且ida没有相关的签名文件&#xff0c;没办法完成函数名的识别与字符串的定位&#xff0c;所以第一步通常…

【web逆向】全报文加密及其登录流程的分析案例

aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt 定位加密点 先看加密的请求和响应&#xff1a; 全局搜索加密字段jsondata&#xff0c;这种非特定参数的一般一搜一个准&#xff0c;搜到就是断点。起初下的断点没停住&#xff0c;转而从调用栈单步…

【机器学习1】什么是机器学习机器学习的重要性

什么是机器学习? 简而言之&#xff0c;机器学习就是训练机器去学习。 机器学习作为人工智能(Artificial Intelligence,AI)的一个分支&#xff0c;以其最基本的形式来使用算法通过从数据中获取知识来进行预测。 不同于人类通过分析大量数据手动推导规则和模型&#xff0c;机…

关系型数据库的设计

范式 关系 注意&#xff1a;根据阿里开发规范&#xff0c;不再设置数据库的外键&#xff0c;在应用层保证外键逻辑即可 数据库设计 1:1 1:n 设想学生-班级案例&#xff0c;若在班级中保存所有学生的主键&#xff0c;则表长不好预测&#xff0c;表的数据亢余。 所以是在多的…

【SCSS】网格布局中的动画

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"container">&l…

BigDecimal

文章目录 BigDecimal 的用处BigDecimal 的大小比较BigDecimal 保留几位小数BigDecimal 的使用注意事项总结 BigDecimal 的用处 《阿里巴巴Java开发手册》中提到&#xff1a;浮点数之间的等值判断&#xff0c;基本数据类型不能用来比较&#xff0c;包装数据类型不能用 equals 来…

机器学习04-数据理解之数据可视化-(基于Pima数据集)

什么是数据可视化? 数据可视化是指通过图表、图形、地图等视觉元素将数据呈现出来的过程。它是将抽象的、复杂的数据转化为直观、易于理解的视觉表达的一种方法。数据可视化的目的是帮助人们更好地理解数据&#xff0c;从中发现模式、趋势、关联和异常&#xff0c;从而作出更明…

Jmeter-获取接口响应头(Response headers)信息进行关联

文章目录 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联使用正则表达式提取器将Set-Cookie的值提取出来在其余接口中关联该提取信息运行查看关联是否成功 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联 获取某一…

MATLAB | 如何绘制这样的描边散点图?

part.-1 前前言 最近略忙可能更新的内容会比较简单&#xff0c;见谅哇&#xff0c;今日更新内容&#xff1a; part.0 前言 看到gzhBYtools科研笔记(推荐大家可以去瞅瞅&#xff0c;有很多有意思的图形的R语言复现&#xff01;&#xff01;)做了这样一张图&#xff1a; 感觉很…

【网络基础实战之路】设计网络划分的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

Spring Cloud +UniApp 智慧工地云平台源码,智能监控和AI分析系统,危大工程管理、视频监控管理、项目人员管理、绿色施工管理

一套智慧工地云平台源码&#xff0c;PC管理端APP端平板端可视化数据大屏端源码 智慧工地可视化系统利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术&#xff0c;通过工地中台、三维建模服务、视频AI分析服务等技术支撑&#xff0c;实现智慧工地高精度动态仿…

字节编码学习

字节编码学习 文章目录 字节编码学习01_字节与ASCII码表02_每个国家都有独特的码表03_国际化UTF-804_编码本和解码本不一致&#xff0c;乱码 01_字节与ASCII码表 public class Demo01 {public static void main(String[] args) {// 计算机的底层全部都是字节 ---- ----// 一个…

Python自动化实战之使用Pytest进行API测试详解

概要 每次手动测试API都需要重复输入相同的数据&#xff0c;而且还需要跑多个测试用例&#xff0c;十分繁琐和无聊。那么&#xff0c;有没有一种方法可以让你更高效地测试API呢&#xff1f;Pytest自动化测试&#xff01;今天&#xff0c;小编将向你介绍如何使用Pytest进行API自…