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

Aja*_*jar 15 mysql nginx node.js docker fig

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

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

我需要对不同的部分进行dockerize,显然每个容器一个,然后使用Docker-Compose(以前称为图)简单描述不同的容器并设置它们之间的链接.我对多容器appraoch的窃取不清楚.
一个用于nginx,
一个用于Node.js,我的快速应用
一个用于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容器上?)

这是初稿,如果能够更好地理解这个新设置,我将不胜感激:

泊坞窗,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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

Evg*_*eny 26

在配置docker-compose part之前,您必须确定系统的体系结构.

你有的部分 -

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

其他基础设施考虑

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

对于将运行所有组件的单个实例,您可能甚至不需要负载均衡器 - 所以除非您需要在应用程序旁边提供静态文件,否​​则这里没有任何意义可以使用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
Run Code Online (Sandbox Code Playgroud)

这假设您将MySQL和Redis的数据存储在主机文件系统中/data,并且您的主机文件系统上的应用程序位于/src/app.

我建议您查找可以使用的所有各种选项的Docker Compose YAML文件参考https://docs.docker.com/compose/yml/.

由于使用的图像是来自Docker HUB 的祝福图像,因此需要注意其自述文件以获得更多配置 -

添加更多应用程序实例很简单,但是您需要添加nginx以对多个应用程序容器的传入流量进行负载平衡.

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