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 液滴上并使用:

    Node.js (express 4) 应用数据库的mysql 用于键值存储的 redis nginx 用于负载平衡和提供静态文件。

我需要对不同的部分进行 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之Compose服务编排

Docker之Compose服务编排

(转)Docker之Compose服务编排

Docker + fig / compose + nginx + node.js + mysql + redis

Docker-compose实战——Django+PostgreSQL

Docker Compose