美文网首页程序员Awesome Docker
原来你是我最想留住的幸运

原来你是我最想留住的幸运

作者: 灵雀云 | 来源:发表于2016-01-04 15:50 被阅读391次

L是我的学弟,26岁,毕业四年,在一家初创公司做程序员,下面还带着几个刚毕业的小弟,收入也很不错。但是由于经常加班,没事就喜欢宅在家里写写博客,看看电影,所以一直还是单身。

其实L长得挺标致的,我们常常说他天天宅在家里,白白浪费了那张脸。

最近公司新来了一个HR的大姐,一进公司就盯上了L,一直说给他介绍女朋友。

『那个女孩就住我们家楼下,是幼儿园老师,长得可漂亮了,还喜欢小孩子,性格特别好。』

『大姐这么好的女孩还没男朋友,是拉拉吧』

『去去,少贫嘴,我是看你这小伙子不错才给你介绍,你别&#@@#%#%¥*&%%……』

在HR大姐的软磨硬泡下,L终于鼓起勇气去赴约了。见到女孩的第一眼,L就紧张了。女孩有一双大大的眼睛,明净清澈,一头卷发却显得很清纯,特别是笑起来两个小酒窝,特别可爱。

L的紧张显然没有给女孩留下特别好的印象,最后只加了微信,甚至连电话都没给L。

后来女孩跟HR大姐说两个人共同话题太少了,L讲的笑话她都听不懂。后来在我们的追问下,L才复述了那个笑话,被我们嘲笑了好久。

程序员甲:哎,借我点钱呗?

程序员乙:借多少?

程序员甲:1000。

程序员乙:行。哎,要不要多借你24,好凑个整?

程序员甲:也好。

后来L又约了女孩好几次,都被婉拒了,L又开始了在家看电影,写博客的生活。

其实L还是个文艺青年,喜欢看小众的电影,他喜欢的很多导演我们都没听过,最近还宣称自己又找到了个下电影的好工具mono,就在我司的镜像中心里,还嘲笑我都没发现自己公司的好东西。

在相亲之前他刚下载了希腊导演欧格斯·兰斯莫斯的《龙虾》,还一直向我们推荐。这一天他又看了一遍《龙虾》,写了一篇影评,转在了朋友圈里。

还以为遇到了喜欢的女孩就能够摆脱『单身有罪』的生活,结果还是失败了。

没想到几分钟后,第一次收到了女孩的主动联系:

『你也喜欢欧格斯·兰斯莫斯的电影?』

『是啊是啊』

『你写的博客还挺好看的,我看这个电影的时候也有差不多的感触。』

『嘿嘿,我博客里还有很多影评,地址是:』

然后,女孩了L博客中的很多影评:米尔科·曼彻夫斯基的《暴雨将至》,瓦蒂姆·佩尔曼的《尘雾家园》,尼尔·布洛姆坎普的《第九区》,苏珊纳·比尔的《婚礼之后》,李沧东的《绿洲》《诗》。。。才发现两个人有这么多共同话题。

然后,L结束了单身生活。后来L一直感慨,好幸运自己有写博客的习惯。

L的博客是用Ghost搭建的,就托管在我们(灵雀云)平台上,北京区的服务还能挂载和备份数据卷,不怕写的博客哪一天没了。Ghost是一基于node的博客系统,速度快,够简洁,Docker化后更是能实现一键部署。L一直说Ghost的博客做得好看,Docker化后非常适合我们这种没技术的小白。。。

相信读者中还是有技术背景的居多,下面教大家如何快速Docker化Ghost博客。

首先要注意Ghost支持的Node的版本:

$ node index.js

ERROR: Unsupported version of Node

Ghost needs Node version ~0.10.0 || ~0.12.0 you are using version 4.2.2

将容器转化为镜像

这一节把node安装在/node下,把ghost安装在/ghost目录下。

1

拉取一个镜像

$ sudo docker pull ubuntu:14.04

使用sudo docker images查看本机有哪些容器。如果一个镜像有多个标签,则会显示多个。

2

启动一个容器

例如:

$ sudo docker run -ti ubuntu:14.04 /bin/bash

root@5989ceee9a40:/# uname -a

Linux 5989ceee9a40 3.16.0-38-generic #52~14.04.1-Ubuntu SMP Fri May 8 09:43:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

可以在宿主机上运行sudo docker ps查看有哪些容器正在运行。

3

安装curl等

root@5989ceee9a40:/# apt-get install -y curl

root@5989ceee9a40:/# apt-get install -y zip

4

输下载node

root@5989ceee9a40:/node# curl -SLO https://nodejs.org/dist/v0.12.9/node-v0.12.9-linux-x64.tar.gz

root@5989ceee9a40:/node# tar -xzf node-v0.12.9-linux-x64.tar.gz

root@5989ceee9a40:/node# mv node-v0.12.9-linux-x64/* .

root@5989ceee9a40:/node# rm -rf node-v0.12.9-linux-x64

root@5989ceee9a40:/node# ls

ChangeLog  LICENSE  README.md  bin  etc  include  lib  node-v0.12.9-linux-x64.tar.gz  share

5

下载Ghost

root@5989ceee9a40:/node# mkdir /ghost

root@5989ceee9a40:/node# cd /ghost/

root@5989ceee9a40:/ghost# curl -SLO https://ghost.org/zip/ghost-0.7.2.zip

root@5989ceee9a40:/ghost# unzip ghost-0.7.2.zip

root@5989ceee9a40:/ghost# ls

Gruntfile.js  LICENSE  PRIVACY.md  README.md  config.example.js  config.js  content  core  ghost-0.7.2.zip  index.js  node_modules  npm-shrinkwrap.json  package.json

root@5989ceee9a40:/ghost# npm install -g npm@latest

root@5989ceee9a40:/ghost# npm install --production  # 比较耗时

root@5989ceee9a40:/ghost# sed 's/127.0.0.1/0.0.0.0/' config.example.js > config.js

6

退出容器

exit后会容器不再运行,通过下面方法重启容器:

$ sudo docker start 5989ceee9a40

$ sudo docker ps

CONTAINER ID        IMAGE              COMMAND                  CREATED            STATUS              PORTS                    NAMES

5989ceee9a40        ubuntu:14.04        "/bin/bash"              4 hours ago        Up 16 seconds                                desperate_dijkstra

$ sudo docker attach 5989ceee9a40

root@5989ceee9a40:/#

7

输将容器装换为镜像

commit的帮助文档如下:

$ docker commit --help

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

-a, --author=      Author (e.g., "John Hannibal Smith ")

-c, --change=[]    Apply Dockerfile instruction to the created image

--help=false        Print usage

-m, --message=      Commit message

-p, --pause=true    Pause container during commit

在主机上,将刚才的容器转换为镜像:

$ sudo docker commit -m "ghost 0.7.2 on ubuntu" -a "letian" 5989ceee9a40 letian/ghost:v1

33eb15dca18e4d7a77673b1a12282699a0dbaaa51c38f5db45d51ffbe77af08d

$ sudo docker images

REPOSITORY                        TAG                IMAGE ID            CREATED            VIRTUAL SIZE

letian/ghost                      v1                  33eb15dca18e        4 minutes ago      457.5 MB

..........

个头有点大。。

8

测试

启动一个ghost服务:

$ sudo docker run -d -p 8000:2368 letian/ghost:v1  /node/bin/node /ghost/index.js

88124fab0a0d43603ee50113a2380a5a22890d4040f27d144c412b4dedb66e7b

$ sudo docker ps

CONTAINER ID        IMAGE              COMMAND                  CREATED            STATUS              PORTS                    NAMES

88124fab0a0d        letian/ghost:v1    "/node/bin/node /ghos"  38 seconds ago      Up 37 seconds      0.0.0.0:8000->2368/tcp  loving_colden

上面忘了把NODE_ENV设置为production了,加-e指定就行了:

$ sudo docker run -d -e NODE_ENV=production -p 8008:2368 letian/ghost:v1  /node/bin/node /ghost/index.js

在宿主机上,用浏览器打开http://:8008/,可以查看ghost是否正常运行。

使用Dockerfile构建镜像

现在我们尝试使用Dockerfile构建镜像。同时,为了解决上面遇到的npm install比较耗时的问题,将Ghost 中文集成版直接作为文件添加进镜像。这个ghost中文集成版在汉化的基础上把所有的依赖都放进去了,所以不需要npm install。

创建目录ghost-0.7.0,其中的文件如下:

$ ls

Dockerfile

Ghost-0.7.0-zh-full.zip

start.sh

1

Dockerfile

FROM ubuntu:14.04

ADD Ghost-0.7.0-zh-full.zip /tmp/Ghost-0.7.0-zh-full.zip

ADD start.sh /start-ghost.sh

ENV NODE_VERSION 0.12.9

RUN \

apt-get update && \

apt-get install -y curl && \

apt-get install -y zip  && \

cd /tmp && \

curl -SLO "https://nodejs.org/dist/v0.12.9/node-v$NODE_VERSION-linux-x64.tar.gz"  && \

tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1  && \

unzip Ghost-0.7.0-zh-full.zip -d /ghost && \

rm /tmp/Ghost-0.7.0-zh-full.zip && \

cd /ghost && \

sed 's/127.0.0.1/0.0.0.0/' config.example.js > config.js

WORKDIR /ghost

CMD ["bash", "/start-ghost.sh"]

EXPOSE 2368

Ghost-0.7.0-zh-full.zip被放到/tmp目录,start.sh添加到/start-ghost.sh,创建容器时候会运行bash /start-ghost.sh。

2

start.sh

#!/bin/bashGHOST="/ghost"cd "$GHOST"NODE_ENV=${NODE_ENV:-production} npm start

3

构建镜像

$ cd ghost-0.7.0

$ sudo docker build -t letian/ghost:v2 .

4

创建容器、测试

$ sudo docker run -d -p 8080:2368 letian/ghost:v2

在宿主机上用浏览器打开http://:8080/,可以看到ghost正常运行。

优化

Ghost的数据库和图片等最好是放在数据卷中(VOLUMN)。

1

Dockerfile

FROM ubuntu:14.04

ADD Ghost-0.7.0-zh-full.zip /tmp/Ghost-0.7.0-zh-full.zip

ADD start.sh /start-ghost.sh

ENV NODE_VERSION 0.12.9

RUN \

apt-get update && \

apt-get install -y curl zip && \

cd /tmp && \

curl -SLO "https://nodejs.org/dist/v0.12.9/node-v$NODE_VERSION-linux-x64.tar.gz"  && \

tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1  && \

unzip Ghost-0.7.0-zh-full.zip -d /ghost && \

rm /tmp/Ghost-0.7.0-zh-full.zip && \

cd /ghost && \

sed 's/127.0.0.1/0.0.0.0/' config.example.js > config.js

VOLUME /ghost-external

WORKDIR /ghost

CMD ["bash", "/start-ghost.sh"]

EXPOSE 2368

就是在之前的基础上加了行VOLUME /ghost-external。

2

start.sh

#!/bin/bash

GHOST="/ghost"

GHOST_EXTERNAL="/ghost-external"

CONFIG="config.js"

DATA="content/data"

IMAGES="content/images"

THEMES="content/themes"

mkdir -p "$GHOST_EXTERNAL/$DATA"

rm -rf "$GHOST/$DATA"

ln -s "$GHOST_EXTERNAL/$DATA" "$GHOST/$DATA"

mkdir -p "$GHOST_EXTERNAL/$IMAGES"

rm -rf "$GHOST/$IMAGES"

ln -s "$GHOST_EXTERNAL/$IMAGES" "$GHOST/$IMAGES"

if [ -d "$GHOST_EXTERNAL/$THEMES" ]; then      rm -rf "$GHOST/$THEMES"    ln -s "$GHOST_EXTERNAL/$THEMES" "$GHOST/$THEMES"

fi

if [ -f "$GHOST_EXTERNAL/$CONFIG" ]; then      rm -f "$GHOST/$CONFIG"    ln -s "$GHOST_EXTERNAL/$CONFIG" "$GHOST/$CONFIG"

fi

cd "$GHOST"

NODE_ENV=${NODE_ENV:-production} npm start

数据卷/ghost-external中的目录、文件被软链接到/ghost对应的位置上。

3

构建镜像

$ sudo docker build -t letian/ghost:v3 .

4

创建容器、测试

创建容器,将宿主机目录挂载到数据卷:

$ mkdir ~/local-ghost

$ sudo docker run -d -p 8090:2368 -v ~/local-ghost:/ghost-external letian/ghost:v3

在宿主机上用浏览器打开http://:8090/,可以看到ghost正常运行。~/local-ghost也有相应的文件、目录被创建。

在云服务中构建镜像

这里选择灵雀云构建镜像。

首先将Dockerfile等上传到Github(也可以是Git@OSC、BitBucket)中。

登录灵雀云

点击“创建构建镜像仓库”,授权读取Github中的repo,选择ghost对应的项目构建即可。

然后在“服务”中选择“创建服务”,会提示用户选择镜像,选择“我的镜像”中刚才构建好的docker-ghost:

点击“配置镜像”后:

填写指定服务名称,将服务类型改为“有状态服务”,然后进入“高级配置”:

此处,需要指定存储卷大小,端口的服务地址类型需要配置成http-endpoint:

然后创建服务,查看服务详情:

浏览器打开红线处的URL就可以看到Ghost博客了。

相关文章

  • 小幸运

    原来你是我最想留住的幸运 ...

  • 我的青春·校园故事(第一章)

    原来你是我最想留住的幸运 ...

  • 每个人的幸运

    前言 “原来你是我最想留住的幸运” ——小幸运 我们都想留住自己的幸运...

  • 小幸运

    “原来你是我最想留住的幸运,原来我们……与你相遇,好幸运。”我想,你应该是我最想留住的幸运吧! 与你相识时,并没有...

  • 原来你是我最想留住的幸运

    原来你是我最想留住的幸运 “原来你是我最想留住的幸运,原来我们和爱情曾经靠的那么近”轻轻地哼起了这首歌,当时单曲循...

  • 小幸运

    原来你是我最想留住的幸运,原来我们和爱情曾经靠的那么近 你是我唯一想要留住的幸运

  • 虽然青春不再,但我还是想留住那份小幸运

    原来你是我最想留住的小幸运,原来我们和爱情曾经靠得那么近。 ——《小...

  • 没有陪你淋过的雨

    原来你是我最想留住的幸运 原来我们和爱情曾经靠得那么近 -----《小幸...

  • 【原创】人面桃花

    执笔/林沁 原来你是我最想留住却怎么也留不住的幸运. ...

  • 原来你是我最想留住的幸运

    文/林明澈 以前总是觉得转眼就是一生,而现在突然发现——我一转眼,你就不见了。 2018.2.27 晴 星期二 ...

网友评论

    本文标题:原来你是我最想留住的幸运

    本文链接:https://www.haomeiwen.com/subject/ickahttx.html