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-compose up
而不必指定映像,因为Docker会在当前工作目录中查找并寻找一个docker-compose.yml
里面的文件。
以前docker-compose.yml
,我们不得不处理docker build .
and的两个单独的命令docker run myimage
,但实际上,docker-compose
如果您想重建自己编写的图像,就必须这样做docker-compose up --build
。这告诉Docker重新启动容器,但要对其进行重建以获取最新更改。
因此docker-compose
,使用多个容器变得更加容易。下次需要在后台启动这组容器时,可以执行此操作,docker-compose up -d
并在停止它们时可以执行docker-compose down
。