Docker + fig / compose + nginx + node.js + mysql + redis
Posted
技术标签:
【中文标题】Docker + fig / compose + nginx + node.js + mysql + redis【英文标题】: 【发布时间】:2015-04-30 04:40:40 【问题描述】:我正在尝试在 Docker 多个容器上设置 Node.js 应用程序。 我的应用程序目前在一个 Ubuntu DO 液滴上并使用:
我需要对不同的部分进行 dockerize,显然每个容器都有一个,然后使用 Docker-Compose(以前称为 Fig)来简单地描述不同的容器并设置它们之间的链接。 我对多容器方法不清楚。 一个用于 nginx 一个用于 Node.js 和我的 express 应用程序 一个用于 MySql 一个用于 Redis
Docker-compose.yml 会是什么样子? 我猜 nginx、mysql 和 redis 将是未经修改的官方图像? 虽然 node.js 将具有指向 Dockerfile 的构建指令,但会注意到它基于 node.js 官方图像以及配置说明? 例如,我将需要配置/提供 mysql 和 redis,这是否意味着每个都需要与自己的 Dockerfile 分开?
容器之间的链接方式是什么? 使用卷将文件复制到其中, 设置端口,调整hosts文件将some.domain.com映射到nginx ip?
然后我需要在全局范围内安装一些 npm 包,例如 nodemon 和 PM2 并设置一些 cron 作业...(在 Node.js 容器上?)
这是初稿,如果能帮助我更好地理解这个新设置,我将不胜感激:
Docker-compose.yml
nginx:
image: nginx
links:
- "node"
node:
build: .
volumes:
- "app:/src/app"
ports:
- "3030:3000"
links:
- "db:mysql"
db:
image: mysql:5.6
environment:
- MYSQL_ROOT_PASSWORD=mypassword
Dockerfile
FROM node:0.12
RUN mkdir /src
RUN npm install nodemon pm2 -g
WORKDIR /src
ADD app/package.json /src/package.json
RUN npm install
ADD app/nodemon.json /src/nodemon.json
EXPOSE 3000
CMD npm start
我使用这个simple project 作为基础,虽然我的应用需要
【问题讨论】:
【参考方案1】:我认为您不需要将 nginx 和 nodejs 拆分为不同的实例。目前我也在 docker 上设置 nodejs,所以很快就会回到这里并尝试对你的问题做出复杂的回应。
在那里你可以找到一篇关于在 docker http://blog.stxnext.com/posts/2015/01/development-with-docker-and-fig/ 上设置类似架构的有用文章,django / nodejs 的区别应该不是问题。
【讨论】:
谢谢达米安。关于同一容器上的 nginx 和 node.js - 那么您将如何在 nginx 的上游配置中添加更多“框”?如果我理解正确-您需要将其分开以允许可扩展的结构...浏览您的文章-谢谢!我期待着您详细的回复... Ajar 我们还在同一个容器中运行 Nginx 和 Node.JS,并通过 AWS ELB 进行扩展 嘿@Shimon :) 这很有趣——如果你使用 Amazon 的 Elastic Load Balancing 进行扩展(使用自动扩展?)——为什么在你旋转的每个容器中都需要 nginx 和 Node.js向上?拥有多个 nginx 实例的本质是什么?是为静态文件服务吗?你有 S3...感谢您的评论。 我们正在使用具有 2 个 CPU 内核的 aws c3.large 实例类型。所以我们运行两个 Node.JS 进程和 Nginx 来对它们进行负载均衡 党的路线是您应该将不同的应用程序拆分到单独的容器中。除非它们需要共享文件,否则将它们放在同一个文件中实际上并不会获得太多收益,而 Node 和 nginx 并不真正需要这样做。但是无论如何您都希望单独运行它们,因为迟早您会希望运行两三个 Nodejs 实例,而这只需要调整您的上游并稍微不同地调用 docker-compose。【参考方案2】:在配置docker-compose部分之前,必须先确定系统的架构。
你拥有的部分 -
MySQL 可执行版本 X 监听端口 3306 MySQL 数据存储在磁盘上 Redis 可执行版本 Y 监听端口 6379 Redis 在磁盘上备份数据 Node.js 可执行版本 Z 监听 3000 端口 Express.js 应用程序的文件 Nginx 可执行版本 Q 监听 80 端口其他基础架构注意事项 -
单实例,一个 cpu/核心 单实例,多 CPU/核心 多个实例 使用了哪个负载均衡器(如果有的话)对于将运行所有组件的单个实例,您可能甚至不需要负载均衡器 - 因此,除非您需要在应用程序旁边提供静态文件,否则使用 nginx em> 因为它不会做任何有用的事情。
当您有多个容器在一个实例(用于多核/CPU)或多个实例上运行您的 express.js 应用程序时,您需要进行某种负载平衡,可能使用 nginx。
不建议在容器内处理数据,因为容器文件系统不太擅长处理高度变异的数据。因此,对于 MySQL 和 Redis,您可能希望拥有数据所在的外部挂载点。
您的 Express.js 应用程序需要配置它需要连接的 Redis 和 MySQL 服务器,这可以使用 Docker 链接来完成。
因此,您的 Docker Compose 将如下所示 -
redis:
image: redis
volumes:
- /data/redis:/data
mysql:
image: mysql:5.6
environment:
- MYSQL_ROOT_PASSWORD=verysecret
volumes:
- /data/mysql:/var/lib/mysql
application:
image: node:0.12
working_dir: /usr/src/myapp
volumes:
- /src/app:/usr/src/myapp
ports:
- 80:3000
links:
- redis
- mysql
这里假设您将 MySQL 和 Redis 的数据存储在主机文件系统上的 /data
,并且您在主机文件系统上的应用程序位于 /src/app
。
我建议您查找 Docker Compose YAML 文件参考,了解所有可以使用的各种选项https://docs.docker.com/compose/yml/。
由于使用的镜像是来自 Docker HUB 的 blessed 镜像,因此需要注意它们的自述文件以进行更多配置 -
https://registry.hub.docker.com/_/mysql/ https://registry.hub.docker.com/_/node/ https://registry.hub.docker.com/_/redis/添加应用程序的更多实例很容易,但是您需要添加 nginx 以将传入流量负载平衡到多个应用程序容器。
然后,当您想使用多个主机运行这种设置时,它会变得更加复杂,因为 docker-links 将不起作用,您需要另一种方法来发现容器 IP 地址和端口。并且负载均衡器需要有一个端点来接受应用程序的多个实例的流量。在这里我建议好好看看https://consul.io 寻求帮助。
【讨论】:
以上是关于Docker + fig / compose + nginx + node.js + mysql + redis的主要内容,如果未能解决你的问题,请参考以下文章
Docker + fig / compose + nginx + node.js + mysql + redis