- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我读到 docker 与层一起工作,所以在创建 container
时与 Dockerfile
,您从基础镜像开始,然后运行后续命令向容器添加一个层,因此如果您保存该新容器的状态,您将拥有一个新镜像。对此,我有几件事想知道。
如果我从 Ubuntu
开始图像,因为它是一个完整的操作系统,所以它非常大而且笨重,然后我向它添加了一些工具并将其保存为我上传到集线器的新图像。如果有人下载了我的图像,并且他们已经在他们的 images folder
中保存了一个 Ubuntu 图像, 这是否意味着他们可以跳过下载 Ubuntu
因为他们已经有了图像?如果是这样,当我修改原始图像的一部分时,这是如何工作的,Docker 是否使用其缓存数据有选择地将这些更改应用于 Ubuntu image
加载后呢?
2.) 如何更新我通过修改 Dockerfile 构建的镜像?我用这个 Dockerfile
设置了一个简单的 django 项目:
FROM python:3.5
ENV PYTHONBUFFERED 1
ENV APPLICATION_ROOT /app
ENV APP_ENVIRONMENT L
RUN mkdir -p $APPLICATION_ROOT
WORKDIR $APPLICATION_ROOT
ADD requirements.txt $APPLICATION_ROOT
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . $APPLICATION_ROOT
environment variables
,如果我完全重建盒子,它会重新安装包和所有额外的东西。我需要添加一个新的环境变量,所以我把它添加到
Dockerfile
的底部,以及一个测试变量:
ENV COMPOSE_CONVERT_WINDOWS_PATHS 1
ENV TEST_ENV_VAR TEST
COMPOSE_CONVERT_WINDOWS_PATHS 1
---> Running in 75551ea311b2
---> b25b60e29f18
Removing intermediate container 75551ea311b2
intermediate container
?所以考虑到这一点,你如何添加一个新层,你是否总是需要在 Dockerfile 底部添加新数据?或者在构建镜像后不理会Dockerfile会更好,只需修改
container
并建立了一个新形象?
bwawrik/bioinformatics
的包,这是一个基于 CentOS 的容器,它安装了广泛的工具。
$ docker pull bwawrik/bioinformatics
Using default tag: latest
latest: Pulling from bwawrik/bioinformatics
a3ed95caeb02: Already exists
a3ed95caeb02: Already exists
7e78dbe53fdd: Already exists
ebcc98113eaa: Already exists
598d3c8fd678: Already exists
12520d1e1960: Already exists
9b4912d2bc7b: Already exists
c64f941884ae: Already exists
24371a4298bf: Already exists
993de48846f3: Already exists
2231b3c00b9e: Already exists
2d67c793630d: Already exists
d43673e70e8e: Already exists
fe4f50dda611: Already exists
33300f752b24: Already exists
b4eec31201d8: Already exists
f34092f697e8: Already exists
e49521d8fb4f: Already exists
8349c93680fe: Already exists
929d44a7a5a1: Already exists
09a30957f0fb: Already exists
4611e742e0b5: Already exists
25aacf0148db: Already exists
74da82504b6c: Already exists
3e0aac083b86: Already exists
f52c7e0ac000: Already exists
35eee92aaf2f: Already exists
5f6d8eb70885: Already exists
536920bfe266: Already exists
98638e678c51: Already exists
9123956b991d: Already exists
1c4c8a29cd65: Already exists
1804bf352a97: Already exists
aa6fe9359956: Already exists
e7e38d1250a9: Already exists
05e935c831dc: Already exists
b7dfc22c26f3: Already exists
1514d4797ffd: Already exists
Digest: sha256:0391808e21b7b5cc0eb44fc2dad0d7f5415115bdaafb4534c0b6a12efd47a88b
Status: Image is up to date for bwawrik/bioinformatics:latest
最佳答案
图像与容器
首先,让我澄清一些术语。
图片 : 一个静态的、不可变的对象。这是你运行时构建的东西 docker build
使用 Dockerfile
.图像不是运行的东西。
图像由层组成。一个图像可能只有一层,也可能有很多层。
容器 : 一个正在运行的东西。它使用图像作为其起始模板。
这类似于二进制程序和进程。您在磁盘上有一个二进制程序(例如 /bin/sh
),当您运行它时,它是您系统上的一个进程。这类似于镜像和容器之间的关系。
将图层添加到基础图像
您可以从基础镜像构建您自己的镜像(例如您的示例中的 ubuntu
)。您的 Dockerfile
中的一些命令将在最终图像中创建一个新层。其中一些是 RUN
, COPY
, 和 ADD
.
第一层没有父层。但是每个其他层都会有一个父层。通过这种方式,它们相互连接,像煎饼一样堆叠。
每个层都有一个唯一的 ID(你已经看到的长十六进制哈希)。它们也可以有人性化的名称,称为标签(例如 ubuntu:16.04
)。
什么是图层与图像?
从技术上讲,每一层也是一个图像。如果您构建一个新图像并且它有 5 个层,您可以使用该图像,它将包含所有 5 个层。如果您使用堆栈中的第三层作为图像 ID 运行容器,您也可以这样做 - 但它只会包含 3 层。您指定的一个和作为其祖先的两个。
但作为惯例,术语“图像”通常表示具有关联标签的层。当您运行时 docker images
,它将显示所有顶级图像,并隐藏下面的图层(但您可以使用 -a
显示它们)。
什么是中间容器?
当docker build
运行时,它会在容器内完成所有工作(很自然!)所以如果遇到 RUN
step,它将从当前顶层创建一个容器,在其中运行指定的命令,然后将结果保存为新层。然后它将从这个新层创建一个容器,运行下一件事......等等。
中间容器仅用于构建过程,并在构建后丢弃。
层文件系统如何工作
你问是否有人下载你的ubuntu
-based 图像只进行部分下载,如果他们已经有 ubuntu
本地镜像。
是的!完全正确。
每一层都使用它下面的层作为基础。新层基本上是该层和新状态之间的差异。不过,这与 git commit 可能工作的方式不同。它适用于文件级别,而不是行级别。
假设您从 ubuntu
开始,然后你运行了这个 Dockerfile。
FROM: ubuntu:16.04
RUN groupadd dan && useradd -g dan dan
这将导致两层图像。第一层将是
ubuntu
图片。第二个可能只有少数变化。
/etc/passwd
的较新副本与用户“dan”/etc/group
的较新副本与“丹”组/home/dan
/home/dan/.bashrc
ubuntu
中的文件系统。图片。
FROM
也是一样,第一个
RUN
一样,第二个
RUN
是一样的......它会假设它已经完成了这些步骤,并将使用缓存的结果。如果它遇到与上次构建不同的内容,它将使缓存无效。从那时起,一切都将重新运行。
ADD
或
COPY
,那些总是使缓存无效。那是因为 Docker 只跟踪构建命令是什么。它不会试图弄清楚“我正在复制的文件的这个版本是否与上次相同?”
FROM
开始,然后放置非常静态的东西,例如
RUN
安装包的命令,例如
apt-get
等。在最初编写 Dockerfile 后,这些内容往往不会有太大变化。文件的后面是一个更方便的地方,可以放置更频繁更改的内容。
关于docker - 如何更新 docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41603822/
我需要将 OCI 镜像 list 转换为 Docker v2.2 镜像格式,反之亦然。但我找不到两者之间的任何区别,是否有任何实际区别或它们相同? 最佳答案 Docker 镜像 list V 2,模式
LNMP 是代表 Linux 系统下的 Nginx、Mariadb、PHP 相结合而构建成的动态网站服务器架构。下面使用docker制作分布式lnmp 镜像。 1、docker 分布式 lnmp
你好,我创建了一个基础镜像;但是,每当我运行 docker build . 时,我都看不到成功构建 我的 docker 文件 FROM centos:7 ARG user=john ARG home=
我想要我的 iPhone 应用程序中有一个功能,可以将图像转换为类似镜像的方式。 就像如果有一个左手举起的人的图像,那么转换后的图像必须有右手举起的同一个人。 任何代码或链接将不胜感激 预先感谢您的帮
我们希望将一个Elasticsearch集群放置在kubernetes集群的顶部(当前有2个节点,但是我们计划增加它)。 是否可以通过使集群中的每个节点包含相同数据的方式配置elasticsearch
我试图了解 docker 如何在文件系统上存储图像和图层。构建图像时,图层出现在 /var/lib/docker/image/overlay2/layerdb 中,图像出现在 /var/lib/doc
所以我最近开始使用 docker,因为我认为让我的网站 dockerised 会很好。我有一个 super 简单的 docker-compose.yml 文件,其中仅包含 wordpress:late
我有一个 docker 镜像,叫它 dockerimage/test。每次我更新它时,我都会增加一个标签,所以 dockerimage/test:1、dockerimage/test:2 等等。 当我
我开始使用 Docker,我发现我可以将主图像存储库放在不同的磁盘上(符号链接(symbolic link)/var/lib/docker 到其他位置)。 但是,现在我想看看是否有办法将它拆分到多个磁
显然应用程序打包和部署似乎有两种做法 创建 Docker 镜像并部署它 从头开始构建和部署应用程序。 我对如何使用选项 1) 感到困惑。前提是你获取一个 docker 镜像并在任何平台上重复使用它。但
我有一个 UIView具有透明背景和一些按钮。我想捕获 View 的绘图,将其缩小,然后在屏幕上的其他位置重新绘制(镜像)它。 (在另一个 View 之上。)按钮可以更改,因此它不是静态的。 最好的方
我正在为一个项目编写测试,我想测试和验证一个 docker 镜像构建。但我不想推送图像。 我希望图像构建在 CI(如 taskcluster)上并运行测试。 最佳答案 您需要使用 taskcluste
我想复制每个 html 页面中的代码,同时添加一些更改: 例子: Any text (even if includes :., 输出: Any text (even if includes :.,
我使用三星 ARM Cortex A9 Exynos4412 板。我在板上启动“linux + Qt”img。但是板上没有包管理器,也没有 make 、 gcc 命令。在/bin 文件中有文件 Bus
是否有可能以某种方式设置一个 git 存储库,该存储库像通常的 --mirror 一样用于 pull 入它,但在将从推送到另一个存储库时没有强制? 最佳答案 您可以像这样添加 --no-force 来
背景 最近在巡检过程中,发现harbor存储空间使用率已经达到了80%。于是,去看了一下各项目下的镜像标签数。发现有个别项目下的镜像标签数竟然有好几百个。细问之下得知,该项目目前处于调试阶段
以下均在centos 7进行的操作 docker安装 ? 1
我知道如何删除 N 天前创建的旧 Docker 镜像。 See here 但我真正想做的是删除过去 N 天未使用的旧 Docker 镜像。 目标是保留经常使用的图像,即使在我进行清理时没有容器实际使用
我有一个自定义的 docker 镜像,已经构建好了。没有可用的 Dockerfile。在容器内部,可以使用自定义用户,而不是 root,比如 test。此用户已附加到组 test。这是容器的默认用户。
我有一个开发数据库,我想将其提交到 docker 镜像中,然后推送到私有(private)存储库并用于本地开发和 CI 构建。 数据库保存为SQL备份,我可以通过将备份文件映射到官方镜像的/doc
我是一名优秀的程序员,十分优秀!