【问题标题】:How to deploy a Docker image to make changes in the local environment?如何部署 Docker 镜像以在本地环境中进行更改?
【发布时间】:2015-09-04 14:08:52
【问题描述】:

EDIT +2=仅供参考,我是 root 用户,这意味着我每次执行仅授权的 cmd 时都没有输入超级用户 do (sudo)。

好吧,在研究 Docker 大约 24 小时后,如果我明白了我的事实,我会有点不高兴。

简单回顾一下,docker 是一种为特定 Web 服务、运行环境、虚拟机编写代码或配置文件更改的方式,所有这些都来自 linux 终端/文本文件的舒适范围。毫无疑问,这是一个了不起的功能:让您在一台计算机上创建的代码或构建可以在无限数量的其他机器上运行,这确实是一个突破。虽然我很生气关于什么是容器和什么是图像的术语是错误的(图像是由 dockers 服务器制作的代码层的保存点,或者可以从需要基本图像的容器创建。Dockerfiles通过运行所有所需的层并将它们卷成一个图像,以便可以轻松访问它,作为一种自动化构建图像的方法。

看到 docker 的关键在于“确保它可以部署在各种不同的操作系统上并使用它们各自的命令”。但是这些命令并没有真正传达出像本地环境这样的东西。在使用 centos 的 dockerbuild 上运行一些测试时,基本的命令结构是

FROM centos
RUN yum search epel
RUN yum install -y epel-release.noarch
RUN echo epel installed!

所以这在 docker build 中有效,并说它成功安装了它。 通过运行 apt-cache 而不是 yum,ubuntu 也可以这样说。但是回到 centos 虚拟机,它并没有说明 epel 已安装,因为在尝试运行

的命令时
yum remove epel-release.noarch

它说“没有要删除的包,但有一个名为...的包”。那么,如果 docker 能够成为多平台,为什么它实际上不能在我们所针对的本地平台/映像上创建这些更改? docker builds 模拟了在那个特定环境中会发生什么,但我似乎无法让它成为现实。如果它不能改变一个正在使用的系统的任何本地内容,这只会破坏我对 docker 的预期目的之一,除非我遗漏了一些东西。

如果有人有解决这个困境的办法,请告诉我。

EDIT +1=Ok 所以我昨天发现我想做的是查看和修改容器,这可以通过docker logs containerIDdocker run -t -i img /bin/sh 来完成,这将使我进入一个交互式外壳来制作容器在那里改变。不过,我想知道是否有办法让 docker 从容器内与本地环境通信。

【问题讨论】:

  • 你是如何运行yum remove 命令的?
  • yum 删除 epel-release.noarch。考虑到我是 root,我不应该添加任何其他内容......我昨天还了解到,我可以通过使用命令 docker run -t -i image /bin/sh 访问容器来查看容器工作。从那里我可以进一步修改容器内的构建。虽然这很棒,但我仍然想看看 docker 应用程序如何与本地环境交互,而不是在沙箱中。
  • “新”问题源于问自己这个问题; “哇,这些 docker 镜像确实很大。我希望有一种方法可以构建一个不需要不必要的文件的镜像。” “哦,嘿,dockerfile 可以从头开始构建,这实际上是一个空图像。” “该死,我无法运行我想要处理我移动到映像中的包的命令。我希望 docker 文件可以通过某种方式将这些依赖项传回到它自己的构建过程中。”
  • 我认为您应该发布一个新问题,而不是多次完全重新撰写此问题。
  • ...这正是新问题的用途。其他人可能有您之前问过的相同问题,因此将其留在这里让他们查找很有用。

标签: linux docker dockerfile


【解决方案1】:

所以,我认为您可能在很大程度上错过了 Docker 背后的要点,即管理有意与本地环境隔离的容器。这个想法是您创建可以在任何 Docker 主机上运行的容器化应用程序,而无需担心安装的特定操作系统或主机的配置。

也就是说,如果你真的想要这样做,有多种方法可以打破这种孤立。

如果您希望能够修改主机网络配置(包括接口地址、路由表、iptables 规则等),可以使用--net=host(可能还有--privileged)启动容器。

您可以使用-v 命令行选项将主机文件系统的一部分(或全部)作为容器内的卷。例如,docker run -v /:/host ... 会将主机文件系统的根暴露为容器内的/host

通常,Docker 容器有自己的 PID 命名空间,这意味着主机上的进程在容器内是不可见的。您可以使用 --pid=host 在主机 PID 命名空间中运行容器。

您可以结合这些不同的选项,根据您完成特定任务的需要提供对主机的尽可能多或尽可能少的访问权限。

如果您只想在主机上安装软件包,那么容器可能是不适合这项工作的工具。

【讨论】:

  • 对不起,我更新了帖子。答案在问题的新框架内无效。
  • 也许你应该发布一个新问题?
  • 不,这在我的书中浪费了空间。加上它仍然在做同样的事情只是不同的用法。
  • 虽然很有趣。我问的大部分问题后来都由我回答,我会因此得到认可吗?不是真的因为我不能很好地描述我的问题和解决方案。当涉及到这样的网站时,它不是理想的用户。
猜你喜欢
  • 2015-10-17
  • 2015-08-04
  • 2021-12-27
  • 2020-08-19
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 2019-11-26
  • 2016-11-10
相关资源
最近更新 更多