【问题标题】:Curious about the use of docker-compose and dockerfile好奇docker-compose和dockerfile的使用
【发布时间】:2021-08-19 08:57:10
【问题描述】:

我正在学习 docker。

docker-compose 被称为一个角色,可以方便地将多个容器作为一个脚本运行。

首先,既然 Dockerfile 只处理一个容器,那么认为 Docker Compose 向后兼容 Dockerfile 是否正确?

我以为 docker compose 可以涵盖所有内容,但我看到 docker compose 和 docker files 一起使用。

我们以spring boot为例。

我可以只使用一个 docker-compose 来运行应用程序所需的 db 容器,构建应用程序,检查正在使用的端口,然后运行 ​​jar 文件吗?

还是我必须将 dockerfils 和角色分开并使用两者?

【问题讨论】:

    标签: spring spring-boot docker docker-compose dockerfile


    【解决方案1】:

    在使用 Docker 时,有两个概念:Image 和 Container。

    图像就像存储在一个文件中的迷你操作系统,该文件是专门为我们的应用程序而构建的。可以把它想象成一个自定义操作系统,当您的计算机关闭时,它位于您的硬盘上。

    容器正在运行您的图像实例。

    想象一下,您有一个共享硬盘(如果您是老派,甚至是 CD/DVD),它的操作系统可以在多台机器上运行。磁盘上的文件是“镜像”,机器上运行的文件是“容器”。

    这就是 Docker 的工作方式,机器上的文件称为镜像,而这些文件的运行实例称为容器。图像也可以上传和共享,供其他用户下载并在他们的机器上运行。

    这将我们带到 Docker 与 Docker Compose。

    Docker 是管理(创建、存储或共享)图像和运行容器的底层技术。

    我们提供 Dockerfile 来告诉 Docker 如何创建我们的镜像。比如我们说:从 Python 3 基础镜像开始,然后安装这些需求,然后创建这些文件夹,然后切换到这个用户,等等……(我把实际步骤简化了,但这只是为了解释点)。

    完成后,我们可以使用 Docker 创建一个镜像,通过运行 docker build .. 如果你运行它,Docker 将执行我们的 Dockerfile 中的每个步骤,并将结果作为一个镜像存储在系统上。

    构建映像后,您可以使用以下方式手动运行它:

    docker 运行

    但是,如果您需要设置卷,则需要像这样运行它们:

    docker run -v /path/to/vol:/path/to/vol -p 8000:8000

    应用程序通常需要多个图像才能运行。例如,您可能有一个应用程序和一个数据库,您可能还需要在它们之间设置网络和共享卷。

    因此,每次要启动服务时,您都需要为要运行的每个容器编写具有适当配置和 ID 的上述命令...

    如您所料,这可能会变得复杂、乏味且难以快速管理...

    这就是 Docker Compose 的用武之地...

    Docker Compose 是一个用于定义 Docker 如何在 yaml 文件中运行我们的图像的工具,该文件可以与我们的代码一起存储并重复使用。

    所以,如果我们需要将我们的应用镜像作为容器运行,共享端口 8000 并映射一个卷,我们可以这样做:

    服务: 应用程序: 建造: 语境: 。 端口: - 8000:8000 卷: - 应用程序/:/应用程序 然后,每次我们需要启动我们的应用程序时,我们只需运行 docker-compose up,Docker Compose 就会在后台处理所有复杂的 docker 命令。

    所以基本上,Docker Compose 的目的是配置我们正在运行的服务应该如何协同工作以服务我们的应用程序。

    当我们运行 docker-compose build 时,Docker Compose 将运行所有必要的 docker build 命令,以构建我们项目所需的所有镜像并适当地标记它们以在系统中跟踪它们。

    总之,Docker 是用于创建镜像并将它们作为容器运行的底层技术,而 Docker Compose 是一种工具,用于配置 Docker 应如何运行多个容器来服务于我们的应用程序。

    我希望这是有道理的?

    【讨论】:

      【解决方案2】:

      我建议您深入了解 docker composeDifference between Docker Compose Vs Dockerfile 阅读的内容。

      我报告了上述文章中解释的部分内容:

      Dockerfile 是一个简单的文本文件,其中包含用户可以调用以组装图像的命令,而 Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。

      Docker Compose 在 docker-compose.yml 中定义构成应用程序的服务,以便它们可以在隔离环境中一起运行。只需运行 docker-compose up 即可在一个命令中运行应用程序。如果将构建命令添加到项目的 docker-compose.yml 中,Docker compose 会使用 Dockerfile。您的 Docker 工作流程应该是为您希望创建的每个图像构建一个合适的 Dockerfile,然后使用 compose 使用 build 命令组装图像。

      关于您的问题,我回答您说 docker compose 非常灵活,您可以将 组合逻辑 分割成多个 yaml 文件,并根据需要通过 docker compose 命令行进行组合。

      这里是一个例子:

      
      # Build the docker infrastructure
      
      docker-compose \
        -f network.yaml \
        -f database.yaml \
        -f application.yaml
        build
      
      # Run the application
      
      docker-compose \
        -f application.yaml
        up
      
      

      【讨论】:

        【解决方案3】:

        回答您关于 Spring Boot 应用程序的问题。只要您知道顺序和依赖关系,您就可以单独通过 Compose 构建完整的应用程序,但随后会出现问题,您是否正确使用了 compose 功能?正如@Antonio Petricca 已经为撰写给出了很好的答案

        关于撰写文件和 DockerFile 问题:这取决于您如何编写撰写文件。从技术上讲,两者都是不同的。 简而言之:

        1- Compose and DockerFile are two different things
        2- compose can use multiple modular files even DockerFile and that is why it is so popular, you can break logic into multiple modules then use compose to build it. it also help you debug and iterate faster.  
        

        希望它回答你的疑问。

        【讨论】:

        • 不完美的类比:Dockerfile 有点像 YourApplication.java -- 它说明了构建时可重用图像的内容 -- 但 docker-compose.yml 就像 build.gradle -- 它说需要什么额外的标准。您可以在没有 Gradle 的情况下使用 Java,或者在没有 Compose 的情况下使用 Docker,构建/编排工具本身不足以包含应用程序的内容。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 2022-08-15
        • 2019-11-21
        相关资源
        最近更新 更多