Docker使用注意事项

docker import 和 docker load 有什么区别?

想要了解 docker loaddocker import 命令的区别,还必须知道 docker savedocker export

  • docker save:将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录,比 docker export 命令导出的文件大。
  • docker export:将一个容器导出为文件,再使用 docker import 命令将容器导入成为一个新的镜像,但是相比 docker save 命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

因此,既可以使用 docker load 命令来导入镜像库存储文件到本地镜像库,也可以使用docker import 命令来导入一个容器快照到本地镜像库。
两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。

bind mount和volume模式创建存储卷

  1. bind mount模式下,如果容器本身目录有文件,容器该目录本身存在的文件将会消失不见, 这是 bind mount 模式和 volume 模式最大的不同点
  2. bind mount模式下,使用–mount方式创建卷,如果宿主机目录不存在,会报错。而使用-v模式则不会

临时卷 tmpfs

  1. 临时卷数据位于内存中,在容器和宿主机之外。
  2. 不同于卷和绑定挂载,不能在容器之间共享 tmpfs 挂载。
  3. 这个功能只有在 Linux 上运行 Docker 时才可用。
  4. tmpfs 也会覆盖容器里面的文件

什么时候用 Volume ,什么时候用 bind 、tmpfstmpfs?

volume:volume 是 docker 的宿主机文件系统一部分,用于不需要规划具体目录的场景
bind:bind mount 完全是依赖于主机的目录结构和操作系统,用于目录需要提前规划,比如 mysql 的目录需要个空间大的,其他服务有不占用的时候,用 volume 就不太合适了
tmpfs:用于敏感文件存储,文件不想存储的宿主机和容器的可写层之中

镜像制作dockfile

如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是Dockerfile。

1. ADD 与 COPY 的区别

ADD:不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程 URL所对应的文件或目录,作为资源复制到镜像文件系统。所以,可以认为 ADD 是增强版的 COPY,支持将远程 URL 的资源加入到镜像的文件系统。
COPY:COPY 指令能够将构建命令所在的主机本地的文件或目录,复制到镜像文件系统。

2. CMD 与 EntryPoint 的区别

ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序一样,与 CMD 的 区 别 是 不 可 以 被 docker run 覆 盖 , 会 把 docker run 后 面 的 参 数 当 作 传 递 给 ENTRYPOINT 指令的参数。
Dockerfile 中只能指定一个 ENTRYPOINT,如果指定了很多,只 有 最 后 一 个 有 效 。 docker run 命 令 的 -entrypoint 参 数 可 以 把 指 定 的 参 数 继 续 传 递 给ENTRYPOINT
组合使用 ENTRYPOINT 和 CMD, ENTRYPOINT 指定默认的运行命令, CMD指定默认的运行参数

3. 多个 From 指令如何使用

多个 FROM 指令并不是为了生成多根的层关系,最后生成的镜像,仍以最后一条FROM 为准,之前的 FROM 会被抛弃,那么之前的 FROM 又有什么意义呢?每一条 FROM 指令都是一个构建阶段,多条 FROM 就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。
最大的使用场景是将编译环境和运行环境分离.

4. 什么是空悬镜像(dangling )

仓库名、标签均为 的镜像被称为虚悬镜像,一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的。
造成虚悬镜像的原因:
原因一:
原本有镜像名和标签的镜像,发布了新版本后,重新 docker pull *** 时,旧的镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消;
原因二:
docker build 同样可以导致这种现象。比如用 dockerfile1 构建了个镜像 tnone1:v1,又用另外一个 Dockerfile2 构建了一个镜像 tnone1:v1,这样之前的那个镜像就会变成空悬镜像。
可以用下面的命令专门显示这类镜像:

docker image ls -f dangling=true 

5. 中间层镜像是什么?

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。

 docker image ls -a 

这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。

编写dockerfile准则

  1. 善用.dockerignore 文件
    使用它可以标记在执行 docker build 时忽略的路径和文件,避免发送不必要的数据内容,从而加快整个镜像创建过程。
  2. 镜像的多阶段构建
    通过多步骤创建,可以将编译和运行等过程分开,保证最终生成的镜像只包括运行应用所需要的最小化环境。当然,用户也可以通过分别构造编译镜像和运行镜像来达到类似的结果,但这种方式需要维护多个 Dockerfile。
  3. 合理使用缓存
    如合理使用 cache,减少内容目录下的文件,内容不变的指令尽量放在前面,这样可以尽量复用;
  4. 基础镜像尽量使用官方镜像,并选择体积较小镜像
    容器的核心是应用,大的平台微服务可能几十上百个。选择过大的父镜像(如 Ubuntu系统镜像)会造成最终生成应用镜像的臃肿,推荐选用瘦身过的应用镜像(如
    node:slim),或者较为小巧的系统镜像(如 alpine、busybox 或 debian);
  5. 减少镜像层数
    如果希望所生成镜像的层数尽量少,则要尽量合并 RUN、ADD 和 COPY 指令。通常情况下,多个 RUN 指令可以合并为一条 RUN 指令;如 apt get update&&apt install 尽量写到一行
  6. 尽量让每个镜像的用途都比较集中单一,避免构造大而复杂、多功能的镜像;
  7. 减少外部源的干扰
    如果确实要从外部引入数据,需要指定持久的地址,并带版本信息等,让他人可以复用而不出错。
  8. 减少不必要的包安装
    只安装需要的包,不要安装无用的包,减少镜像体积。

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

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

相关文章

mysql集群NDBcluster引擎在写入数据时报错 (1114, “The table ‘ads‘ is full“)

问题描述:mysql集群在写入数据时,出现上述报错 问题原因:表数据已满,一般是在集群的管理节点设置里面datamemory的值太小,当数据量超过该值时就会出现该问题 解决方案: 修改集群管理节点的config.ini里面…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习2

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习2 1、 for i in range(3):Dev.turnRight()for j in range(3):Dev.step(-3)Dev.turnRight()Dev.step(4-2*i)2、 for i in range(6):for j in range(2):Dev.step(2 2 * i)if i > 3: Dev.step(i - 2)Dev.turnRi…

更相减损术求最大公约数

1.定义 更相减损术是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。 原文是: 可半者半之,不可半者,副置分母、子之数,以少减多,…

C++小程序:同一路由器下两台计算机间简单通信(2/2)——客户端

客户端的程序结构前半部分与服务器端基本相同,后半部分也相对简单。相关函数的解释可以参考前文服务器端的内容。有关客户端的内容除个别地方外,就不再做长篇大论的解释。强调一点,如果将此程序移到其它电脑上运行,编译需要releas…

Ciphey无法安装的解决办法

安装过程纯属自己实践,满满干货 困扰我几天的问题终于解决了 我看着教程在window上安装 python3.8/python3.9/python3.10无论如何都安装不上, 在win10虚拟机仍然安装不上 可能是我电脑环境问题 解决办法: 在kali中安装,但是…

18_文件系统的制作-Ramdisk

文件系统的制作(Ramdisk) 本文介绍如何制作文件系统。另外, 由于Busybox 集合了很多工具,编译起来也非常方便。在讲解制作文件系统的时候,也会介绍 busybox 的编译和安装过程;介绍制作文件系统时,会详细介绍 Ramdisk 、 YAFFS2、JFFS2 及其它文件系统的制作。 1. 根文件系…

列表、字典、集合推导式

文章目录 前言1.列表推导式(List Comprehension):2 字典推导式(Dictionary Comprehension)3 集合推导式(Set Comprehension) 前言 在Python中,列表、字典、集合推导式是一种便捷的语法,用于根据…

第13节 第二种shellcode编写实战(2)

在第二种shellcode编写实战(1)的基础上,新增加一个CAPI类,将所有用到的函数都在这个类中做动态调用的处理,这样使得整个shellcode功能结构更加清晰。 1. 新建类CAPI(即api.h和api.cpp两个文件): api.h&…

#DELPHI BASS库Windows平台下,实时更换输出设备

DELPHI BASS库Windows平台下,实时更换输出设备 #DELPHI BASS库Windows平台下,实时更换输出设备 取自网络,分享,项目嵌入无损音乐播放后,画蛇添足的功能分享! 直接贴核心代码,看不明白去看说…

flutter自定义日期选择器按日、按月、自定义开始、结束时间

导入包flutter_datetime_picker: 1.5.0 封装 import package:atui/jade/utils/JadeColors.dart; import package:flutter/cupertino.dart; import package:flutter/material.dart; import package:flutter_datetime_picker/flutter_datetime_picker.dart; import package:flut…

景源畅信电商:经营抖店需要电脑吗?

经营抖店是否需要电脑?这个问题看似简单,实则关乎着商家的运营效率和成本投入。在当前数字化、网络化的商业环境中,电脑已经成为了不可或缺的工具。那么,经营抖店究竟是否需要电脑呢?答案是肯定的。 一、高效处理订单 电脑能够高效地处理大…

Mysql FLOAT和DOUBLE类型区别

存储方式: FLOAT和DOUBLE是浮点数类型,它们以二进制格式存储数值,可以存储近似值。这意味着某些特定的小数值可能无法精确表示,可能会有微小的计算误差。DECIMAL是定点数类型,以字符串形式存储数值,可以存储…

从零学算法2105

2105. 给植物浇水 II Alice 和 Bob 打算给花园里的 n 株植物浇水。植物排成一行,从左到右进行标记,编号从 0 到 n - 1 。其中,第 i 株植物的位置是 x i 。 每一株植物都需要浇特定量的水。Alice 和 Bob 每人有一个水罐,最初是满的…

如何在湖师大官网找到考研真题

今天学弟问我怎么找真题,我必须告诉他怎么找湖师大的真题,身为考研学子,这是必须要知道滴,尤其是自命题,是吧,话不多说,言归正传,我们开始吧! 1 打开湖师大官网 什么&a…

树莓派nmap扫描

debian系统安装nmap: sudo apt install nmap安装nmap完成后,输入 ip route 来查看当前Wi-Fi路由器的ip地址。 第一行的default via后显示的便是网关地址,也就是路由器地址。 获取到路由器ip地址后,在终端中输入: …

一站式HMI软件开发套件eStation,让开发更简单高效

4月份举办的北京国际车展上全球首发车117辆,新能源车型278个,越来越多的车厂通过差异化和改善UI/UE体验,来获取更多用户的青睐。为快速响应差异化竞争需求,智能座舱HMI市场遇到以下挑战: 如何兼容不同项目开发人员编程…

C# 使用SendMessage进行进程通信,可发送字符串,结构体

发送时只能以结构体形式发送,类的话会提示“指定结构必须能直接复制到本机结构中,或是具有布局信息 ”的错误提示 以下两种结构体示例都可以被发送 public struct A{public A(int a){name "heow";array new double[3] { 1, 2, 5.6 };}strin…

批量为本地视频生成字幕文件,并可将字幕文件翻译成其它语言

VideoSubtitleGenerator 批量为本地视频生成字幕文件,并可将字幕文件翻译成其它语言 本项目基于 macOS, node 环境运行,暂未兼容 windows 环境 🌐Github地址 https://github.com/buxuku/VideoSubtitleGenerator 初衷 自己有一大批外文视频&…

力扣例题(用栈实现队列)

目录 链接. - 力扣(LeetCode) 描述 思路 push pop peek empty 代码 链接. - 力扣(LeetCode) 描述 思路 push 例如我们将10个元素放入栈中,假设最左边为栈顶,最右侧为栈底 则为10,9,8,7,6,5,4,3,…

嵌入式 - GPIO编程简介

An Introduction to GPIO Programming By Jeff Tranter Wednesday, June 12, 2019 编者按:本 2019 年博客系列是 ICS 最受欢迎的系列之一,现已更新(2022 年 12 月),以确保内容仍然准确、相关和有用。 本博客是 Integr…