【问题标题】:Docker compose specifying image vs DockerfileDocker撰写指定图像与Dockerfile
【发布时间】:2017-08-21 04:33:56
【问题描述】:

我是 docker-compose 的新手,在阅读了文档后,我仍然有一些不清楚的事情出现在我的脑海中。

到目前为止,当我使用 docker 时,我将构建保存在以下目录树中:

builds:
    Service A:
        Dockerfile
        ServiceA.jar
    Service B:
        Dockerfile
        ServiceB.jar

所以当我想运行所有的东西时,我会使用一些 shell 脚本,直到我读到 docker-compose

我看到有两种创建和运行服务的方法(以复制文件的方式)

  1. 指定build: path/to/my/build/directory 并将其链接到 volumes: 这样它就可以看到实时代码并刷新服务
  2. 指定image:(例如java:8),然后像上面一样使用volumes:

我想了解的是使用docker-compose 的最佳做法是什么 在我深入研究之前,我应该为每个服务创建指定image(并替换为Dockerfile 内的FROM)还是应该指定构建文件夹和卷以保持实时代码更改的路径,以及如何volumes工作及其使用image标签时的用法

谢谢!

【问题讨论】:

  • 当你有一个图像可以满足你的需要时,你就使用图像。比如mysqlredisnginx。当您在其之上进行更改时,您将使用构建文件来根据您的需要自定义图像
  • 这几乎就是我一直在寻找的东西,关于卷,图像与构建有何不同?我也看到了以两种方式使用它的示例

标签: docker-compose


【解决方案1】:

在 Docker 中,您可以简单地将服务作为容器运行,并且可以将每个服务的状态放在一个卷中。这对您来说意味着:

  • 该服务作为运行时容器运行,该容器将从映像启动。
  • 服务的二进制文件位于映像中,服务本身将数据写入卷。
  • 可以从映像存储库中提取映像,也可以在目标环境中构建映像。
  • 可以使用命令 docker build 或 docker-compose build 部分构建图像。

在您的示例中,这意味着:

  1. 保留目录结构。
  2. 使用 docker-compose build 部分根据您的 Dockerfile 构建您的映像。
  3. 配置您的 Dockerfile 以将二进制文件放入映像中。
  4. 只需使用docker-compose up -d 启动整个堆栈,包括构建
  5. 您的二进制文件已更改?只需将整个堆栈替换为docker-compose up --build --force-recreate -d。此命令将重建所有图像并替换容器。

为什么不将二进制文件放在卷中:

  • 您将失去图像版本控制的优势。
  • 如果您替换二进制文件,则不能简单地回退到较旧的映像版本。
  • 您可以在部署新版本之前重新标记映像,并在发生错误时回退。
  • 您可以标记和保存正在运行的容器以进行回退和错误调查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多