为什么要用Ghost和Docker?这个问题很好回答,因为ghost快速简单,而且是用node.js开发的,用户体验很好。我自己用过很多博客系统,用的时间最长的是WordPress,但是最后因为选对插件的问题放弃了(选择困难,因为太多了)。使用码头工人?嗯,一是学习docker技术,二是因为一个学生没有稳定的服务器,每次都要重新配置服务器,很麻烦。.废话就这么多,进入正题。先决条件一台安装了docker的服务器查看docker-compose是否安装了一些必要的基础知识(Linux、MySQL、Nginx等)整个项目结构如下:docker-ghost/├──ghost/│└──config。production.json│└──config.development.json│└──Dockerfile│└──run.sh├──nginx/│└──copy/│└──nginx.conf│└──nginx.pem│└──nginx.key│└──Dockerfile└──docker-compose.yml创建Ghost镜像。在国内下载安装任何国外资源都会很麻烦。所以,要想保证安装速度飞起来,换源就显得非常重要了。此外,npm的安装也被cnpm取代了。其实使用yarn也是一个不错的选择。为了更进一步的速度,我使用了docker社区资源daocloud.io/library/node:6.11.2-alpine,节省了编译安装node的时间。整个Dockerfile的内容如下:FROMdaocloud.io/library/node:6.11.2-alpine#alpinechangesource,中国科学技术大学RUNcp/etc/apk/repositories/etc/apk/repositories.bak\&&echo"http://mirrs.ustc.edu.cn/alpine/v3.4/main/">/etc/apk/repositories#安装必要的文件RUNapkupdate\\&&apkadd-U--no-cachevim\bash\ca-certificates\grep\wget\unzip#npm改源,yarn改源,安装cnpmRUNnpmconfigsetregistryhttps://registry.npm.taobao.org\&&npminstall-gcnpm#设置变量#==================================ENVGHOST_VERSION1.8.1ENVNODE_ENVproductionRUNwget-qhttps://github.com/TryGhost/Ghost/releases/download/${GHOST_VERSION}/Ghost-${GHOST_VERSION}.zip-P/tmp\&&unzip-q/tmp/Ghost-${GHOST_VERSION}.zip-d/ghost#复制必要的文件COPYconfig.production.json/ghostCOPYconfig.development.json/ghostRUNcd/ghost&&ls&&cnpminstall--${NODE_ENV}#复制启动文件COPYrun.sh/usr/local/binRUNchmod+x/usr/local/bin/run.shWORKDIR/ghostVOLUME/ghost/contentEXPOSE2368LABELdescription="Ghost-$GHOST_VERSION"\maintainer="imlooke"入口点["run.sh"]CMD["./usr/local/bin/run.sh"]这样构建时间就大大缩短了,我只花了几分钟~稍微解释一下,chmod+x/usr/local/bin/run.sh给启动文件赋予权限,这个很重要Next是ghost系统需要的配置文件,config.production.json和config.development.json文件是在NODE_ENV变化的时候用到的,所以写一套Docker启动文件不仅可以用于部署,也可以用于主题或者应用开发.如果是开发主题,可以使用VOLUME指定容器可以访问的宿主文件目录。具体配置文件的配置项可以到官网查看。这部分将在后面解释。最后是容器启动的入口文件。由于本人对shell不是很了解,所以写起来很简单,不过也能满足现在的需求。具体就是设置环境变量,迁移数据库,最后开始运行。run.sh文件内容如下:#!/bin/shcd/ghostexportNODE_ENV=${NODE_ENV}node_modules/.bin/knex-migratorinit#NODE_ENV=developmentmigrateexecnodeindex.jsmakingNginxmirror的威力社区无时无刻不在影响着开发者,确实如此。我使用的是官方镜像,做了一些简单的修改。同时,我还开启了HTTPSSL域名访问,变绿了,强迫症再次得到满足。.Dockerfile的内容如下:FROMnginxENVWEB_SITEyour-blog.siteRUNmkdir-p/etc/nginx/ssl/${WEB_SITE}COPYcopy/nginx.pem/etc/nginx/ssl/${WEB_SITE}/nginx.pemCOPYcopy/nginx.key/etc/nginx/ssl/${WEB_SITE}/nginx.keyCOPYcopy/nginx.conf/etc/nginx/nginx.confLABELdescription="SSL&Ghost"\maintainer="imlooke"EXPOSE80EXPOSE443CMDnginx-g'daemonoff;'直接从这篇文章中得到了启用SSL的相关教程。nginx.conf文件内容设置反向代理,启用SSL协议,指定上传文件的大小。文件内容如下:events{worker_connections2048;}http{includemime.types;default_type应用程序/八位字节流;client_max_body_size20m;服务器{听80;返回301https://$host$request_uri;}服务器{听443ssl;server_nameyour-blog.site;access_log/var/log/nginx/your-blog.site.log;SSL开启;ssl_certificate/etc/nginx/ssl/your-blog.site/nginx.pem;ssl_certificate_key/etc/nginx/ssl/your-blog.site/nginx.key;ssl_session_timeout5m;ssl_protocolsTLSv1TLSv1.1TLSv1.2;ssl_ciphersAESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;ssl_prefer_server_ciphers开启;location/{proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerHOST$http_host;proxy_set_headerX-NginX-Proxytrue;proxy_set_headerX-Forwarded-Proto$scheme;proxy_p屁股http://ghost:2368;proxy_redirect关闭;}}}client_max_body_size20m;它规定上传文件的大小是有限制的。如果您购买了阿里云的CA认证服务并下载了相关证书,则将证书或内容复制到nginx.key、nginx.pem或直接替换为您的文件。制作Mysql镜像没有特殊设置,直接使用现成的镜像,具体配置在后面的docker-compose.yml文件中。使用docker-compose如果你的docker应用是由很多部分组成的,那么docker-compose是一个很好的统一管理它们的工具,统一的制作、启动或停止,总之非常方便。版本:'2'服务:nginx:图像:nginx构建:nginx命令:nginx-g'daemonoff;'重启:始终端口:-“80:80”-“443:443”容器名称:nginx链接:-ghostmysql:图像:mysql:最新重启:始终端口:-“3306:3306”容器名称:mysql环境:-MYSQL_ROOT_PASSWORD=your_mysql_password-MYSQL_DATABASE=ghostghost:image:ghostbuild:ghostdepends_on:-mysqlrestart:alwaysports:-"23:2368"container_name:ghostlinks:-mysqlenvironment:-NODE_ENV:production在这里配置数据库密码。restart:always会让容器在挂掉的时候自己启动。容器之间使用链接以允许它们相互访问。这是因为docker会直接将链接的指定内容映射到/etc/hosts文件中,直接添加解析。比如在ghost中添加links:\-mysql,那么在配置文件config.production.json和config.development.json中就可以这样写“database”:{"client":"mysql","connection":{"host":"mysql","user":"your_mysql_user","password":"your_mysql_password","database":"your_mysql_database"}},在nginx.conf中也加入了这样一个链接proxy_passhttp://ghost:2368;一条命令构建启动:docker-composeup-d--build这样就成功部署了自己的博客站点,并让它在后台运行。本项目后续地址awesome-ghost,欢迎留言讨论。因为觉得很好玩,所以想时不时更新一下这个小项目,增加更多的自定义设置,解决博客升级更新的问题。如果你也有兴趣,或许可以一起探讨。本例原博客地址的来源最后配置网站,同样使用自己开发的主题awesome-imlooke。打个广告,喜欢就给我个star吧?