我一直在阅读和学习Docker,并且正在尝试正确地选择要使用的Django设置。到目前为止,有以下两种情况:
我知道Docker Compose
中使用了Dockerfiles
,但我不确定将所有内容都放在一个大Dockerfile文件中,并为不同的镜像使用多个FROM
命令是否是一种好的做法?
我想使用几个不同的图像,包括:
uwsgi
nginx
postgres
redis
rabbitmq
celery with cron
请建议使用Docker设置此类环境的最佳实践。
如果有帮助的话,我使用的是Mac,所以使用boot2docker。
我遇到了一些问题:
发布于 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
所在的位置。
发布于 2017-08-07 22:28:17
Dockerfile
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 Compose
Docker Compose
Docker applications.是一个定义和运行多容器
docker-compose.yml
中构成应用程序的服务,以便这些服务可以在独立的environment.中一起运行
只需运行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: {}
发布于 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
文件,您可能希望像这样开始第一行:
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将看到Node应用程序正在查找redis-server
,并将该连接重定向到正在运行的容器。
在整个过程中,Dockerfile
只包含以下内容:
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
。
https://stackoverflow.com/questions/29480099
复制相似问题