2

我对 Docker、Ghost 和 node 真的很陌生,所以请原谅这里的任何明目张胆的无知。

我正在尝试根据映像为 Ghost 设置 Docker 映像/容器google/nodejs-runtime,但是当我通过 Docker 运行时无法连接到服务器。

一些细节:我在 OS X 上,所以我使用的是 boot2docker。我将 Ghost 作为 npm 模块运行,配置为使用端口 8080,因为这是google/nodejs-runtime预期的。当我使用npm start. 我还在端口 8080 上尝试了一个简单的“Hello, World” Express 应用程序,它可以在 Docker 中运行。

我的目录结构如下所示:

  • 我的应用
    • 内容/
    • Dockerfile
    • ghost_config.js
    • 包.json
    • 服务器.js

package.json

{
  "name": "my_app",
  "private": true,
  "dependencies": {
    "ghost": "0.5.2",
    "express": "3.x"
  }
}

Dockerfile

FROM google/nodejs-runtime

ghost_config.js

我将所有出现的端口 2368 更改为 8080。

server.js

// This Ghost server works with npm start, but not with Docker
var ghost = require('ghost');
var path = require('path');

ghost({
  config: path.join(__dirname, 'ghost_config.js')
}).then(function (ghostServer) {
  ghostServer.start();
});

// This "Hello World" app works in Docker
// var express = require('express');
// var app = express();

// app.get('/', function(req, res) {
//   res.send('Hello World');
// });

// var server = app.listen(8080, function() {
//   console.log('Listening on port %d', server.address().port);
// });

我使用 构建我的 Docker 映像docker build -t my_app .,然后使用 运行它docker run -p 8080 my_app,这会将其打印到控制台:

> my_app@ start /app
> node server.js

Migrations: Up to date at version 003
Ghost is running in development... 
Listening on 127.0.0.1:8080 
Url configured as: http://localhost:8080 
Ctrl+C to shut down

docker ps输出:

CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                     NAMES
4f4c7027f62f        my_app:latest   "/nodejs/bin/npm sta   23 hours ago        Up About a minute   0.0.0.0:49165->8080/tcp   pensive_lovelace

boot2docker ip输出:

The VM's Host only interface IP address is: 192.168.59.103

因此,我将浏览器指向:192.168.59.103:49165,但什么也没得到,Docker 日志中没有输出。就像我上面说的,在同样的环境中运行“Hello World”应用程序server.js很好。

一切对我来说都是正确的。我看到的唯一奇怪的事情是 sqlite3 在以下npm install期间失败docker build

[sqlite3] Command failed: 
module.js:356
  Module._extensions[extension](this, filename);
                               ^
Error: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found 

...

node-pre-gyp ERR! Testing pre-built binary failed, attempting to source compile 

但源代码编译似乎成功了。

我希望我只是在这里做一些愚蠢的事情。

4

2 回答 2

3

在您的 ghost 配置中,将相关的服务器主机更改0.0.0.0127.0.0.1

server: {
  host: '0.0.0.0',
  ...
}

PS:对于 SQLite 错误。试试这个 Dockerfile:

FROM phusion/baseimage:latest

# Set correct environment variables.
ENV HOME /root

# Regenerate SSH host keys. baseimage-docker does not contain any, so you
# have to do that yourself. You may also comment out this instruction; the
# init system will auto-generate one during boot.
RUN /etc/my_init.d/00_regen_ssh_host_keys.sh

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]

# ...put your own build instructions here...
# Install Node.js and npm
ENV DEBIAN_FRONTEND noninteractive
RUN curl -sL https://deb.nodesource.com/setup | sudo bash -
RUN apt-get install -y nodejs

# Copy Project Files
RUN mkdir /root/webapp
WORKDIR /root/webapp

COPY app /root/webapp/app
COPY package.json /root/webapp/
RUN npm install

# Add runit service for Node.js app
RUN mkdir /etc/service/webapp
ADD deploy/runit/webapp.sh /etc/service/webapp/run
RUN chmod +x /etc/service/webapp/run

# Add syslog-ng Logentries config file
ADD deploy/syslog-ng/logentries.conf /etc/syslog-ng/conf.d/logentries.conf

# Expose Ghost port
EXPOSE 2368

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

注意我使用了 node.js 和 npmphusion/baseimage来代替google/nodejs-runtime并安装:

ENV DEBIAN_FRONTEND noninteractive
RUN curl -sL https://deb.nodesource.com/setup | sudo bash -
RUN apt-get install -y nodejs
于 2014-10-29T18:15:39.063 回答
0

在你的 Dockerfile 中,你需要这个命令EXPOSE 8080。但这只会使该端口可以在 Docker 容器之外访问。当您从该映像运行容器时,您需要“映射”该端口。例如:

$ docker run -d -t -p 80:8080 <imagename>

-p 80:8080运行时将容器中的端口“8080”定向到外部的端口“80” 。

语法总是让我感到困惑(我认为它是倒退的)。

于 2014-10-22T12:29:38.967 回答