使用 Docker 和 phusion-passenger 部署 Meteor 应用程序
Posted
技术标签:
【中文标题】使用 Docker 和 phusion-passenger 部署 Meteor 应用程序【英文标题】:Deploying Meteor application with Docker and phusion-passenger 【发布时间】:2015-01-01 08:09:36 【问题描述】:我正在尝试将 Meteor 应用程序部署到我的 Ubuntu 14.04 (Trusty Tahr) VPS。我在 DockerHub 上使用私有 Docker 注册表,并从 Bitbucket 上的 Git 存储库中提取自动构建设置。这真的很管用。
但是,当我运行容器时,我无法看到 Meteor 应用程序正在运行。我在他们的文档中阅读了有关 phusion-passenger 和 Meteor 的信息,但我认为该指南缺少一些内容,因为我无法让它工作。
我的做法是使用meteor创建应用:
meteor create simple-wishes
这将创建一个目录,其中包含一个 CSS、html 和 javascript 文件(以及一个 .meteor
文件夹)。在这个目录之外,我创建了一个 Dockerfile,如下所示:
FROM phusion/passenger-nodejs:0.9.14
MAINTAINER Søren Pedersen
# Set correct environment variables.
ENV HOME /root
# Use baseimage-docker's init process.
CMD ["/sbin/my_init"]
# ssh
ADD ssh/id_rsa.pub /tmp/your_key
RUN cat /tmp/your_key >> /root/.ssh/authorized_keys && rm -f /tmp/your_key
# install meteor
RUN curl https://install.meteor.com | /bin/sh
# Remove the default site
RUN rm /etc/nginx/sites-enabled/default
# Enable nginx
RUN rm -f /etc/service/nginx/down
# Setup app
ADD webapp.conf /etc/nginx/sites-enabled/webapp.conf
RUN mkdir /home/app/simple-wishes
ADD simple-wishes /home/app/simple-wishes
Dockerfile 中引用的 webapp.conf 文件如下所示:
server
listen 80;
server_name simple-wishes.com;
root /home/app/simple-wishes/public;
passenger_enabled on;
passenger_user app;
passenger_sticky_sessions on;
passenger_set_cgi_param MONGO_URL mongodb://localhost:27017/meteor;
passenger_set_cgi_param MONGO_OPLOG_URL mongodb://localhost:27017/local;
passenger_set_cgi_param ROOT_URL http://simple-wishes.com;
# Set these ONLY if your app is a Meteor bundle!
#passenger_app_type node;
#passenger_startup_file main.js;
在我的 VPS 上,我运行这样的容器:
docker run -d -p 80:80 -p 2200:22 sohape/simplewishes
这会从 DockerHub 拉取镜像并以守护模式启动容器,将端口 80 和 22 映射到主机上的端口 80 和 2200。
当我现在向服务器 (http://simple-wishes.com) 发出 HTTP 请求时,我收到来自 nginx 的错误:
502 Bad Gateway
我一定是在这里遗漏了一些步骤,但我不知道是什么。所以我希望有人能指出我正确的方向。
【问题讨论】:
【参考方案1】:Docker 容器内的本地主机与外部的本地主机不同。如果 MongoDB 在其自己的容器中或使用众所周知的 DNS 条目,您可能希望使用 --link
链接容器。
【讨论】:
这是一个好点! - 但在这种情况下,mongo 在同一个容器中 - 流星应该自动启动一个 mongo 实例。所以我认为 localhost 是正确的【参考方案2】:当您在没有捆绑应用程序的情况下按原样运行 Meteor 时,Meteor 将 启动一个 MongoDB 实例,但不在默认的 MongoDB 端口上。
查看 Stack Overflow 问题的答案How do I use the existing MongoDB in a Meteor project?。
【讨论】:
【参考方案3】:您可以尝试使用我的 Docker 映像,看看它是如何设置的。要快速运行它,请使用以下命令(确保先打包 Meteor 应用程序):
docker run -d \
-e ROOT_URL=http://yourapp.com \
-e MONGO_URL=mongodb://url \
-e MONGO_OPLOG_URL=mongodb://oplog_url \
-v /dir_containing_bundledir:/home/app/webapp \
-p 80:80 \
joostlaan/meteor-docker-passenger
你可以看到how I built it at GitHub。
【讨论】:
以上是关于使用 Docker 和 phusion-passenger 部署 Meteor 应用程序的主要内容,如果未能解决你的问题,请参考以下文章