このエントリの Goal

  • Ghost の Official Image を使って Production 環境で動かす準備をする.
  • Ghost の config.js と Theme を追加する Docker Image を作る.
  • Docker の Data Volume Container も触ってみる.

Ghost を Development モードで動かす

とりあえず、Official Image の Readme に沿って開発環境で動かしてみる.

$ docker run -p 2368:2368 -d ghost:latest
3fe73b3a200224444ce10e7cac451b019907943a25c5ff35007a0646f48d1867

このコマンドだけで Ghost が立ち上がる。ステータスも確認して、ブラウザからアクセスしてみる。めっちゃ簡単に立ち上げられた!!

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
3fe73b3a2002        ghost:latest        "/entrypoint.sh npm s"   5 seconds ago       Up 5 seconds        0.0.0.0:2368->2368/tcp   berserk_sammet

$ docker logs 3fe7
npm info it worked if it ends with ok
npm info using npm@2.14.12
npm info using node@v4.2.6
npm info prestart ghost@0.7.8
npm info start ghost@0.7.8

> ghost@0.7.8 start /usr/src/ghost
> node index

WARNING: Ghost is attempting to use a direct method to send email.
It is recommended that you explicitly configure an email service.
Help and documentation can be found at http://support.ghost.org/mail.

Migrations: Database initialisation required for version 004
Migrations: Creating tables...
...
Migrations: Complete
Ghost is running in development...
Listening on 0.0.0.0:2368
Url configured as: http://localhost:2368
Ctrl+C to shut down

# docker daemonが動いているhostを確認
$ docker-machine ip default
192.168.99.100

> access to http://192.168.99.100:2368 by browser

Ghost が Production モードで動くか試す

docker stop 3fe73b3a2002

$ docker run -p 2368:2368 -d ghost:latest npm start --production
ccbc3facf

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
# 動いていない

$ docker logs ccbc3facf 
npm info it worked if it ends with ok
npm info using npm@2.14.12
npm info using node@v4.2.6
npm info prestart ghost@0.7.8
npm info start ghost@0.7.8

> ghost@0.7.8 start /usr/src/ghost
> node index

ERROR: Unable to access Ghost's content path:
  EACCES: permission denied, open '/usr/src/ghost/content/apps/44b366dd4d81cc5c'

Check that the content path exists and file system permissions are correct.
Help and documentation can be found at http://support.ghost.org.

...

permission denied で怒られる。。

Readme にも Production モードのことが書いてないし、DockerHub のコメントや Fork して作られている ptimof/ghost を見た感じだと、現時点では対応していないっぽい.

  • Docker は理解が浅い状態なので、野良はあまり使いたくない.
  • Official の Readme によると、設定ファイルを読み込む方法で回避できそう.
  • せっかく環境を代えるので Ghost の theme も変更したい.

という理由で、 production で動かすための config ファイルと theme データを配置する簡易な Docker Image を作ることにする.


Docker Image の作成

Dockerfile と config.js を追加する

$ tree ghost_docker_prepare 
ghost_docker_prepare
├── Dockerfile
└── config.js

0 directories, 2 files

Dockerfile

$ cat ./Dockerfile
FROM ubuntu:latest
MAINTAINER itomoyasu <itomoyasu@gmail.com>

WORKDIR /var/lib/ghost

# set config file
COPY config.js ./config.js

# set ghost theme
RUN apt-get update && apt-get install -y git
CMD ["git", "clone", "https://github.com/h4t0n/odin.git", "themes/odin"]

config.js

$ cat ./config.js
// # Ghost Configuration
// Setup your Ghost install for various environments
// Documentation can be found at http://docs.ghost.org/usage/configuration/

var path = require('path'),
    config;

config = {
    // ### Development **(default)**
    development: {
        // The url to use when providing links to the site, E.g. in RSS and email.
        url: 'http://my-ghost-blog.com',

        // Example mail config
        // Visit http://docs.ghost.org/mail for instructions
        // ```
        //  mail: {
        //      transport: 'SMTP',
        //      options: {
        //          service: 'Mailgun',
        //          auth: {
        //              user: '', // mailgun username
        //              pass: ''  // mailgun password
        //          }
        //      }
        //  },
        // ```

        database: {
            client: 'sqlite3',
            connection: {
                filename: path.join(__dirname, '/content/data/ghost-dev.db')
            },
            debug: false
        },
        server: {
            // Host to be passed to node's `net.Server#listen()`
            host: '127.0.0.1',
            // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
            port: '2368'
        },
        paths: {
            contentPath: path.join(__dirname, '/content/')
        }
    },

    // ### Production
    // When running Ghost in the wild, use the production environment
    // Configure your URL and mail settings here
    production: {
        url: 'http://itomoyasu.com',
        mail: {},
        database: {
            client: 'sqlite3',
            connection: {
                filename: path.join(process.env.GHOST_CONTENT, '/data/ghost.db')
            },
            debug: false
        },
        server: {
            // Host to be passed to node's `net.Server#listen()`
            host: '0.0.0.0',
            // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
            port: '2368'
        },
        paths: {
            contentPath: path.join(process.env.GHOST_CONTENT, '/')
        }
    },
};

// Export config
module.exports = config;

buildする

$ docker build -t itomoyasu/ghost-prepare .

Data Volume Container を立ち上げる

Data Volume Container として準備した Image を立ち上げることで、データを他の Container から隔離された状態で扱うことできる。Data Volume Container の公式 Doc はこちら

$ docker run -v /var/lib/ghost --name ghost_data itomoyasu/ghost-prepare

Data Volume 内のファイルを確認

# Data Volume を参照するには --volumes-from `container's-name` の引数を指定する
$ docker run --volumes-from ghost_data -it ubuntu bin/bash
root@967ed0ee9c0b:/# ls /var/lib/ghost/
config.js  themes

Data Volume を読み込み Ghost を Production モードで立ち上げる

$ docker run --name ghost_container -p 2368:2368 --volumes-from ghost_data -d ghost:latest npm start --production

起動確認

$ docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
5db755fadbec        ghost:latest        "/entrypoint.sh npm s"   About a minute ago   Up About a minute   0.0.0.0:2368->2368/tcp   ghost_container

# IP Address の確認
$  docker-machine ip
192.168.99.100

# access by browser
http://192.168.99.100:2368

コンポーネント図

構成としてはこんな感じになってるはず。

以上で、Prodcution モードで立ち上がっていることを確認できた。

Docker 楽しい(^ω^)