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'
这告诉 Dockerdocker-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 .
和docker run myimage
,但在docker-compose
世界上,如果你想重建你的图像,你写docker-compose up --build
. 这告诉 Docker 再次启动容器,但重建它以获得最新的更改。
因此docker-compose
可以更轻松地使用多个容器。下次需要在后台启动这组容器时,可以这样做docker-compose up -d
;并阻止他们,你可以做docker-compose down
。