16

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

  1. Node.js(表达 4)
  2. 应用程序数据库的mysql
  3. 用于键值存储的 redis
  4. 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 分开?

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

我使用这个简单的项目作为基础,虽然我的应用程序需要

4

2 回答 2

27

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

你拥有的零件——

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

其他基础设施注意事项 -

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

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

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

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

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

于 2015-03-01T13:06:38.770 回答
0

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

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

于 2015-02-27T14:17:56.560 回答