我一直在阅读和学习Docker,并试图正确选择要使用的Django设置。到目前为止,存在以下两种情况之一:
Docker撰写或Dockerfile
我知道Docker Compose中使用Dockerfiles,但我不确定将所有内容放在一个大Dockerfiles中,并使用多个来自不同图像的命令是否是一种好的做法?
我想使用几个不同的图像,包括:
uwsgi
nginx
postgres
redis
rabbitmq
celery with cron
请就使用Docker设置此类环境的最佳实践提供建议。
如果有帮助,我在Mac上,所以使用boot2docker。
我遇到了一些问题:
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。
答案是两者都不是。
如果将构建命令添加到项目的Docker Compose中,Docker Compose(此处称为Compose)将使用Dockerfile。yml。
您的Docker工作流程应该是为您希望创建的每个映像构建一个合适的Dockerfile
,然后使用compose使用build
命令组装映像。
您可以使用构建/路径/到/Dockerfiles/blah指定各个Dockerfiles的路径,其中blah的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编写
>
是一个用于定义和运行多容器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有什么区别?时的应答技巧和注意事项,需要的朋友参考一下