首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Docker Compose和Dockerfile有什么不同

Docker Compose和Dockerfile有什么不同
EN

Stack Overflow用户
提问于 2015-04-07 05:36:44
回答 11查看 244.6K关注 0票数 524

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

Docker ComposeDockerfile

我知道Docker Compose中使用了Dockerfiles,但我不确定将所有内容都放在一个大Dockerfile文件中,并为不同的镜像使用多个FROM命令是否是一种好的做法?

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

代码语言:javascript
复制
uwsgi
nginx
postgres
redis
rabbitmq
celery with cron

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

如果有帮助的话,我使用的是Mac,所以使用boot2docker

我遇到了一些问题:

  1. Docker Compose与Python3
  2. 不兼容我想将我的项目容器化,所以如果一个大的Docker文件不理想,我觉得我需要使用Docker Compose
  3. 分解它我可以使项目与Py2和Py3兼容,所以我倾向于Docker
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2015-04-07 16:28:58

答案是两者都不是。

如果您将构建命令添加到项目的docker-compose.yml中,Docker Compose (这里称为compose)将使用Docker文件。

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

您可以使用build /path/to/dockerfiles/blah指定单个Dockerfiles文件的路径,其中/path/to/dockerfiles/blah是blah的Dockerfile所在的位置。

票数 303
EN

Stack Overflow用户

发布于 2017-08-07 22:28:17

Dockerfile

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

示例:Dockerfile

代码语言:javascript
复制
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 Compose

Docker Compose

Docker applications.是一个定义和运行多容器

  • 的工具

  • 定义了在docker-compose.yml中构成应用程序的服务,以便这些服务可以在独立的environment.

中一起运行

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

  • 应用程序

例如,docker-compose.yml

代码语言:javascript
复制
version: "3"
services:
  web:
    build: .
    ports:
    - '5000:5000'
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
    volumes:
      logvolume01: {}
票数 712
EN

Stack Overflow用户

发布于 2018-12-21 22:37:54

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文件,您可能希望像这样开始第一行:

代码语言:javascript
复制
version: '3'

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

代码语言:javascript
复制
version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .

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

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

代码语言:javascript
复制
version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .
    ports:
      -

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

代码语言:javascript
复制
version: '3'
services: 
  redis-server: 
    image: 'redis'
  node-app:
    build: .
    ports:
      - "8081:8081"

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

代码语言:javascript
复制
version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    build: .
    ports:
      - "4001:8081"

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

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

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

代码语言:javascript
复制
const express = require('express');
const redis = require('redis');

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

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

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

代码语言:javascript
复制
const express = require('express');
const redis = require('redis');

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

因此,Docker将看到Node应用程序正在查找redis-server,并将该连接重定向到正在运行的容器。

在整个过程中,Dockerfile只包含以下内容:

代码语言:javascript
复制
FROM node:alpine

WORKDIR '/app'

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

CMD ["npm", "start"]

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

docker-compose.yml之前,我们必须处理docker build .docker run myimage这两个独立的命令,但在docker-compose世界中,如果您想要重建映像,则需要编写docker-compose up --build。这告诉Docker重新启动容器,但重新构建它以获取最新的更改。

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

票数 170
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29480099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档