使用 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、htmljavascript 文件(以及一个 .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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Docker 基本命令和使用

在Ubuntu中安装Docker和docker的使用

CentOS7修改Docker容器和镜像默认存储位置

在Ubuntu中安装Docker和docker的使用

Docker的安装和使用说明——Docker for Windows

Docker的安装和使用说明——Docker for Windows