Aar*_*ier 334 development-environment docker boot2docker dockerfile docker-compose
我一直在阅读并了解Docker,我正在尝试正确选择要使用的Django设置.到目前为止,要么:
我明白这Dockerfiles是用过的Docker Compose,但我不确定将所有内容放在一个大型Dockerfile中,并FROM为不同的图像添加多个命令是不是很好?
我想使用几个不同的图像,包括:
uwsgi
nginx
postgres
redis
rabbitmq
celery with cron
Run Code Online (Sandbox Code Playgroud)
请告知使用Docker设置此类环境的最佳做法.
如果它有帮助,我在Mac上,所以使用boot2docker.
我遇到的一些问题:
kyo*_*kyo 459
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
Run Code Online (Sandbox Code Playgroud)
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: {}
Run Code Online (Sandbox Code Playgroud)
boo*_*yaa 206
答案都不是.
如果将build命令添加到项目中,Docker Compose(此处称为compose)将使用Dockerfile docker-compose.yml.
您的Docker工作流程应该是为Dockerfile您想要创建的每个图像构建一个合适的工作流程,然后使用compose使用该build命令组合图像.
您可以使用blah build /path/to/dockerfiles/blah所在/path/to/dockerfiles/blah的位置指定各个Dockerfiles的路径Dockerfile.
Pee*_*okk 87
在撰写文件描述了在其运行状态的容器,留下怎样的细节容器建立到Dockerfiles. http://deninet.com/blog/1587/docker-scratch-part-4-compose-and-volumes
使用Compose in development 定义应用程序时,可以使用此定义在不同的环境(如 CI,登台和生产)中运行应用程序. https://docs.docker.com/compose/production/
从1.11开始,Compose似乎也被视为生产安全,因为https://docs.docker.com/v1.11/compose/production/不再警告不要在生产中使用它,如https:// docs .docker.com/v1.10/compose/production / does.
Dan*_*iel 69
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: .
Run Code Online (Sandbox Code Playgroud)
请注意缩进,非常重要.另外,注意一个服务我正在抓取一个图像,但是对于另一个服务我告诉我docker-compose要查看当前目录内部以构建将用于第二个容器的图像.
然后,您要指定要在此容器上打开的所有不同端口.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Run Code Online (Sandbox Code Playgroud)
请注意破折号,yaml文件中的破折号是我们指定数组的方式.在这个例子中,我8081在我的本地机器上映射到8081容器上,如下所示:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Run Code Online (Sandbox Code Playgroud)
所以第一个端口是你的本地机器,另一个是容器上的端口,你也可以区分这两个端口以避免混淆,如下所示:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Run Code Online (Sandbox Code Playgroud)
通过docker-compose.yml像这样开发你的文件,它将在基本相同的网络上创建这些容器,并且他们可以自由访问,以他们喜欢的方式相互通信,并根据需要交换尽可能多的信息.
使用docker-compose我们创建两个容器时,我们不需要任何端口声明.
现在在我的例子中,我们需要在Nodejs应用程序中进行一些代码配置,如下所示:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Run Code Online (Sandbox Code Playgroud)
我使用上面的这个例子让你意识到除了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
});
Run Code Online (Sandbox Code Playgroud)
所以Docker将会看到Node应用正在寻找redis-server并将该连接重定向到这个正在运行的容器.
整个时间,Dockerfile唯一包含这个:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)
因此,在您必须运行docker run myimage以创建文件中的所有容器或服务的实例之前,您可以改为运行,docker-compose up而不必指定图像,因为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.
Ako*_*ert 30
"更好"是相对的.这一切都取决于您的需求.Docker compose用于编排多个容器.如果这些图像已经存在于docker注册表中,那么最好将它们列在compose文件中.如果必须从计算机上的文件构建这些图像或其他图像,则可以描述在Dockerfile中构建这些图像的过程.
我知道DockerFiles是在Docker Compose中使用的,但是我不确定将所有内容放在一个大型Dockerfile中,并为不同的图像添加多个FROM命令是不错的做法?
在单个dockerfile中使用多个FROM不是一个好主意,因为有一个提议要删除该功能.13026
例如,如果要将使用数据库并在计算机上具有应用程序文件的应用程序停靠,则可以将compose文件与dockerfile一起使用,如下所示
mysql:
image: mysql:5.7
volumes:
- ./db-data:/var/lib/mysql
environment:
- "MYSQL_ROOT_PASSWORD=secret"
- "MYSQL_DATABASE=homestead"
- "MYSQL_USER=homestead"
ports:
- "3307:3306"
app:
build:
context: ./path/to/Dockerfile
dockerfile: Dockerfile
volumes:
- ./:/app
working_dir: /app
Run Code Online (Sandbox Code Playgroud)
FROM php:7.1-fpm
RUN apt-get update && apt-get install -y libmcrypt-dev \
mysql-client libmagickwand-dev --no-install-recommends \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install pdo_mysql \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Run Code Online (Sandbox Code Playgroud)
Waq*_*med 17
Dockerfile和Docker Compose是Dockerland中的两个不同概念。当我们谈论Docker时,首先想到的是业务流程,操作系统级别的虚拟化,映像,容器等。我将尝试对它们进行如下解释:
映像: 映像是存储在受Docker信任的注册表中的一个不变的,可共享的文件。Docker映像由一系列只读层构建而成。每层代表在映像的Dockerfile中给出的一条指令。映像包含运行所需的所有二进制文件。
容器: 图像的实例称为容器。容器只是要由主机OS运行的可执行映像二进制文件。运行的图像是一个容器。
Dockerfile:
Dockerfile是一个文本文档,其中包含所有命令/构建指令,用户可以在命令行上调用以组装映像。这将另存为Dockerfile。(请注意小写的“ f”。)
Docker-Compose:
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务(容器)。然后,使用一个命令,就可以从配置中创建并启动所有服务。撰写文件将另存为docker-compose.yml。
Cso*_*mai 10
假设您是一家软件公司的经理,而您刚购买了一台全新的服务器。只是硬件。
想想Dockerfile作为一组指令你能告诉你的系统管理员如何安装这个全新的服务器上。例如:
/var/www)相比之下,可以考虑将docker-compose.yml一组说明告诉系统管理员,服务器如何与世界其他地方进行交互。例如,
(这不是一个精确的解释,但是足以作为开始。)
Dockerfiles are to build an image for example from a bare bone Ubuntu, you can add mysql called mySQL on one image and mywordpress on a second image called mywordpress.
Compose YAML files are to take these images and run them cohesively.
For example, if you have in your docker-compose.yml file a service called db:
services:
db:
image: mySQL --- image that you built.
Run Code Online (Sandbox Code Playgroud)
and a service called wordpress such as:
wordpress:
image: mywordpress
Run Code Online (Sandbox Code Playgroud)
then inside the mywordpress container you can use db to connect to your mySQL container. This magic is possible because your docker host create a network bridge (network overlay).
| 归档时间: |
|
| 查看次数: |
152896 次 |
| 最近记录: |