Docker + fig / compose + nginx + node.js + mysql + redis
Docker + fig / compose + nginx + node.js + mysql + redis
我正在尝试在 Docker 多个容器上设置一个 Node.js 应用程序。
我的应用目前在一个 Ubuntu DO droplet 上使用:
- Node.js(表示 4)
- mysql 应用数据库
- 键值存储的redis
- 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 图像,因此需要注意它们的自述文件以进行更多配置 -
- 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 多个容器上设置一个 Node.js 应用程序。 我的应用目前在一个 Ubuntu DO droplet 上使用:
- Node.js(表示 4)
- mysql 应用数据库
- 键值存储的redis
- 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 图像,因此需要注意它们的自述文件以进行更多配置 -
- 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寻求帮助。