有没有办法将Docker镜像合并到一个容器中?
我现在有几个Dockerfiles。
一个是Cassandra 3.5, FROM cassandra:3.5
我也有Kafka的Dockerfile,但是t比较复杂。 它是FROM java:openjdk-8-fre
,它运行一个很长的命令来安装Kafka和Zookeeper。
最后,我有一个使用SBT编写的Scala应用程序。
对于那个Dockerfile,它是FROM broadinstitute/scala-baseimage
,它得到我的Java 8,斯卡拉2.11.7,STB 0.13.9,这是我所需要的。
也许,我不明白Docker是如何工作的,但是我的Scala程序拥有Cassandra和Kafka作为依赖关系,并且为了开发目的,我希望其他人能够简单地使用Dockerfile
克隆我的repo,然后能够使用Cassandra来构build它,卡夫卡,斯卡拉,爪哇和SBT都烘烤,以便他们可以编译源。 虽然我有很多问题。
我如何组合这些Dockerfiles? 我如何简单地用这些东西烘烤的环境?
由于冲突可能发生,您不能组合dockerfiles。 你想要做的是创build一个新的dockerfile或build立一个自定义图像。
TL; DR; 如果你当前的开发容器包含了你所需要和工作的所有工具,那么把它保存为一个图像,并将其保存到一个仓库中,并创build一个dockerfile,从该仓库中取出该仓库。
详细信息:构build自定义图像比使用公共图像创builddockerfile要容易得多,因为您可以将任何黑客和mod存储到图像中。 为此,请使用基本Linux映像(或broadinstitute / scala-baseimage)启动一个空白容器,安装所需的任何工具并configuration它们直到所有工作正常,然后将其作为映像保存(容器)。 从这个图像创build一个新的容器,并testing,看看你是否可以通过docker构build(或者你想要/build立它)上的代码。 如果它有效,比你有一个工作基础的图像,你可以上传到回购,以便其他人可以把它。
要使用公共图像构builddockerfile,您需要将所有hack,mods和setup设置在dockerfile本身上。 也就是说,你将需要把你使用的每一个命令行放到一个文本文件中,并减less任何黑客,mods和设置到命令行。 最后,你的dockerfile会自动创build一个镜像,你不需要把这个镜像存储到一个仓库中,所有你需要做的就是给其他人一个dockerfile,他们可以在自己的docker上旋转镜像。
请注意,一旦你有一个工作的dockerfile,你可以轻松地调整它,因为它会创build一个新的图像,每次你使用dockerfile。 使用自定义图像时,可能会遇到由于冲突而需要重build图像的问题。 例如,所有的工具都可以在openjdk上运行,直到你安装了一个不起作用的工具。 修复可能涉及到卸载openjdk并使用oracle,但是您为所有已安装的工具所做的所有configuration都已损坏。
是的,你可以把大量的软件放到一个Docker镜像中( GitLab这样做,包括Postgres和其他所有镜像),但是常规是正确的 – 这不是使用Docker的典型方法。
正如你所说,Cassandra和Kafka是你的Scala应用程序的依赖项 ,它们不是应用程序的一部分,所以它们不属于同一个图像。
必须使用Docker Compose编排许多容器才能添加额外的pipe理层,但它为您提供了更多的灵活性:
- 你的容器可以有不同的寿命,所以当你有一个新版本的应用程序要部署时,你只需要运行一个新的应用程序容器,你可以保持依赖运行;
- 您可以在任何环境中使用相同的应用程序映像,使用不同的configuration来进行依赖关系 – 例如,在dev中,您可以运行一个基本的Kafka容器,并且在许多节点上聚集它,您的应用程序容器是相同的;
- 您的依赖关系也可以被其他应用程序使用 – 所以多个消费者可以在不同的容器中运行,并且都使用相同的Kafka和Cassandra容器。
- 加上所有的可扩展性,日志等已经提到。
Docker不会合并图片,但是没有任何东西可以阻止你结合dockerfiles(如果有的话),并将它们滚动到需要构build的胖图片中。 然而,有时候这是有道理的,因为在一个容器中运行多个进程,大多数Docker教条都指向这个不太理想的地方,尤其是在微服务体系结构中(但是规则是否有被打破的权利?)
您不能将docker图像合并到一个容器中。 请参阅Moby问题中的详细讨论, 如何通过Dockerfile将多个图像合并为一个 。
对于你的情况,最好不要包括整个卡桑德拉和卡夫卡的图像。 该应用程序只需要Cassandra Scala驱动程序和Kafka Scala驱动程序。 容器只能包含驱动程序。
- 使用非共享内存和不可共享的cpus创buildDocker容器
- 我想在夜间运行testing,但是当我dockerize我的应用程序,我无法运行testing?
- 不使用docker-compose和django提供静态文件的Nginx(13:权限被拒绝)
- 当我在Docker中运行`docker run hello-world`时,连接的主机没有响应
- docker错误FATA 获取http:///var/run/docker.sock/v1.18/images/search?term =节点:拨号unix /var/run/docker.sock:没有这样的文件或目录
- docker集装箱上下文清单列表的使用是什么?
- docker不能build立/运行企业VPN连接
- 不能启动SonarQubedocker容器通过马拉松与端口映射
- 无法从我的Node.js应用程序连接到Cassandra Docker容器