当前位置: 首页 > 知识库问答 >
问题:

Docker Compose与Dockerfile有什么区别

岳茂
2023-03-14

我一直在阅读和学习Docker,并试图正确选择要使用的Django设置。到目前为止,存在以下两种情况之一:

Docker撰写或Dockerfile

我知道Docker Compose中使用Dockerfiles,但我不确定将所有内容放在一个大Dockerfiles中,并使用多个来自不同图像的命令是否是一种好的做法?

我想使用几个不同的图像,包括:

uwsgi
nginx
postgres
redis
rabbitmq
celery with cron

请就使用Docker设置此类环境的最佳实践提供建议。

如果有帮助,我在Mac上,所以使用boot2docker。

我遇到了一些问题:

  1. Docker Compose与Python3不兼容
  2. 我想将我的项目容器化,所以如果一个大型Dockerfile不理想,那么我觉得我需要使用Docker Compose将其分解
  3. 我可以让项目Py2

共有3个答案

董哲
2023-03-14

docker compose的存在使您不得不使用docker cli编写大量命令。

docker compose还可以轻松地同时启动多个容器,并通过某种形式的网络将它们自动连接在一起。

docker compose的目的是充当docker cli,但可以更快地发出多个命令。

要使用docker compose,需要将之前运行的命令编码为docker compose。yml文件。

您不仅要将它们复制粘贴到yaml文件中,还有一种特殊的语法。

创建后,您必须将其提供给docker compose cli,然后由cli解析文件并使用我们指定的正确配置创建所有不同的容器。

因此,您将有单独的容器,例如,一个是redis server,另一个是node app,您希望使用当前目录中的Dockerfile创建该容器。

此外,在创建容器之后,您可以将容器中的某个端口映射到本地计算机,以访问其中运行的所有内容。

因此,对于您的docker-compose.yml文件,您希望像这样开始第一行:

version: '3'

这告诉Docker您要使用的docker-compose版本。之后,您必须添加:

version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .

请注意缩进,非常重要。此外,请注意,对于一个服务,我正在获取一个图像,但对于另一个服务,我告诉docker-compose查看当前目录以构建将用于第二个容器的图像。

然后,您需要指定要在此容器上打开的所有不同端口。

version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .
    ports:
      -

请注意破折号,yaml文件中的破折号是我们指定数组的方式。在本例中,我将本地机器上的8081映射到容器上的8081,如下所示:

version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .
    ports:
      - "8081:8081"

因此,第一个端口是您的本地计算机,另一个是容器上的端口,您还可以区分这两个端口,以避免这样的混淆:

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    build: .
    ports:
      - "4001:8081"

通过开发docker compose。像这样的yml文件,它将在本质上相同的网络上创建这些容器,并且它们将可以自由访问,以任何方式彼此通信,并根据需要交换尽可能多的信息。

当使用docker compose创建这两个容器时,我们不需要任何端口声明。

现在在我的示例中,我们需要在Nodejs应用程序中进行一些代码配置,如下所示:

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient({
  host: 'redis-server'
});

我使用上面的这个例子是为了让您意识到,除了可能特定于您的项目的docker-compose.yml文件之外,您还必须进行一些特定的配置。

现在,如果您发现自己正在使用Nodejs应用程序和redis,您需要确保知道Nodejs使用的默认端口,因此我将添加以下内容:

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient({
  host: 'redis-server',
  port: 6379
});

所以Docker将看到节点应用程序正在查找redis服务器,并将该连接重定向到这个正在运行的容器。

一直以来,Dockerfile只包含以下内容:

FROM node:alpine

WORKDIR '/app'

COPY /package.json ./
RUN npm install
COPY . .

CMD ["npm", "start"]

因此,在您必须运行docker run myimage来创建文件中所有容器或服务的实例之前,您可以运行docker compose up,而不必指定图像,因为docker将在当前工作目录中查找docker compose。yml文件内部。

在docker compose之前。yml,我们必须处理docker build的两个独立命令和docker运行myimage,但在docker compose世界中,如果要重建图像,请编写docker compose up—build。这会告诉Docker再次启动容器,但要重新构建它以获得最新的更改。

因此,docker compose使处理多个容器变得更加容易。下次需要在后台启动这组容器时,可以执行docker compose up-d操作;要阻止它们,您可以执行docker compose down。

慕俊语
2023-03-14

答案是两者都不是。

如果将构建命令添加到项目的Docker Compose中,Docker Compose(此处称为Compose)将使用Dockerfile。yml。

您的Docker工作流程应该是为您希望创建的每个映像构建一个合适的Dockerfile,然后使用compose使用build命令组装映像。

您可以使用构建/路径/到/Dockerfiles/blah指定各个Dockerfiles的路径,其中blah的Dockerfile位于其中。

熊烨
2023-03-14

Dockerfile是一个简单的文本文件,其中包含用户可以调用以组装图像的命令。

示例,Dockerfile

FROM ubuntu:latest
MAINTAINER john doe 

RUN apt-get update
RUN apt-get install -y python python-pip wget
RUN pip install Flask

ADD hello.py /home/hello.py

WORKDIR /home

Docker编写

>

  • 是一个用于定义和运行多容器Docker应用程序的工具。

    在docker compose中定义组成应用程序的服务。yml,因此它们可以在隔离的环境中一起运行。

    只需运行docker-compose up即可在一个命令中运行应用程序

    例如,docker compose。yml公司

    version: "3"
    services:
      web:
        build: .
        ports:
        - '5000:5000'
        volumes:
        - .:/code
        - logvolume01:/var/log
        links:
        - redis
      redis:
        image: redis
        volumes:
          logvolume01: {}
    

  •  类似资料:
    • 问题内容: 在Dockerfiles中,有两个与我相似的命令:和。但是我想它们之间有一个(细微的?)差异- 否则对于同一件事有两个命令是没有任何意义的。 文档说明 CMD的主要目的是为执行中的容器提供默认值。 和为: ENTRYPOINT帮助您配置可以作为可执行文件运行的容器。 那么,这两个命令有什么区别? 问题答案: Docker有一个默认入口点,但没有默认命令。 当您像这样运行docker时:

    • 在Dockerfiles中有两个与我类似的命令:和。但我猜有一个(微妙?)它们之间的差异--否则,对同一件事使用两个命令是没有任何意义的。 文档中的状态为 CMD的主要目的是为正在执行的容器提供默认值。 入口点帮助您配置可以作为可执行文件运行的容器。 那么,这两个命令有什么区别呢?

    • 问题内容: Dockerfile中的和命令之间有什么区别,何时可以在另一个之上使用? COPY指令将从以下位置复制新文件并将其添加到容器的文件系统中: ADD指令将从中复制新文件并将其添加到位于path的容器的文件系统中。 问题答案: 您应该查看和文档以获取有关其行为的更详细描述,但简而言之,主要区别在于可以做的还不止: 允许成为网址 参考下面的评论, 文档指出: 如果是以公认的压缩格式(身份,g

    • Dockerfile中的和命令之间有什么区别?什么时候我会使用一个命令而不是另一个命令? COPY指令将从复制新文件,并将它们添加到路径的容器文件系统中 ADD指令将从复制新文件,并将它们添加到路径的容器文件系统中。

    • 本文向大家介绍Mock 与 Stub 有什么区别?相关面试题,主要包含被问及Mock 与 Stub 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 Stub 一个有助于运行测试的虚拟对象。 在某些可以硬编码的条件下提供固定的行为。 从未测试stub的所有其他行为。 例如,对于空栈,你可以创建一个对于 empty() 方法只返回 true 的 stub。因此这并不关心栈中是否存在元素。 模拟

    • 本文向大家介绍innerHTML与outerHTML有什么区别?相关面试题,主要包含被问及innerHTML与outerHTML有什么区别?时的应答技巧和注意事项,需要的朋友参考一下