玩转Docker(三):构建镜像、使用镜像

【云原生】Docker如何构建镜像 创建镜像有三种方法基于已有镜像创建基于本地模板创建基于Dockerfile创建。 阅读详情

使用现成镜像的好处除了省去自己做镜像的工作量外,更重要的是可以利用前人的经验。特别是使用那些官方镜像,因为Docker的工程师知道如何更好地在容器中运行软件。

当然,某些情况下我们也不得不自己构建镜像,比如:(1)找不到现成的镜像,比如自己开发的应用程序。(2)需要在镜像中加入特定的功能,比如官方镜像几乎都不提供ssh。

Docker提供了两种构建镜像的方法: docker commit命令与Dockerfile构建文件。

一、构建镜像——Docker commit

  • 主要包含以下三个步骤:

● 在base镜像基础上运行容器。
● 修改容器。
● 将容器保存为新的镜像。

  • 实例:在Ubuntu base镜像中安装nginx并保存为新镜像。
# 创建一个名为temp-nginx-container的新容器,并使用Ubuntu基础镜像启动一个交互式的bash会话:
# -it: 分配一个伪终端并保持标准输入打开
sudo docker run -it --name temp-nginx-container ubuntu /bin/bash
# 在新创建的容器中,安装Nginx:
# -y: 这是一个选项,表示在安装过程中自动回答 yes,即在提示时自动选择“是”。
apt update
apt install -y nginx
# 安装完成后,可以退出容器的bash会话,并停止该容器:
exit
sudo docker stop temp-nginx-container
# 使用docker commit命令将修改后的容器保存为新的镜像:
# 创建一个名为my-nginx-image的新镜像,其中包含了你在temp-nginx-container容器中所做的修改
sudo docker commit temp-nginx-container my-nginx-image
# 使用以下命令来查看新创建的镜像:
sudo docker images
  • 并不推荐用这种方式创建镜像:

(1)这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在debian base镜像中也加入vi,还得重复前面的所有步骤。
(2)更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。

但是,即便是用Dockerfile(推荐方法)构建镜像,底层也是docker commit一层一层构建新镜像的。学习docker commit能够帮助我们更加深入地理解构建过程和镜像的分层结构。

二、构建镜像——Dockerfile

Dockerfile是一个文本文件,记录了镜像构建的所有步骤。

1.常用指令

  • FROM
    指定base镜像。
  • MAINTAINER
    设置镜像的作者,可以是任意字符串。
  • COPY
    将文件从build context复制到镜像。
    COPY支持两种形式: COPY src dest与COPY [“src”, “dest”]。
    注意:src只能指定build context中的文件或目录。
  • ADD
    与COPY类似,从build context复制文件到镜像。
    不同的是,如果src是归档文件(tar、zip、tgz、xz等),文件会被自动解压到dest。
  • ENV
    设置环境变量,环境变量可被后面的指令使用。
  • EXPOSE
    指定容器中的进程会监听某个端口,Docker可以将该端口暴露出来。
  • VOLUME
    将文件或目录声明为volume。
  • WORKDIR
    为后面的RUN、CMD、ENTRYPOINT、ADD或COPY指令设置镜像中的当前工作目录。
  • RUN
    在容器中运行指定的命令。
  • CMD
    容器启动时运行指定的命令。
    Dockerfile中可以有多个CMD指令,但只有最后一个生效。CMD可以被docker run之后的参数替换。
  • ENTRYPOINT
    设置容器启动时运行的命令。
    Dockerfile中可以有多个ENTRYPOINT指令,但只有最后一个生效。
    CMD或docker run之后的参数会被当作参数传递给ENTRYPOINT。

2.Shell和Exec格式

当谈到Shell和Exec格式时,通常是指在编写脚本或命令时使用的两种不同的语法格式。这两种格式在编写脚本或命令时有着不同的特点和用途。

  1. Shell格式:

    • Shell格式通常指的是在脚本中使用的命令行语法,这种语法是由Shell解释器(如Bash、Zsh等)直接执行的。
    • 在Shell格式中,可以使用各种Shell的内置命令、控制结构(如if语句、for循环等)以及Shell的特定语法。
    • 例如,在Bash脚本中,你可以使用if语句来进行条件判断,使用for循环来进行迭代操作,以及使用各种Shell内置命令来完成特定的任务。
  2. Exec格式:

    • Exec格式通常指的是在编写可执行程序或在命令行中直接执行的命令时使用的语法格式。
    • 在Exec格式中,命令的参数和选项通常是按照特定的语法规则来组织的,这种语法规则通常由具体的命令或程序所定义。
    • 例如,对于ls命令,你可以使用ls -l来列出详细信息,这里的-l就是ls命令的选项之一,遵循了ls命令的Exec格式。

总的来说,Shell格式主要用于编写Shell脚本,其中包含了Shell解释器的语法和特性,而Exec格式则主要用于编写可执行程序或直接在命令行中执行的命令,其中包含了特定命令或程序的语法和选项。两者在语法和用途上有所不同,但都是在编写和执行命令时常用的格式。

  • 以下是一些使用Shell格式和Exec格式的Dockerfile命令的示例:
# 使用Shell格式的RUN命令,在容器中执行Shell命令
RUN apt update && apt install -y nginx

# 使用Shell格式的CMD命令,在容器启动时执行Shell命令
CMD service nginx start

# 使用Exec格式的ENTRYPOINT命令,指定容器启动时执行的可执行程序
ENTRYPOINT ["nginx", "-g", "daemon off;"]

通常来说,对于需要执行复杂的Shell命令或包含逻辑操作符的命令,可以使用Shell格式的命令;而对于需要指定可执行程序及其参数的情况,可以使用Exec格式的命令。

  • 最佳实践:

(1)使用RUN指令安装应用和软件包,构建镜像。
(2)如果Docker镜像的用途是运行应用程序或服务,比如运行一个MySQL,应该优先使用Exec格式的ENTRYPOINT指令。CMD可为ENTRYPOINT提供额外的默认参数,同时可利用docker run命令行替换默认参数。
(3)如果想为容器设置默认的启动命令,可使用CMD指令。用户可在docker run命令行中替换此默认命令。

3.构建步骤

  • 创建一个新的目录,并在该目录下创建一个名为Dockerfile的文件,用于构建新的Docker镜像。
mkdir nginx-image
cd nginx-image
touch Dockerfile
  • 使用文本编辑器(如nano或vim)打开Dockerfile,并添加以下内容:
# 使用官方的Ubuntu镜像作为基础镜像
FROM ubuntu

# 更新Ubuntu软件包列表并安装Nginx
RUN apt update && apt install -y nginx

# 暴露Nginx的80端口
EXPOSE 80

# 启动Nginx服务
CMD ["nginx", "-g", "daemon off;"]
  • 保存并关闭Dockerfile文件后,构建新的Docker镜像。在nginx-image目录下执行以下命令:

这将使用Dockerfile中的指令构建一个新的Docker镜像,并将其命名为my-nginx-image。

docker build: 使用 Dockerfile 构建一个新的镜像。
-t my-nginx-image: 为构建的镜像指定一个名称为 my-nginx-image。
.: 表示 Docker 在当前目录中查找 Dockerfile 来构建镜像。

sudo docker build -t my-nginx-image .
  • 使用以下命令来查看新创建的镜像:
sudo docker images
  • 可以基于新创建的镜像来运行一个Nginx容器:
sudo docker run -d -p 80:80 my-nginx-image

三、使用构建的镜像

1.使用步骤

  • 如何在多个Docker Host上使用镜像?

(1)用相同的Dockerfile在其他host构建镜像。
(2)将镜像上传到公共Registry(比如Docker Hub), Host直接下载使用。
(3)搭建私有的Registry供本地Host使用。

  • 使用公共Registry:

Docker Hub是Docker公司维护的公共Registry。用户可以将自己的镜像保存到Docker Hub免费的repository中。如果不希望别人访问自己的镜像,也可以购买私有repository。

  • 搭建本地的Registry:

安装Docker Registry

docker run -d -p 5000:5000 --restart=always --name my-registry registry:2

配置Docker客户端: 接下来,你需要配置Docker客户端,以便它能够与本地的Registry进行交互。你可以通过编辑Docker配置文件(通常是/etc/docker/daemon.json)来添加Registry的地址,将your-registry-domain替换为你的Registry所在的域名或IP地址。

   {
     "insecure-registries" : ["your-registry-domain:5000"]
   }

使用docker push命令将本地构建的镜像推送到你的Registry中,也可以使用docker pull命令从Registry中拉取镜像。

   docker tag my-image your-registry-domain:5000/my-image:v1.0
   docker push your-registry-domain:5000/my-image:v1.0
   docker pull your-registry-domain:5000/my-image:v1.0

docker tag: 这是用于给 Docker 镜像打标签的命令。
my-image: 这是要被标记的现有镜像的名称或 ID。
your-registry-domain:5000/my-image:v1.0.: 这是新的名称,指定了镜像的目标位置、名称、版本。

注意:镜像一定要按照规范(host:port/镜像名)命名,否则push会被拒绝。

2.镜像常用命令

当使用Docker时,有一些常用的镜像命令可以帮助你管理和操作Docker镜像。以下是一些常用的Docker镜像命令及其功能:

  1. docker images:

    • 这个命令用于列出本地系统上的所有Docker镜像。
    • 示例:docker images
  2. docker pull:

    • 从远程仓库拉取Docker镜像到本地系统。
    • 示例:docker pull ubuntu:latest
  3. docker build:

    • 使用Dockerfile构建Docker镜像。
    • 示例:docker build -t my-image .
  4. docker tag:

    • 为镜像添加一个标签。
    • 示例:docker tag my-image my-registry-domain:5000/my-image:v1.0
  5. docker push:

    • 将本地的镜像推送到远程仓库。
    • 示例:docker push my-registry-domain:5000/my-image:v1.0
  6. docker rmi:

    • 删除本地的一个或多个镜像。
    • 示例:docker rmi my-image
  7. docker inspect:

    • 显示关于镜像的详细信息,包括镜像的元数据和配置。
    • 示例:docker inspect my-image
  8. docker history:

    • 显示镜像的历史记录,包括每一层的创建者和命令。
    • 示例:docker history my-image
  9. docker save 和 docker load:

    • docker save用于将一个或多个镜像保存为tar归档文件。
    • docker load用于从tar归档文件中加载镜像。
    • 示例:docker save -o my-images.tar my-image 和 docker load -i my-images.tar

这些命令可以帮助你管理Docker镜像,包括拉取、构建、推送、删除、查看详细信息等操作。通过熟练掌握这些命令,你可以更好地管理和使用Docker镜像。

Docker(二)镜像详解、镜像构建、镜像优化 共享宿主机的kernelbase镜像提供的是最小的Linux发行版同一docker主机支持运行多种Linux发行版采用分层结构的最大好处是:共享资源镜像通过分层,如果本地已经有了,不管这一层属于哪个镜像,因为每一层都有独立的标识(都是唯一的),只要docker判断有这一层,那它就不会进行重复的拉取。包括在上传仓库的时候也是一样的,仓库内存储时也是按照层来存储的,如果远程仓库有这一层了,就不需要重复上传了,节省了带宽。 阅读详情

相关推荐

Docker系列教程04-Docker构建镜像的三种方式_docker 中构建镜像有几种方式 分别说明下

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

566

Docker 镜像的构建

Dockerfile 参数详解

qq_46457076的博客 2879

使用Maven构建项目Docker镜像

前言 在前面我们介绍了 Docker是什么?有什么优点?应用场景?_黄嚯嚯-优快云博客 Linux安装Docker步骤_黄嚯嚯-优快云博客 Docker配置使用阿里云加速镜像_黄嚯嚯-优快云博客 准备工作 创建一个基础项目工程 开始之前我们先准备一个Springboot的项目工程 , 就很普通就好 , 确保项目整正常启动即可! 配置 本次构建所使用到的插件是docker-maven-plugin , 该插件提供了两种不同的构建方式 , 两种方式外观差别体现在po...

黄嚯嚯 5558

Docker-玩转 Docker 镜像:从拉取、构建到发布

本文系统介绍了Docker镜像的核心概念与操作流程。首先解析了镜像的分层文件系统本质及其只读特性,并与容器进行了对比。随后详细演示了从Docker Hub拉取镜像、管理本地镜像的基本操作,重点介绍了通过docker commit命令快速构建自定义镜像的方法及其局限性。最后讲解了镜像标签管理和推送到私有仓库的流程,并总结常见误区与最佳实践,强调镜像最小化、版本明确化和定期清理的重要性。通过本文,读者将掌握Docker镜像从获取到发布的完整生命周期管理技能。

DreamLife&Yaothos 2887

使用构建缓存优化 Docker 镜像构建

假设一个简单的程序的 如下: 当你运行 命令来创建新镜像时, 会按指定顺序执行 中的每条指令,为每个命令创建一个层。对于每条指令, 会检查是否可以重用之前构建中的指令。如果发现之前已经执行过类似的指令, 就不需要重新执行,而是使用缓存的结果。这样,你的构建过程会变得更快、更高效,节省宝贵的时间和资源。有效使用构建缓存可以通过重用之前构建的结果并跳过不必要的工作来实现更快的构建。为了最大化缓存的使用并避免资源密集型和耗时的重建,理解缓存失效的工作原理非常重要。以下是一些可能导致缓存失效的情况:在编写或编辑

美味小鱼的杂货铺 2180

Docker--构建镜像

其是由一系列指令和参数构成的脚本,每一条指令构建一层,因此每一条指令的内容就是描述该层应当如何构建,一个Dockerfile包含了构建镜像的完整指令。Docker 通过读取一系列Dockerfile指令自动构建镜像。镜像的定制实际上就是定制每一层所添加的配置文件。将每一层修改、安装、构建、操作的命令都写入一个Dockerfile脚本,使用该脚本构建、定制镜像,可以解决基于容器生成镜像无法重复、构建缺乏透明性和体积偏大的问题。

恐龙让Lee的博客 8618

Docker构建镜像方法

通过本教程,你学会了如何通过Dockerfile构建自己的 Docker 镜像,并且学会了如何运行和管理容器。Docker 的强大之处在于它能够将环境和应用程序封装在一个镜像中,实现高度可移植性。

专注于Python编程技术的分享与交流,致力于帮助开发者提升编程技能,解决实际问题,探索Python的无限可能。 2857

自动驾驶车辆纵向控制实战:基于CARLA与ROS2的PID算法实现

本文详细介绍了基于CARLA与ROS2的自动驾驶车辆纵向控制实战,重点讲解了PID算法的实现与应用。通过搭建仿真环境、实现定速巡航和自适应巡航功能,帮助开发者掌握自动驾驶核心技术。文章还分享了系统集成、仿真验证及常见问题的调试技巧,为自动驾驶开发提供实用指导。

weixin_33728708的博客 354

六使用Maven插件构建Docker镜像

我们知道,Maven是一个强大的项目管理与构建工具。如果可以使用Maven构建Docker镜像,那么我们的工作就能得到进一步的简化。经过调研,以下几款Maven的Docker插件进入笔者视野,如表13-1所示。表13-1 Maven的Docker插件列表笔者从各项目的功能性、文档易用性、更新频率、社区活跃度、Stars等几个纬度考虑,选用了第一款。这是一款由Spotify公司开发的Maven插件。下面我们来详细探讨如何使用Maven插件构建Docker镜像。

itScholar001的博客 1993

别再为环保数采仪通讯发愁!手把手教你用MCGS触摸屏+4G模块发送HJ212报文

本文详细介绍了如何使用MCGS触摸屏配合4G模块高效发送HJ212标准报文,解决工业环保监测中的数据采集与传输难题。从硬件连接到软件配置,再到报文组装与发送策略,提供全流程实用指南,特别针对4G网络环境下的特殊设置给出优化建议,帮助工程师提升数据传输稳定性与效率。

weixin_30847865的博客 388

Spring AI提示词模板应用

本文介绍了使用SpringAI提示词模板的配置方法,主要步骤包括:1)在JDK17和SpringBoot3.4.4环境下引入spring-ai-alibaba1.0.0.2依赖;2)配置application.yml文件;3)创建测试控制器类处理提示词模板(.st文件);4)通过模板变量动态生成AI回复内容。演示了如何通过@RequestParam设置默认参数,实现无需前端传参即可测试AI回复功能,最终完成了一个SpringAI提示词模板的应用Demo。

wjianwei666的专栏 197

Docker 使用 三 :镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

qq_28120987的博客 2048

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

ChenJin_2的博客 274

Docker(三):Docker 镜像使用

Docker Image Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker 镜像看成只读模板,通过它可以创建 Docker 容器。 镜像有多种生成方法: 从无到有开始创建镜像 下载并使用别人创建好的现成的镜像 在现有镜像上创建新的镜像 我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 D

LoveSummer 9470

QT-Creator安装教程(windows)

本文介绍了Qt的下载安装步骤:1)通过镜像源下载安装包;2)运行exe文件时使用命令行参数指定镜像地址;3)在安装过程中选择路径和自定义安装组件,包含QT5和QT6版本的详细安装说明;4)安装后可继续添加扩展包或卸载组件。重点提示了QT6必须勾选的关键组件,并提供了组件管理的操作方法。

qq_53545309的博客 3103

12、有杆泵抽油系统:原理、性能与选择

本文全面介绍了有杆泵抽油系统的原理、性能分析和设备选择方法。有杆泵抽油系统广泛应用于石油开采领域,通过地面抽油装置与井下柱塞泵的配合,实现高效、稳定的原油提升。文章详细解析了系统的工作原理、组成结构、光杆运动特性、载荷计算、泵输送能力及功率需求,并提供了抽油装置的选择流程和实际案例分析。此外,还探讨了泵的容积效率影响因素、示功图的作用及系统优化运行的建议,为石油开采工程提供了理论支持和实践指导。

gan8painter的博客 433

Docker构建Java镜像及使用

最近在项目中使用到了一些docker技术,因为没有专业的运维人员,所以在部署版本应用的时候,都是自己在进行打包部署。经过一段时间的操作和使用,在这里和大家分享一下自己的心得,也算是做一下总结吧。

Layne的博客 3121

【100%通过率】华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】

2023华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 587

windows 使用docker构建镜像

1. 使用Dockerfile 1. 下载docker desktop 下载docker for windows,这里有个小坑,需要确定是否打开了虚拟化。如果没有,必须重启在BIOS界面打开虚拟化,重启之后就可以启动docker for windows了。 2. 更改工作目录 一定要注意:先改下docker desktop的setting。不然生成镜像直接爆炸,全都放到C盘。 3. 使用Dockerfile 构建镜像 打开cmd,到Dockerfile的路径(请把dockerfile单独放到一个目录)。

THE XING 1万+

[毕设项目-大模型微调]现代文翻译文言文【基于LLaMA3.1-8B微调】

教你基于LLaMA3.1-8B微调如何做到现代文翻译文言文

逐梦苍穹的博客 2296

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【云原生】Docker 实践(三):使用 Dockerfile 文件构建镜像

Dockerfile 文件可以使用 docker build 命令进行编译。在编译过程中,每一条指令的内容描述了该层应如何进行构建。当我们需要指定自己额外的需求时,只需在 Dockerfile 文件的基础上添加或者修改指令,重新生成新的镜像即可。

Data · Model · Agent · Repeat 2413

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Docker镜像构建之使用Dockerfile进行镜像构建及实例

1.镜像的构建方法。 在构建容器化应用时,相当重要的步骤莫过于镜像制作,本文将介绍镜像制作方法以及镜像制作的建议。通常镜像的制作有两种方式: 使用现有的容器使用docker commit生成镜像 你需要先启动一个容器,然后基于该容器创建一个新的镜像,此时,容器内的物理数据都会被保存下来,存至新的镜像中,即使容器不使用任何 volume时,容器的数据仅被保存在容器之内,它只在容器的生命周期内存在,会随着容器的删除而被删除,通过docker commit也会保存下来。 使用Dockerf.

xiegongmiao的博客 3579

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Docker基础】全面解析 Docker 镜像:构建、使用与管理

Docker 镜像通常与容器、Dockerfile、Docker Hub、Docker Compose、网络、卷、CI/CD 工具和容器编排工具(如 Kubernetes 或 Docker Swarm)一同使用。它们共同构成了容器化应用的基础设施,帮助开发、测试、部署和管理容器化应用。

卜及中的博客 2099

docker分层及镜像构建(三)

一、docker镜像分层 1、docker三要素 镜像:容器的一种静态模板(一组资源的集合,分层的方式一层层累加,组成了完整的镜像 容器:是一种应用/环境的运行时状态/运行时环境 仓库:存放镜像 2、创建容器的几种方式 ①基于已有的模板文件进行创建 ②基于已有的镜像进行创建 ③基于dockerfile创建 3、镜像所包含的部分 ①基础镜像——操作系统centos 7等 ②应用服务软件包——nginx等服务 ③依赖环境——gcc gcc-C++ make jdk jre gd 等 ④

qq_59562051的博客 3747

【docker系列】mvn使用docker build构建镜像

大家好,我是walker 一个从文科自学转行的程序员~ 爱好编程,偶尔写写编程文章和生活 欢迎关注公众号【I am Walker】,可以获取相关的学习资料哦 我的gitee:https://gitee.com/shen-chuhao/walker.git 里面很多技术案例! 参考: 使用Maven构建Docker镜像 前提条件 1、确保创建一个springboot项目,一个简单项目即可 2、该操作是在linux上运行的,所以要确保linux有安装 maven:用来编译镜像 docker:用来构建镜像.

Think_and_work的博客 6339

docker镜像构建

docker镜像构建的方式说明:docker commit和docker build

wenxiaoba的博客 2531
上一篇: 玩转Docker(二):centos7安装Docker、核心知识概述
下一篇: 玩转Docker(四):容器指令、生命周期、资源限制、容器化支持、常用命令
TracyCoder123
博客等级 码龄8年 1万+粉丝 226原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracyCoder123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值