為什么是Ghost男应、Docker
這個(gè)問題很容易得到回答,因?yàn)?code>ghost快又簡約娱仔,而且使用node.js
開發(fā)沐飘,使用起來體驗(yàn)十分良好。我自己曾經(jīng)用過不少的博客系統(tǒng),最長一次使用WordPress
,但最后因?yàn)檫x擇合適插件這個(gè)問題上使我放棄了(選擇困難癥耐朴,因?yàn)樘嗔耍?/p>
使用docker
?好吧借卧,一是為了學(xué)習(xí)docker
技術(shù),二是因?yàn)樽鳛閷W(xué)生沒有一臺(tái)穩(wěn)定的服務(wù)器筛峭,每次都要重新配置服務(wù)器铐刘,很麻煩的。蜒滩。
廢話就說到這里滨达,開始進(jìn)入正題。
前提條件
- 一臺(tái)安裝好
docker
的服務(wù)器 - 檢查
docker-compose
是否安裝 - 一些必要的基礎(chǔ)知識(shí)(
Linux
俯艰、MySQL
捡遍、Nginx
等等)
整個(gè)項(xiàng)目結(jié)構(gòu)長這樣
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鏡像
在國內(nèi)任何國外資源下載安裝起來都會(huì)很麻煩,所以為了保證安裝速度飛起來竹握,換源是很重要的画株,另外npm install
也換成了cnpm
,其實(shí)使用yarn也是不錯(cuò)的選擇啦辐。為了進(jìn)一步的快速谓传,我使用了docker
社區(qū)資源daocloud.io/library/node:6.11.2-alpine
,省去了編譯安裝node
的時(shí)間芹关。整個(gè)Dockerfile
文件內(nèi)容如下:
FROM daocloud.io/library/node:6.11.2-alpine
# alpine換源,中科大
RUN cp /etc/apk/repositories /etc/apk/repositories.bak \
&& echo "http://mirrors.ustc.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories
# 安裝必要文件
RUN apk update \
\
&& apk add -U --no-cache vim \
bash \
ca-certificates \
grep \
wget \
unzip
# npm換源,yarn換源,安裝cnpm
RUN npm config set registry https://registry.npm.taobao.org \
&& npm install -g cnpm
# 設(shè)置變量
# ================================
ENV GHOST_VERSION 1.8.1
ENV NODE_ENV production
RUN wget -q https://github.com/TryGhost/Ghost/releases/download/${GHOST_VERSION}/Ghost-${GHOST_VERSION}.zip -P /tmp \
&& unzip -q /tmp/Ghost-${GHOST_VERSION}.zip -d /ghost
# 復(fù)制必要文件
COPY config.production.json /ghost
COPY config.development.json /ghost
RUN cd /ghost && ls && cnpm install --${NODE_ENV}
# 復(fù)制啟動(dòng)文件
COPY run.sh /usr/local/bin
RUN chmod +x /usr/local/bin/run.sh
WORKDIR /ghost
VOLUME /ghost/content
EXPOSE 2368
LABEL description="Ghost-$GHOST_VERSION" \
maintainer="imlooke <lwx12525@outlook.com>"
ENTRYPOINT ["run.sh"]
CMD ["./usr/local/bin/run.sh"]
這么一來build
的時(shí)間就被極大縮短续挟,我只用了幾分鐘~
稍微解釋一下,chmod +x /usr/local/bin/run.sh
為啟動(dòng)文件賦予權(quán)限侥衬,這個(gè)很重要诗祸。
接下來是ghost
系統(tǒng)需要的配置文件,config.production.json
轴总、config.development.json
文件分別在NODE_ENV
變化時(shí)被使用直颅,這樣編寫一套Docker
啟動(dòng)文件不僅部署可用,也可用于主題或應(yīng)用開發(fā)怀樟。如果是開發(fā)主題可以使用VOLUME
指定容器可訪問的宿主機(jī)文件目錄功偿。具體配置文件的配置項(xiàng)可以移步到官網(wǎng)查看。這一部分內(nèi)容后續(xù)還有說明往堡。
最后是容器啟動(dòng)的入口文件了械荷,由于并不十分了解shell
所以寫的很簡單,但是也滿足了當(dāng)下需求虑灰。具體就是設(shè)置了環(huán)境變量养葵,遷移數(shù)據(jù)庫,最后運(yùn)行啟動(dòng)瘩缆。run.sh
文件內(nèi)容如下:
#!/bin/sh
cd /ghost
export NODE_ENV=${NODE_ENV}
node_modules/.bin/knex-migrator init
# NODE_ENV=development migrate
exec node index.js
制作Nginx鏡像
社區(qū)的強(qiáng)大無時(shí)無刻不在影響開發(fā)者,真的是這樣佃蚜。我使用了官方鏡像庸娱,并且加以簡單的修改着绊,同時(shí)還啟用了HTTP SSL
域名訪問變成了綠色的,強(qiáng)迫癥再一次被滿足熟尉。归露。Dockerfile
文件內(nèi)容如下:
FROM nginx
ENV WEB_SITE your-blog.site
RUN mkdir -p /etc/nginx/ssl/${WEB_SITE}
COPY copy/nginx.pem /etc/nginx/ssl/${WEB_SITE}/nginx.pem
COPY copy/nginx.key /etc/nginx/ssl/${WEB_SITE}/nginx.key
COPY copy/nginx.conf /etc/nginx/nginx.conf
LABEL description="SSL & Ghost" \
maintainer="imlooke <lwx12525@outlook.com>"
EXPOSE 80
EXPOSE 443
CMD nginx -g 'daemon off;'
啟用SSL
的相關(guān)教程我直接獲取自這篇文章。nginx.conf
文件內(nèi)容設(shè)置了反向代理斤儿、啟用SSL
協(xié)議以及規(guī)定上傳文件大小剧包。文件內(nèi)容如下:
events {
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 20m;
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your-blog.site;
access_log /var/log/nginx/your-blog.site.log;
ssl on;
ssl_certificate /etc/nginx/ssl/your-blog.site/nginx.pem;
ssl_certificate_key /etc/nginx/ssl/your-blog.site/nginx.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://ghost:2368;
proxy_redirect off;
}
}
}
client_max_body_size 20m;
就規(guī)定的是上傳文件限制的大小。如果從阿里云購買了CA認(rèn)證服務(wù)并下載了相關(guān)證書往果,再將證書或內(nèi)容復(fù)制到nginx.key
疆液、nginx.pem
或直接替換為你的文件。
制作Mysql鏡像
這一部分沒有什么特殊設(shè)置陕贮,所以直接使用了現(xiàn)成的鏡像堕油,具體的配置在后續(xù)的docker-compose.yml
文件之中。
使用docker-compose
如果你的docker
應(yīng)用是由好多個(gè)部分組成的肮之,那么docker-compose
是統(tǒng)一管理它們的良好工具掉缺,統(tǒng)一制作、啟動(dòng)或停止戈擒,總之非常方便眶明。
version: '2'
services:
nginx:
image: nginx
build: nginx
command: nginx -g 'daemon off;'
restart: always
ports:
- "80:80"
- "443:443"
container_name: nginx
links:
- ghost
mysql:
image: mysql:latest
restart: always
ports:
- "3306:3306"
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD=your_mysql_password
- MYSQL_DATABASE=ghost
ghost:
image: ghost
build: ghost
depends_on:
- mysql
restart: always
ports:
- "2368:2368"
container_name: ghost
links:
- mysql
environment:
- NODE_ENV:production
在這里配置要數(shù)據(jù)庫密碼。restart: always
會(huì)讓容器掛掉的時(shí)候自己自行啟動(dòng)筐高。容器之間使用了links
讓其可以互相訪問搜囱,這是因?yàn)?code>docker會(huì)將links
的規(guī)定內(nèi)容直接映射到/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_pass http://ghost:2368;
一條命令來構(gòu)建并啟動(dòng):
docker-compose up -d --build
這樣成功部署了屬于自己的博客網(wǎng)站幌缝,并且也讓其后臺(tái)運(yùn)行了。
后續(xù)
- 本項(xiàng)目的地址在awesome-ghost诫欠,歡迎留言討論涵卵。
- 因?yàn)橛X著很好玩,想要不定期更新這個(gè)小項(xiàng)目荒叼,添加更多自定義設(shè)置轿偎,解決博客升級(jí)更新的問題。如果你也有興趣或許可以一起討論被廓。
- 本案例的博客地址
- 原文出處
最后配置一下網(wǎng)站坏晦,也使用了自己開發(fā)的主題awesome-imlooke。做個(gè)廣告,喜歡就留個(gè)star給我吧??