通过容器的方式把Ghost部署到Bluemix上

关于Ghost,之前聊过

新一代的博客平台,也是Wordpress未来的替代方案,到目前为止,在Github上有22,421个评星,是非常不错的评价,不仅仅是一款开源的CMS解决方案,也是Node技术爱好者的学习的优秀资源,诸如Passport设计,ember前端方案,都是精心推敲后才融入到了产品中

不得不佩服Ghost的开发者,从第一个版本到现在,Ghost产品历经了几年的时间,最近半年多时间里酝酿发布1.0版本,目前Ghost发布了18个alpha版本(看开发者的意思,这应该是最后一个alpha版本),这些极客对技术精雕细刻,比如前几个alpha版本一直采用Grunt做构建工具,后来采用Gulp,然而在最近的几个alpha版本又放弃了Gulp转回Grunt,这些探索经验都值得技术开发者关注。之前也聊过怎么通过DevOps方式把Ghost部署到Bluemix上,在Bluemix上通过DevOps方式部署只能通过域名方式访问,比如

your-app-url.mybluemix.net  

GFW无孔不入,国内通过mybluemix.net访问Bluemix会遭到间歇性屏蔽,下面介绍一下通过容器的方式避免这种尴尬。Bluemix的容器部署方式可以绑定Public IP,这样就可以绕过GWF对域名的干扰(但仍然存在风险,仅仅是降低了被屏蔽的几率),如果你有自己的域名,还可以直接把域名绑定到这个Public IP(当然,没有经过备案的域名仍然有可能会遭到屏蔽)。

首先看看要采用Bluemix的哪个镜像

Ghost是Node环境,所以这里选择ibmnode,进一步了解ibmnode可以知道,这个镜像是以ubuntu:14.04为基础镜像的。

https://console.ng.bluemix.net/docs/images/docker_image_ibmnode/ibmnode_starter.html

这样,我们在本地可以pull Ubuntu 14.04这个镜像做为测试。

下载Ghost

git clone https://github.com/TryGhost/Ghost.git  

下载Ghost代码到本地,并且修改配置文件 core/server/config/defaults.json,IP改成0.0.0.0

"url": "http://0.0.0.0:2368",
"server": {
    "host": "0.0.0.0",
    "port": 2368
},

配置Dockerfile

Ghost本身运行很简单,几行命令就可以启动APP,

不过要打包在镜像中就需要安装很多依赖包,使Dockerfile文件与下载的Ghost目录平级,经过反复测试,Dockerfile的内容大致内容如下并做一些解释

1.使用ibmnode为基础镜像

FROM registry.ng.bluemix.net/ibmnode  
EXPOSE 2368  

2.当前目录设置在/apps下

RUN mkdir -p /apps  

3.必要的更新,包括sqlite的支持等

RUN apt-get -y updateRUN apt-get install -y build-essential checkinstall  
RUN apt-get install -y libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev  

4.安装curl

RUN apt-get -y install curl  

5.安装Node 6.x

RUN curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -  
RUN apt-get install -y nodejs  

6.安装yarn(Ghost需要)

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -  
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list  
RUN apt-get update && apt-get -y install yarn  
RUN apt-get -y install git  

7.设置workdir

ADD ./Ghost /appsWORKDIR /apps  

8.安装bower(Ghost需要使用,注意bower在root下执行需要`allow_root`设置)

RUN npm install bower --save  
RUN echo '{ "allow_root": true }' > /root/.bowerrc  
RUN npm install sqlite3  

9.运行Ghost需要

RUN npm run init  
RUN knex-migrator init  

10.执行CMD

CMD ["grunt", "dev"]  

执行Bluemix命令

cf ic build -t registry.ng.bluemix.net/rooster/ghost-1.0.0-alpha-18 .  

Build镜像后可以查看

运行后,查看当前容器

cf ic run -p 2368 --name ghost registry.ng.bluemix.net/rooster/ghost-1.0.0-alpha-18

设置Public IP

登录Bluemix Container,查看对应的这个container,然后设置Public IP

现在可以通过这个ip来访问Ghost服务了

绑定域名

把我珍藏的一个域名(tabenren.com)绑定到这个IP,域名托管在Godaddy上,添加A记录,将域名指向这个IP,为了绑定IP方便,我把端口映射改成了80,访问 http://tabenren.com 就可以直接打开Bluemix上这个容器运行的Ghost app了。

除了使用ibmnode这种方式,Bluemix也提供了直接upload镜像的方式,过程和上述过程类似。

测试效果

编辑一篇文章,体验在手机上的效果,Ghost的响应式设计很漂亮。

上面的镜像也打包发布到了Docker Hub上(基于ubuntu:14.04),可以直接拉取镜像使用

docker pull tabenren/ghost:alpha-1.0.0-18  
docker run -p 2368 --name your-app-name tabenren/ghost:alpha-1.0.0-18  

PS:用过一段时间Bluemix服务,感觉Bluemix的设计没有一点产品的理念,进入Portal就像进入了迷宫一样,打算购买Bluemix的朋友建议再犹豫一下!