如何安装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的三个步骤。
- 创建每个服务的dockerfile
- 创建一个docker-compose.yml文件以连接所有dockerfiles
- 运行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轻松地运行了所有的容器。这是一个简单的例子,用于运行三个容器;你可以想象一下,如果应用程序必须在数百个容器上启动,它将会有多有用。继续尝试并看看它的工作原理。