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

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

我正在尝试在 Docker 多个容器上设置一个 Node.js 应用程序。 我的应用目前在一个 Ubuntu DO droplet 上使用:

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

我需要对不同的部分进行 docker 化,显然每个容器一个,然后使用 Docker-Compose(以前称为图)来简单地描述不同的容器并设置 links 之间他们。 我不太清楚多容器方法。
一个用于 nginx
一个用于 Node.js 和我的快递应用程序
一个 MySql
一个用于 Redis

Docker-compose.yml 会是什么样子? 我猜 nginx、mysql 和 redis 将是未经修改的官方镜像? 虽然 node.js 将有一个指向 Docker 文件的构建指令,这会注意到它是基于 node.js 官方图像以及配置说明? 例如,我将需要配置/提供 mysql 和 redis,这是否意味着每个都需要与自己的 Docker 文件分开?

容器之间 link 的方式是什么? 使用卷将文件复制到其中, 设置端口,调整主机文件以映射 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

Docker文件

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 作为基础,尽管我的应用程序需要

我认为您不需要将 nginx 和 nodejs 拆分到不同的实例。目前我还在 docker 上设置 nodejs,所以很快就会回到这里并尝试对你的问题做出复杂的回应。

你可以在 docker http://blog.stxnext.com/posts/2015/01/development-with-docker-and-fig/ 上找到一篇关于设置类似架构的有用文章,django / nodejs 的区别应该不是问题。

在配置docker-compose部分之前,必须确定系统的架构。

你拥有的零件-

  • MySQL 可执行版本 X 侦听端口 3306
  • MySQL 数据 存储在磁盘上
  • Redis 可执行版本 Y 监听端口 6379
  • Redis 备份数据 到磁盘
  • Node.js 监听端口 3000 的可执行版本 Z
  • 您的 Express.js 应用程序的文件
  • Nginx可执行版本Q监听80端口

其他基础设施注意事项 -

  • 单实例,一个cpu/core
  • 单个实例,多个cpus/cores
  • 多个实例
  • 使用哪个负载均衡器(如果有的话)

对于将 运行 所有组件的单个实例,您可能甚至不需要负载平衡器 - 因此除非您需要在应用程序旁边提供静态文件,否​​则这里没有什么意义nginx 因为它不会做任何有用的事情。

当您有多个容器 运行 在一个实例(对于 multi-core/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 图像,因此需要注意它们的自述文件以进行更多配置 -

添加更多应用程序实例很容易,但随后您将需要添加 nginx 以平衡传入流量到多个应用程序容器的负载。

然后当你想要 运行 这种使用多个主机的设置时,它变得更加复杂,因为 docker-links 将不起作用,你需要另一种方式来发现容器 IP 地址和港口。负载均衡器需要有一个端点来接受应用程序多个实例的流量。在这里我建议好好看看https://consul.io寻求帮助。