如何安装Docker Compose并进行设置?

想知道Docker Compose是什么吗?

Docker是DevOps世界中最受欢迎的容器化工具。但是,什么是Docker Compose?

Docker Compose用于使用YAML文件运行具有多个容器的应用程序。

有几种情况下,Docker应用程序必须为不同的技术栈运行多个容器。现在,为每个容器构建、运行、连接单独的Dockerfile可能是一项困难的任务;这就是docker-compose帮助您的地方。

使用一个简单明了的docker-compose.yml文件,您可以通过运行一个命令来构建、连接和启动所有容器。这对于生产中的企业应用程序非常有用,其中多个应用程序在容器内运行。通过轻松地在Docker容器中运行数百个应用程序,可以节省大量时间。

安装Docker Compose

在安装compose之前,您的系统上应该已经有Docker。

运行下面的命令来安装docker-compose。

yaoweibin@yaoweibin:/home/yaoweibin$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

[sudo] password for yaoweibin:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

Dload  Upload   Total   Spent    Left  Speed

100   617    0   617    0     0   1209      0 --:--:-- --:--:-- --:--:--  1209

100 11.1M  100 11.1M    0     0   348k      0  0:00:32  0:00:32 --:--:--  476k

运行下面的命令来设置文件权限。

yaoweibin@yaoweibin:/home/yaoweibin$ sudo chmod +x /usr/local/bin/docker-compose

检查是否已正确安装,它应该返回docker-compose的版本。

yaoweibin@yaoweibin:/home/yaoweibin$ docker-compose --version

docker-compose version 1.23.1, build b02f1306

以下是您可以与docker-compose一起使用的命令列表。

yaoweibin@yaoweibin:/home/yaoweibin$ docker-compose

使用Docker定义并运行多容器应用程序。

用法:

docker-compose [-f …] [options] [COMMAND] [ARGS…]

docker-compose -h|–help

选项:

-f, –file FILE             指定替代的Compose文件

(默认值:docker-compose.yml)

-p, –project-name NAME     指定替代的项目名称

(默认值:目录名称)

–verbose                   显示更多输出

–log-level LEVEL           设置日志级别(DEBUG,INFO,WARNING,ERROR,CRITICAL)

–no-ansi                   不打印ANSI控制字符

-v, –version               打印版本并退出

-H, –host HOST             要连接的守护程序套接字

–tls                       使用TLS;由–tlsverify隐含

–tlscacert CA_PATH         只信任由此CA签名的证书

–tlscert CLIENT_CERT_PATH  TLS证书文件的路径

–tlskey TLS_KEY_PATH       TLS密钥文件的路径

–tlsverify                 使用TLS并验证远程

–skip-hostname-check       不检查守护程序的主机名与客户端证书中指定的名称是否一致

–project-directory PATH    指定替代工作目录

(默认值:Compose文件的路径)

–compatibility             如果设置,Compose将尝试将v3文件中的部署键转换为其非Swarm等效项

命令:

build              构建或重新构建服务

bundle             从Compose文件生成Docker捆绑包

config             验证并查看Compose文件

create             创建服务

down               停止并删除容器、网络、镜像和卷

events             从容器接收实时事件

exec               在运行中的容器中执行命令

help               获取命令的帮助信息

images             列出镜像

kill               终止容器

logs               查看容器的输出

pause              暂停服务

port               打印端口绑定的公共端口

ps                 列出容器

pull               拉取服务镜像

push               推送服务镜像

restart            重启服务

rm                 移除已停止的容器

run                运行一次性命令

scale              设置服务的容器数量

start              启动服务

stop               停止服务

top                显示正在运行的进程

unpause            解除暂停服务

up                 创建并启动容器

version            显示Docker-Compose版本信息

Docker Compose文件

以下是一个执行所有操作的样本docker-compose文件。

version: '3'

services:

web:

build: .

ports:

- "5000:5000"

redis:

image: "redis:alpine"

此文件的第一行指定正在使用的版本。此数字取决于您系统上安装的Docker引擎版本。我安装了Docker 18.09.6,属于docker-compose的第3个版本。在此处查看更多版本的详细信息 – https://docs.docker.com/compose/compose-file/compose-versioning/

此docker文件正在运行两个服务/应用程序,即web和Redis。web服务通过一个dockerfile构建,并在默认的flask Web服务器端口5000上运行。Redis服务通过从docker hub注册表拉取Redis镜像来运行。

要执行docker-compose.yml文件,您需要运行一个非常简单的命令:docker-compose up

Docker Compose工作流程

以下是使用docker-compose的三个步骤。

  1. 创建每个服务的dockerfile
  2. 创建一个docker-compose.yml文件以连接所有dockerfiles
  3. 运行docker-compose up命令启动系统

让我以前面看到的示例docker-compose文件为例,展示如何创建项目结构。

my-app

|—–web

|———Dockerfile

|—–redis

|docker-compose.yml

my-app是我的主项目目录。此目录包含web和Redis服务目录以及docker-compose YAML文件。Web服务的Dockerfile存在于web目录中。由于Redis服务直接从docker hub拉取,因此在Redis目录中不需要dockerfile。这就是docker-compose的工作流程。

使用Docker Compose容器化MEAN堆栈应用程序

既然你已经了解了基本概念,让我演示一下如何使用docker-compose将MEAN堆栈应用程序容器化。

MEAN代表MongoDB、Express、Angular和Node.js。同时使用这些服务的应用程序也称为MEAN/全栈应用程序。

对于这个演示,我们将运行三个docker容器:

容器1 – Angular
容器2 – NodeJS和ExpressJS
容器3 – MongoDB

在这里下载完整的应用程序(未经过生产测试)。

这是运行这三个容器的docker-compose.yml文件的样子:

version: ‘3'

services:

angular:

build: angular-client

ports:

– “4200:4200”

volumes:

– ./angular-client/:/var/www/app

express:

build: express-server

ports:

– “3000:3000”

volumes:

– ./express-server/:/var/www/app

links:

– database

database:

image: mongo

ports:

– “27017:27017”

第一行指定了使用的docker-compose版本
我们运行三个服务 – angular、express和database
将使用dockerfile构建Angular服务。它将在端口4200上运行,并且应用程序卷是/var/www/app
将使用dockerfile构建Express服务。Express服务器将在端口3000上运行,并且卷是/var/www/app
数据库服务将从dockerhub拉取MongoDB镜像,并在端口27017上启动

在主目录中提取项目并进入angular-client目录。

yaoweibin@yaoweibin:~$ cd mean

yaoweibin@yaoweibin:~/mean$ cd angular-client

如果系统上没有安装node包管理器(npm),则运行以下命令(如果已安装则忽略)。
在angular-client目录中运行npm install。
现在转到express目录并运行npm install。

yaoweibin@yaoweibin:~/mean/angular-client$ cd ..

yaoweibin@yaoweibin:~/mean$ cd express-server/

yaoweibin@yaoweibin:~/mean/express-server$ npm install

现在一切都准备好了,是时候运行docker-compose.yml文件了,它将启动所有的docker容器并运行MEAN堆栈应用程序。
yaoweibin@yaoweibin:~/mean/express-server$ cd ..

yaoweibin@yaoweibin:~/mean$ docker-compose up

正在创建网络”mean_default”与默认驱动程序

正在构建angular

步骤1/8 : FROM node:8

8: 从library/node中获取

a4d8138d0f6b: 已完全解析并标记

dbdc36973392: 已完全解析并标记

f59d6d019dd5: 已完全解析并标记

aaef3e026258: 已完全解析并标记

6e454d3b6c28: 已完全解析并标记

c717a7c205aa: 已完全解析并标记

37add8e5ac11: 已完全解析并标记

0314ab675d31: 已完全解析并标记

012886364728: 已完全解析并标记

摘要: sha256:310db2abcff097ef44af205d81833282a6d5471002a1b59d7b7459a74152c856

状态: 已下载较新的映像,node:8

—> 8e45c884a32e

步骤2/8 : RUN mkdir -p /var/www/app

—> 正在运行中的容器c70a0cab7994

正在删除中间容器c70a0cab7994

—> 001c5e840b24

步骤3/8 : WORKDIR /var/www/app

—> 正在运行中的容器622ebdc41b2f

正在删除中间容器622ebdc41b2f

—> baa2e2347259

步骤4/8 : COPY package.json /var/www/app

—> 5b97543befab

步骤5/8 : RUN npm install

—> 正在运行中的容器73e3d8b7a701

> [email protected] install /var/www/app/node_modules/uws

> node-gyp rebuild > build_log.txt 2>&1 || exit 0

> [email protected] install /var/www/app/node_modules/node-sass

> node scripts/install.js

正在从https://github.com/sass/node-sass/releases/download/v4.12.0/linux-x64-57_binding.node下载二进制文件

下载完成

将二进制文件保存到/var/www/app/node_modules/node-sass/vendor/linux-x64-57/binding.node

将二进制文件缓存到/root/.npm/node-sass/4.12.0/linux-x64-57_binding.node

> [email protected] postinstall /var/www/app/node_modules/core-js

> node scripts/postinstall || echo “ignore”

该项目需要您的帮助!请考虑在Open Collective或Patreon上支持核心-js:

https://opencollective.com/core-js

https://www.patreon.com/zloirock

> [email protected] postinstall /var/www/app/node_modules/webpack/node_modules/uglifyjs-webpack-plugin

> node lib/post_install.js

> [email protected] postinstall /var/www/app/node_modules/node-sass

> node scripts/build.js

在/var/www/app/node_modules/node-sass/vendor/linux-x64-57/binding.node找到二进制文件

正在测试二进制文件

二进制文件正常

从1329个贡献者处添加了1606个软件包,并对15092个软件包进行了审核,用时112.427秒

正在删除中间容器73e3d8b7a701

—> 55790d2fae93

步骤6/8 : COPY . /var/www/app

—> 61537aa487f4

步骤7/8 : EXPOSE 4200

—> 正在运行中的容器632eedc35a45

正在删除中间容器632eedc35a45

—> 51e75b0e2ebe

步骤8/8 : CMD [“npm”, “start”]

—> 正在运行中的容器36bbb12a0d38

正在删除中间容器36bbb12a0d38

—> 9f8d61db600c

成功构建了9f8d61db600c

成功标记了mean_angular:latest

正在拉取数据库(mongo:)…

最新: 正在从library/mongo中获取

35b42117c431: 已完全

打开浏览器并检查https://localhost:4200,你的应用程序将已经运行。

打开https://localhost:3000检查express服务器是否正在运行。

此外,你可以运行docker images命令查看docker中存在哪些镜像。

yaoweibin@yaoweibin:~/mean$ docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE

mean_express               latest              35dcb3df9806        14 hours ago        923MB

mean_angular               latest              9f8d61db600c        14 hours ago        1.29GB

node                       8                   8e45c884a32e        9 days ago          895MB

mongo                      latest              785c65f61380        2 weeks ago         412MB

运行下面的命令查看在docker中运行的容器。

yaoweibin@yaoweibin:~/mean$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES

681c9c34bee2        mean_express        "docker-entrypoint.s…"   14 hours ago        Up 14 hours         0.0.0.0:3000->3000/tcp     mean_express_1_574f07b045fc

f74b56905249        mongo               "docker-entrypoint.s…"   14 hours ago        Up 14 hours         0.0.0.0:27017->27017/tcp   mean_database_1_ccc5c677e00b

260ef1e52dab        mean_angular        "docker-entrypoint.s…"   14 hours ago        Up 14 hours         0.0.0.0:4200->4200/tcp     mean_angular_1_f257e2233ef1

现在,所有三个docker容器都已经运行。

Docker-compose轻松地运行了所有的容器。这是一个简单的例子,用于运行三个容器;你可以想象一下,如果应用程序必须在数百个容器上启动,它将会有多有用。继续尝试并看看它的工作原理。

类似文章