深入 Docker:容器和镜像

2023-11-12

在本专栏往期的 Flux7 系列教程 里,我们已经简单地探讨了 Docker 的基本操作。而在那篇教程中,我们一直是简单地将容器当成是“正在运行的镜像”,并没有深入地区分镜像和容器到底是什么、有什么区别。因此本次翻译 深入 Docker:容器和镜像这篇文章,通过一些实例向大家介绍 Docker 容器和镜像的具体区别。

Docker 是一个非常有趣的项目。它自己宣称可以减轻部署服务器的难度,当然我相信里面有炒作的成分。但是实际使用后,我觉得 Docker 的表现还是可圈可点的。本篇文章将会从头开始进行操作镜像,同时试图通过实例和文档来解答实际操作 Docker 中遇到的问题。

本文仅仅是试图使用深入讲解 Docker 镜像和容器的基础知识,而不是像 了解 Docker:一种更好的虚拟化方式 一样试图总结出 Docker 的所有操作方法。

如果你打算按照本文操作的话,那么你首先有台安装好 Docker 的 Linux 主机。使用 Docker Machine 安装 Docker 很简单,但是同时我也推荐使用 Digital Ocean 中已经安装好 Docker 的云主机直接操作。本篇文章所使用的 Docker 版本为 1.6.0,同时文中所有的命令都需要 root 权限。

技巧

同样,译者在正文开始提供一个操作 Docker 的小知识。下文中也会多次使用到这一点。

Docker 会为所有已经运行(包括已经停止)的容器随机分配一个唯一的名字和一个唯一的 ID,docker 命令可以识别 ID,也可以识别这个名字。

如图所示,第一行的容器的 ID 是 43de70a54ec1,名字是 admiring_ardinghelli
想删除第一行对应的容器,我们只需要 docker rm 43de70a54ec1,或者简写成 docker rm 43de,或者 docker rm admiring_ardinghelli

容器去哪儿了?

刚开始使用 Docker 的用户会发现,运行完一个容器,再次运行这个容器,原来的容器内的内容已经消失了,例如:

现在我们使用 -i(交互式)和 -t(临时终端)参数运行一个容器,然后输入一些交互命令:

(HOST) # docker run -it ubuntu /bin/bash
(CONTAINER) root@1f608dc4e5b4:/# echo hello docker > /message.txt
(CONTAINER) root@1f608dc4e5b4:/# cat /message.txt
hello docker
(CONTAINER) root@1f608dc4e5b4:/# exit

在上面那个容器内,我们创建了 /message.txt 文件,现在我们尝试重新读取这个文件:

(HOST) # docker run -it ubuntu cat /message.txt
cat: /message.txt: No such file or directory

刚刚我们明明新建了这个文件,现在怎么没了?
同时,运行 docker ps 列出容器,刚刚那个 1f608dc4e5b4 容器到哪里去了?

好吧,那么我们用 docker ps -a 命令列出所有容器,然后仔细观察一下:

(HOST) # docker ps -a
CONTAINER ID        IMAGE                 COMMAND              CREATED             STATUS                      PORTS               NAMES
b3d8c3ef31a0        ubuntu:latest         "cat /message.txt"   33 minutes ago      Exited (1) 33 minutes ago                       admiring_lalande
1f608dc4e5b4        ubuntu:latest         "/bin/bash"          34 minutes ago      Exited (0) 15 minutes ago                       insane_wright

现在大家应该可以发现问题了:居然有两个不同的容器,一个执行了 /bin/bash,一个执行了 cat /message.txt

在本专栏以往的文章中,多次提到:Docker 使用一个叫做 UnionFS 的层级文件系统进行镜像操作。容器对镜像文件的所有操作均是在虚拟出的“改动层”上进行的。当然对容器而言,UnionFS 和普通的文件系统并无差别,也无法看到任何“改动层”。

每次运行 docker run 命令的时候,Docker 都会指定新建容器,并且为容器自己的改动层。所以我们两次都运行了 ubuntu 镜像,那么我们也将会有两个新的、不同的容器,每个容器也都会有自己独立的的“改动层”。因此,在第一个容器内创建的 /message.txt 文件在第二个容器内是无法访问的。当然,要是能互相访问,那我们就得为 Docker 的安全性担心了。

容器到底去哪儿了?

刚刚的问题是:“容器去哪儿了?”
现在的问题是:“容器到底去哪儿了?我需要里面的 message.txt 文件,怎么才能取出来?”

已经停止的容器中的数据并不会消失,而是被存储在相应的“改动层”中。我们可以通过 docker ps -a 进行查找容器。在这个例子中,我们要找的容器便是执行了 /bin/bash 命令的容器,ID是 1f608dc4e5b4,名称是 insane_wright

对比起 ID,容器的名称更加易读。因此在本篇文章后面的例子中,我都将用名称来进行操作和识别容器。当然,你也可以在 docker run 的时候用 --name 参数指定容器的名称。

那么现在我们现在运行上面例子中已经停止的 insane_wright 容器:

(HOST) # docker start -ai insane_wright
(CONTAINER) root@1f608dc4e5b4:/# cat /message.txt
hello docker
(CONTAINER) root@1f608dc4e5b4:/# exit

使用 -a 参数将容器的输出导出到终端,同时使用 -i 参数进行交互式的操作。这条命令可以让我们继续运行容器 insane_wright,现在你应该能看得到我们刚刚创建的 /message.txt 文件了。

容器能不能提取出来?

现在我们已经运行了自己的容器,容器内也有独立的数据,我们也知道如何获取容器内的数据,那么问题来了:我们能不能把这个状态下的容器给保存起来?

本专栏前面的文章提到过得益于 UnionFS,对于 Docker 来说,其实容器和镜像的差别并不大。容器可以认为是已经运行过的或正在运行的镜像,只不过是镜像上面添加了几个改动层。当然,大部分镜像也是如此。例如某些 mysql 镜像,便仅仅是在官方 ubuntu 镜像的基础上增加了一个 mysql 改动层。

对于上面例子中的容器,我们可以用下面这条命令将其打包成镜像:

(HOST) $ docker commit -a "Jordan Bach" -m "saved my message" insane_wright jbgo/message:v0.0.1
1c9195e4c24c894a274f857a60b46fb828ee70ff0e78d18017dfb79c5bf68409

本条命令将容器 insange_wright 的改动层的属性变为“只读”,并且指定存储为 jbgo/message 镜像。镜像基于原 ubuntu 镜像,增加了一个改动层,标签为 v0.0.1。标签可以为任意,当然一般用来记录版本信息。

当然,如果你打算自己尝试的话,记得将我的名字 jbgo 替换为你自己在 Docker Hub 上的用户名。即便你没有 Docker Hub 账户,也要养成给镜像做签名的习惯。

可以用如下命令检查当前的镜像:

(HOST) # docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jbgo/message        v0.0.1              1c9195e4c24c        18 seconds ago      188.3 MB
ubuntu              latest              b7cf8f0d9e82        4 days ago          188.3 MB

现在我们有两个镜像了:一个是原有的 ubuntu 镜像,镜像是我们在刚开始进行 docker run 的时候自动从 Docker Hub 上面下载下来的;另一个便是我们刚刚保存的,有一个 /message.txt 文件的镜像。

不信?
那我运行给你看。

(HOST) # docker run -it jbgo/message:v0.0.1 cat /message.txt
hello docker

这里我们并没有运行刚刚的 insane_wright 容器,而是运行了我们刚刚保存的镜像。
我们确实把刚刚的容器保存为一个新的镜像了。

还不信?
那我检查给你看。

(HOST) # docker ps -a
CONTAINER ID        IMAGE                 COMMAND              CREATED             STATUS                      PORTS               NAMES
01bd4c098203        jbgo/message:v0.0.1   "cat /message.txt"   10 seconds ago      Exited (0) 9 seconds ago                        hopeful_lovelace
b3d8c3ef31a0        ubuntu:latest         "cat /message.txt"   33 minutes ago      Exited (1) 33 minutes ago                       admiring_lalande
1f608dc4e5b4        ubuntu:latest         "/bin/bash"          34 minutes ago      Exited (0) 15 minutes ago                       insane_wright

容器运行记录里面多了一个叫做 hopeful_lovelace 的容器,是运行 jdgo/message:v0.0.1 镜像而创建的这个容器。

如何备份镜像?

上面我们创建了带有一个 /message.txt 文件的镜像,也用它运行了容器,那么如果 Docker 宿主机崩溃了或者文件消失了怎么办?如何保证我们创建的镜像在系统崩溃后仍然不丢失?

我们需要 Docker Registry,可以存储和下载镜像的地方。Docker Hub 官方提供了 Docker Hub Registry 让我们来存储镜像,当然我们也可以自己搭建 Docker Registry。本篇文章将会使用 Docker Hub Registry,如果你想按照本文中继续操作的话,记得将我的名字jbgo 换成你自己在 Docker Hub 上的用户名。

使用如下操作将镜像上传到 Docker Registry 上:

(HOST) # docker push jbgo/message
The push refers to a repository [jbgo/message] (len: 1)
1c9195e4c24c: Image push failed

Please login prior to push:
Username: jbgo
Password:
Email: jordanbach@gmail.com
WARNING: login credentials saved in /root/.dockercfg.
Login Succeeded
The push refers to a repository [jbgo/message] (len: 1)
1c9195e4c24c: Image already exists
b7cf8f0d9e82: Image successfully pushed
2c014f14d3d9: Image successfully pushed
a62a42e77c9c: Image successfully pushed
706766fe1019: Image successfully pushed
Digest: sha256:b2a98b19e06a4df91150f8a2cd47a6e440cbc13b39f1fc235d46f97f631ad117

因为我是第一次在本机执行 docker push 操作,所以 Docker Registry 需要验证我的身份。

本次上传的镜像被保存在这里
你可以使用 docker pull jbgo/message 来下载我的镜像。

当然,如果你按照上面的来操作的话,可能会出现一点小问题:

(HOST) # docker pull jbgo/message
Pulling repository jbgo/message
FATA[0007] Tag latest not found in repository jbgo/message

下面我来解释一下到底出了什么问题:
当你使用 docker push jbgo/message 命令的时候,默认上传标签为 latest 的镜像。如果没有便会报错。你可以采用如下命令解决:docker tag jbgo/message:v0.0.1 jbgo/message:latest
这次再尝试推送:

(HOST) # docker push jbgo/message:latest
The push refers to a repository [jbgo/message] (len: 1)
1c9195e4c24c: Image already exists
b7cf8f0d9e82: Image already exists
2c014f14d3d9: Image already exists
a62a42e77c9c: Image already exists
706766fe1019: Image already exists
Digest: sha256:cc2fbbb2029c6402cea639b2454da08ef05672da81176ae97f57d4f51be19fc3

这次上传会快得多,因为服务器上已经有了这个镜像,我们上传的仅仅是相同镜像的不同标签而已。

你不信?
那我验证给你看:

(HOST) # docker pull jbgo/message
latest: Pulling from jbgo/message
1c9195e4c24c: Already exists
706766fe1019: Already exists
a62a42e77c9c: Already exists
2c014f14d3d9: Already exists
b7cf8f0d9e82: Already exists
Digest: sha256:cc2fbbb2029c6402cea639b2454da08ef05672da81176ae97f57d4f51be19fc3
Status: Downloaded newer image for jbgo/message:latest

当然,别台服务器一样可以使用这个命令下载我的镜像。

当然,也可以使用如下命令上传特定标签的镜像:docker push jbgo/message:v0.0.1
建议使用版本标签标记镜像,并推送特定版本标签的镜像和 latest 标签的镜像

使用完毕的容器如何处理?

上面只是介绍了容器如何理解容器和镜像,如果有很多历史容器被保存在硬盘上,想要释放掉这些空间,我们应该怎么做?

使用如下命令删除多个容器:

(HOST) # docker rm hopeful_lovelace insane_wright admiring_lalande
hopeful_lovelace
insane_wright
admiring_lalande

现在再检查一下还有没有这些容器:

(HOST) # docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

我们运行的所有容器和所有的历史容器都会被保存在硬盘上,除非你手动 docker rm 它们。手动删除的容器不能恢复。

为什么上传了不止一个镜像?

有心人注意到,刚刚我们第一次上传 jbgo/message 镜像的时候,Docker 上传了不止一个镜像。

(HOST) # docker push jbgo/message:v0.0.1
...
1c9195e4c24c: Image already exists
b7cf8f0d9e82: Image successfully pushed
2c014f14d3d9: Image successfully pushed
a62a42e77c9c: Image successfully pushed
706766fe1019: Image successfully pushed

到底发生了什么?

首先使用 docker history 检查一下镜像改动历史:

(HOST) # docker history jbgo/message:v0.0.1
IMAGE               CREATED             CREATED BY                                      SIZE
1c9195e4c24c        33 minutes ago      /bin/bash                                       108 B
b7cf8f0d9e82        4 days ago          /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B
2c014f14d3d9        4 days ago          /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.895 kB
a62a42e77c9c        4 days ago          /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
706766fe1019        4 days ago          /bin/sh -c #(nop) ADD file:777fad733fc954c0c1   188.1 MB

会发现,其实我们创建了不止一个镜像,也就是有不止一个改动层。
使用 docker inspect 命令仔细观察第一个镜像(第一层)进行过的改动:

(HOST) # docker inspect 1c9195e4c24c
[{
    "Architecture": "amd64",
    "Author": "Jordan Bach",
    "Comment": "saved my message",
    "Config": {

这个肯定就是我们的 /message.txt 改动层了,那么其他的那么多是什么?

jbgo/message 是基于 ubuntu 镜像的,我们来检查一下 ubuntu 镜像的改动历史:

(HOST) # docker history ubuntu
IMAGE               CREATED             CREATED BY                                      SIZE
b7cf8f0d9e82        4 days ago          /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B
2c014f14d3d9        4 days ago          /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.895 kB
a62a42e77c9c        4 days ago          /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
706766fe1019        4 days ago          /bin/sh -c #(nop) ADD file:777fad733fc954c0c1   188.1 MB

那么这样一切就很明确了:那些是 ubuntu 镜像的改动历史。为了确保本地和上传到 Docker Hub 的镜像一致,我们上传到 Docker Hub 中的镜像便是包含着五层改动层的新镜像。

 如何删除镜像?

前面提到过,我们删除容器,那么我们本机上仍然保存着镜像,如何删掉它们?

(HOST) # docker rmi jbgo/message
Error response from daemon: Conflict, cannot delete 1c9195e4c24c because the container 2ea39e64a130 is using it, use -f to force
FATA[0000] Error: failed to remove one or more images

提示出错了,根据错误信息可以看出,还有容器在用这一个镜像。

但是我们没有正在运行着的容器啊,到底哪儿出错了?

检查所有容器,发现容器 2ea39e64a130

(HOST) # docker ps -a
CONTAINER ID        IMAGE                 COMMAND              CREATED             STATUS                     PORTS               NAMES
2ea39e64a130        jbgo/message:latest   "cat /message.txt"   2 minutes ago       Exited (0) 2 minutes ago                       lonely_jones

当然,这是 Docker 的机制:如果你仍然有容器的历史记录,那么为了确保你能再次启动这个容器,这些镜像是不能删除的。

首先删除掉这个容器:docker rm lonely_jones

然后删除镜像:

(HOST) # docker rmi jbgo/message
Untagged: jbgo/message:latest
Deleted: 1c9195e4c24c894a274f857a60b46fb828ee70ff0e78d18017dfb79c5bf68409
Deleted: b7cf8f0d9e82c9d96bd7afd22c600bfdb86b8d66c50d29164e5ad2fb02f7187b
Deleted: 2c014f14d3d95811df672ddae2af376f9557f6b8f5623e3e3f8c5ca3f6ff42e6
Deleted: a62a42e77c9c3626118dc411092d23cf658220261acdafe21a7589a8eeba627e
Deleted: 706766fe101906a1a6628173c2677173a5f8c6c469075083f3cf3a8f5e5eb367

这次我们可以很轻松地删除掉 jbgo/message 镜像了。
确认一下:

(HOST) # docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
确实没了。

后记

本篇文章介绍了容器和镜像的操作实例,当然 Docker 还有更多新奇的功能和只是等待大家去发现。
本专栏仍在继续组织翻译更多的系列文章,希望大家多多关注。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入 Docker:容器和镜像 的相关文章

  • Vue - 去掉路由中的#号

    vue router默认是hash模式 在hash模式下 是会有 号在URL上 可以在路由的第一行添加 mode history来去掉 号 const router new Router mode history routes 一开始用的t
  • nginx实践(一)、安装和部署

    很长一段时间没有更新blog 因为这一段时间 都在研究一个实时事件处理应用 计划把该实时事件处理服务 修改为分布式服务 相关内容以后再与大家汇报 好了 因为工作缘故 要分析一个使用nginx的应用 所以从本节开始 介绍一下nginx的相关实
  • H5页面在ios的浏览里返回不刷新页面,解决浏览器自带缓存的问题。

    1 利用pageshow来解决 pageshow的web api pageshow Web API 接口参考 MDN 2 解决 在app vue里面 isPageHide false 定义变量 created void window add
  • Connections between cities 【HDU - 2874】【在线LCA算法】

    题目链接 昨天刚学了在线LCA 今天就来硬刚这道题还是花了一整天的时间 不过对于LCA却有了更多的理解 这道题在讲述不同根的做法上尤其是很好的 题目告诉我们有N个节点和M条边 以及C次询问 每次查询的是 L R 这两个节点间的距离 还是算得
  • dbeaver 配置mysql数据库驱动

    右键点击要数据库连接选择 编辑连接 然后点击 编辑驱动设置 从mysql8版本后 mysql的驱动类名发生改变 变成了com mysql cj jdbc Driver 所以如果要连接的数据库版本在8之前 需将 设置 界面的 类名 处改为 c
  • 华为od机试 Python【快递装载】

    前言 本题使用python解答 如果需要Java版本 请参考 点我 题目 快递需要按照一定的规则装载 所有的快递放在长方体的盒子当中 我们的需要是尽可能装载更多的快递 并且不能让货车超载 需要计算最多能装多少个快递 快递数最多1000个 货
  • 双列集合系列之Map集合的初了解

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于双列集合的相关操作吧 目录 Welcome Huihui s Code World 顶级接口Map 一 Map集合的特点 二 Map集合的常见子类 HashM
  • xss渗透(跨站脚本攻击)

    一 什么是XSS XSS全称是Cross Site Scripting即跨站脚本 当目标网站目标用户浏览器渲染HTML文档的过程中 出现了不被预期的脚本指令并执行时 XSS就发生了 这里我们主要注意四点 1 目标网站目标用户 2 浏览器 3
  • 项目管理中什么最重要?

    被问过多次这个问题 尤其是在面试的时候 有说需求最重要 有说控制最重要 有的冠冕堂皇 来个成本 质量 时间三要素 美其名曰都重要 免得以偏概全 经多方求证 思索 结合十余年的项目管理经历 敝以为 项目管理中干系人管理最重要 尤其是关键干系人
  • Java面向对象编程

    一个关系数据库文件中的各条记录 A 前后顺序不能任意颠倒 一定要按照输入的顺序排列 B 前后顺序可以任意颠倒 不影响库中的数据关系 C 前后顺序可以任意颠倒 但排列顺序不同 统计处理的结果就可能不同 D 前后顺序不能任意颠倒 一定要按照关键
  • textarea placeholder不显示

    textarea placeholder不显示 textarea 的 placeholder 属性值不显示的原因可能是
  • DirectD3D-纹理映射

    DirectD3D 纹理映射 标签 Direct3Ddirectx游戏游戏开发 2014 11 12 14 03 321人阅读 评论 0 收藏 举报 分类 DirectX 8 版权声明 本文为博主原创文章 未经博主允许不得转载 纹理映射的概
  • python哪些类型可以作为迭代器_Python教程|全面理解Python迭代器和生成器

    在Python中 很多对象都是可以通过for语句来直接遍历的 例如list string dict等等 这些对象都可以被称为可迭代对象 至于说哪些对象是可以被迭代访问的 就要了解一下迭代器相关的知识了 迭代器 迭代器对象要求支持迭代器协议的
  • Golang架构直通车——理解Go GC

    文章目录 设计原理 三色抽象 三色不变性 插入写屏障 删除写屏障 垃圾收集器的增量和并发 增量式垃圾收集 并发式垃圾收集器 Go GC演进过程 并发垃圾收集 回收堆目标 混合写屏障 设计原理 三色抽象 标记清除 Mark Sweep 算法是
  • 数学建模--退火算法求解最值的Python实现

    目录 1 算法流程简介 2 算法核心代码 3 算法效果展示 1 算法流程简介 1 设定退火算法的基础参数 2 设定需要优化的函数 求解该函数的最小值 最大值 3 进行退火过程 随机产生退火解并且纠正 直到冷却 4 绘制可视化图片进行了解退火
  • 异步javaScript

    在本文中 我们将解释什么是异步编程 为什么我们需要它 并简要讨论 JavaScript 历史上异步函数是怎样被实现的 预备知识 基本的计算机素养 以及对 JavaScript 基础知识的一定了解 包括函数和事件处理程序 目标 熟悉异步 Ja
  • 日增30-40亿数据量的数据库

    author skate time 2010 08 13 前几天和个朋友聊天 他说他有每天30 40亿条数据量的数据库如何规划与优化 简单了解需求是这30 40亿数据是每天采集的 然后同时还对这些采集的数据进行分析挖掘 对于这么大量的数据量
  • MySQL数据库使用小皮系统(phpstudy)的安装及配置流程

    小皮系统phpstudy的安装及配置流程 一 小皮系统 phpstudy 的下载 二 数据库管理工具 一 小皮系统 phpstudy 的下载 搜索 phpStudy V8 1 下载大约 78m 左右 官网下载地址 phpStudy 可以随时
  • Android红外遥控器移植

    1 编译hal层代码 红外的hal代码路径 hardware libhardware modules consumerir 最终生成consumerir default so 但system文件系统中并没有该库 选择安装该库即可 在devi
  • Bert模型做多标签文本分类

    Bert模型做多标签文本分类 参考链接 BERT模型的详细介绍 图解BERT模型 从零开始构建BERT 强推 李宏毅2021春机器学习课程 我们现在来说 怎么把Bert应用到多标签文本分类的问题上 注意 本文的重点是Bert的应用 对多标签

随机推荐

  • 2022年“网络安全”赛项黑龙江省赛选拔赛 任务书

    2022年 网络安全 赛项黑龙江省赛选拔赛 任务书 2022年 网络安全 赛项黑龙江省赛选拔赛 任务书 A模块基础设施设置 安全加固 200分 B模块安全事件响应 网络安全数据取证 应用安全 400分 C模块 CTF夺旗 攻击 200分 D
  • MYBATIS-PLUS入门使用、踩坑记录

    转载 mybatis plus入门使用 踩坑记录 灰信网 软件开发博客聚合 首先引入MYBATIS PLUS依赖 SPRING BOOT项目
  • Java事件处理机制

    Java事件处理机制涉及三个成员 事件源 事件和事件监听器事件源 Java的AWT或Swing组件 该组件就是事件源 通过new关键字即可创建事件 由系统自动产生事件监听器 整个事件处理的核心 事件监听器必须实现事件监听器接口 以鼠标事件为
  • 【ES】 es

    一 说明 1 通过kibana操作es 2 使用dsl命令操作es 3 需要已经安装es 必须 4 需要已经安装kibana 非必须 5 若是没有装kibana 可以用PostMan之类的请求工具 二 基础知识 1 Elasticsearc
  • 在vue项目中用BMap百度地图自定义定位icon不显示

    我自定义了图标但是不显示 先来看一下怎么用百度地图自定义图标 var myIcon new BMap Icon 自定义图标 require assets image L gif new BMap Size 24 21 图标的宽度和高度 va
  • spring 三级缓存

    spring 三级缓存 Spring三级缓存是Spring框架用来解决循环依赖问题的一种机制 它包含三级缓存 singletonObjects earlySingletonObjects和singletonFactories singlet
  • 移植STM32官方加密库STM32Cryptographic

    感谢这位博主 文章具有很高的参考价值 STM32F1做RSA AES数据加解密 MD5信息摘要处理 我以为我爱了的博客 CSDN博客 概述 ST官方在很多年前就推出了自己的加密库 配合ST芯片用起来非常方便 支持ST的所有MCU 官方已经给
  • 怎样选择网站服务器带宽,如何选择云服务器带宽

    原标题 如何选择云服务器带宽 在一台正常使用的云服务器中 一般主要有CPU 内存 带宽 磁盘等几种配置 在云服务器运行中 带宽指在一定时间内从或向网站 服务器传输的数据量 带宽是一个量词 是指在规定时间 一般单位时间为1秒 内 从一端流到另
  • IT自由职业者的成功秘诀

    From http www csdn net article 1970 01 01 293774 导读 原文作者Greg Jorgensen是一位典型的程序员 他从1974年开始编程 曾在耐克和苹果等公司任职 他专攻修复和完善受损 被遗弃和
  • 阿里云k8s服务之间偶尔获取不到dns解析安装ACK NodeLocal DNSCache

    1 背景 feign RetryableException No route to host Host unreachable executing POST http osale thirdparty empty detect 服务突然会中
  • IT精英简历

    IT精英简历 马化腾眼下 一个34岁的中国人在世界和中国经济界可谓抢尽风头 在刚刚过去的2004年年底 他被美国 时代周刊 Time 和有线新闻网 CNN 评为2004年全球最具影响力的25名商界领袖之一 荣膺香港理工大学第四届紫荆花杯杰出
  • vue2.0 element-ui中的el-select选择器无法显示选中的内容

    我使用的是element ui V2 2 3 代码如下 当我选择值得时候 el select选择器无法显示选中的内容 但是能触发change方法 并且能输出选择的值 select vue文件
  • 动态修改iframe高度,从而自适应内容真实高度

    项目中遇到这样的情况 需要用到iframe iframe中的内容也是自己写的页面 由于页面中元素是异步加载出来的 并不能提前预知其高度 这样就不能设置iframe的高度 导致iframe会出现滚动条 用户体验不好 所以我需要能根据内容动态改
  • 41-C语言-蛇形矩阵-输出从1到n的矩阵

    问题 蛇形矩阵 构建蛇形矩阵 之后 根据条件相应输出 思路 蛇形矩阵 初始值a 0 0 为1 之后开始进行趟数变更 蛇形矩阵趟数 斜着来 斜杠 第一趟为a 0 1 和a 1 0 每一趟中的范围为0到tang次 如第一趟中a 0 1 已经赋值
  • 试题 算法训练 印章

    问题描述 共有n种图案的印章 每种图案的出现概率相同 小A买了m张印章 求小A集齐n种印章的概率 输入格式 一行两个正整数n和m 输出格式 一个实数P表示答案 保留4位小数 样例输入 2 3 样例输出 0 7500 数据规模和约定 1 n
  • 神舟电脑上的神器----“control center 管理软件”

    前言 现在有许许多多的人都爱上了神舟电脑的 物美价廉 那么在使用神舟电脑的时候 我们有哪些值得知道的事情 我认为用神舟电脑而不知道 神舟电脑上的控制中心 control center 管理软件 将没有比这个更加遗憾的事情了 正文 现在我们来
  • 2、ESXI安装出错

    ESXI安装错误提示 解决办法 按ALT F1健进入命令行模式 用户名为root 密码为空 然后输入 esxcli system settings advanced set o VSAN FakeSCSIReservations i 1 重
  • unity种四种光源

    unity 中的光 unity中一共有四种光源分别为 Directional light 方向光 类似太阳的日照效果 Point light 点光源 类似蜡烛 Spotlight 聚光灯 类似手电筒 Area Light 区域光 无法用作实
  • 【c++设计模式】——模板方法模式

    模板方法模式的定义 定义一个操作中的算法对象的骨架 稳定 而将一些步骤延迟到子类 定义一个虚函数 让子类去实现 template method使得子类可以不改变 复用 一个算法结构即可重定义该算法的某些步骤 在理解模板方法模式的时候 我们需
  • 深入 Docker:容器和镜像

    在本专栏往期的 Flux7 系列教程 里 我们已经简单地探讨了 Docker 的基本操作 而在那篇教程中 我们一直是简单地将容器当成是 正在运行的镜像 并没有深入地区分镜像和容器到底是什么 有什么区别 因此本次翻译 深入 Docker 容器