這個問題很容易獲得回答,由於ghost
快又簡約,並且使用node.js
開發,使用起來體驗十分良好。我本身曾經用過很多的博客系統,最長一次使用WordPress
,但最後由於選擇合適插件這個問題上使我放棄了(選擇困難症,由於太多了)。node
使用docker
?好吧,一是爲了學習docker
技術,二是由於做爲學生沒有一臺穩定的服務器,每次都要從新配置服務器,很麻煩的。。mysql
廢話就說到這裏,開始進入正題。nginx
一臺安裝好docker
的服務器git
檢查docker-compose
是否安裝github
一些必要的基礎知識(Linux
、MySQL
、Nginx
等等)sql
整個項目結構長這樣docker
docker-ghost/ ├── ghost/ │ └── config.production.json │ └── config.development.json │ └── Dockerfile │ └── run.sh ├── nginx/ │ └── copy/ │ └── nginx.conf │ └── nginx.pem │ └── nginx.key │ └── Dockerfile └── docker-compose.yml
在國內任何國外資源下載安裝起來都會很麻煩,因此爲了保證安裝速度飛起來,換源是很重要的,另外npm install
也換成了cnpm
,其實使用yarn也是不錯的選擇。爲了進一步的快速,我使用了docker
社區資源daocloud.io/library/node:6.11.2-alpine
,省去了編譯安裝node
的時間。整個Dockerfile
文件內容以下:shell
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 # 設置變量 # ================================ 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 # 複製必要文件 COPY config.production.json /ghost COPY config.development.json /ghost RUN cd /ghost && ls && cnpm install --${NODE_ENV} # 複製啓動文件 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
的時間就被極大縮短,我只用了幾分鐘~數據庫
稍微解釋一下,chmod +x /usr/local/bin/run.sh
爲啓動文件賦予權限,這個很重要。npm
接下來是ghost
系統須要的配置文件,config.production.json
、config.development.json
文件分別在NODE_ENV
變化時被使用,這樣編寫一套Docker
啓動文件不只部署可用,也可用於主題或應用開發。若是是開發主題可使用VOLUME
指定容器可訪問的宿主機文件目錄。具體配置文件的配置項能夠移步到官網查看。這一部份內容後續還有說明。
最後是容器啓動的入口文件了,因爲並不十分了解shell
因此寫的很簡單,可是也知足了當下需求。具體就是設置了環境變量,遷移數據庫,最後運行啓動。run.sh
文件內容以下:
#!/bin/sh cd /ghost export NODE_ENV=${NODE_ENV} node_modules/.bin/knex-migrator init # NODE_ENV=development migrate exec node index.js
社區的強大無時無刻不在影響開發者,真的是這樣。我使用了官方鏡像,而且加以簡單的修改,同時還啓用了HTTP SSL
域名訪問變成了綠色的,強迫症再一次被知足。。Dockerfile
文件內容以下:
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
的相關教程我直接獲取自這篇文章。nginx.conf
文件內容設置了反向代理、啓用SSL
協議以及規定上傳文件大小。文件內容以下:
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;
就規定的是上傳文件限制的大小。若是從阿里雲購買了CA認證服務並下載了相關證書,再將證書或內容複製到nginx.key
、nginx.pem
或直接替換爲你的文件。
這一部分沒有什麼特殊設置,因此直接使用了現成的鏡像,具體的配置在後續的docker-compose.yml
文件之中。
若是你的docker
應用是由好多個部分組成的,那麼docker-compose
是統一管理它們的良好工具,統一製做、啓動或中止,總之很是方便。
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
在這裏配置要數據庫密碼。restart: always
會讓容器掛掉的時候本身自行啓動。容器之間使用了links
讓其能夠互相訪問,這是由於docker
會將links
的規定內容直接映射到/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;
一條命令來構建並啓動:
docker-compose up -d --build
這樣成功部署了屬於本身的博客網站,而且也讓其後臺運行了。
本項目的地址在awesome-ghost,歡迎留言討論。
由於覺着很好玩,想要不按期更新這個小項目,添加更多自定義設置,解決博客升級更新的問題。若是你也有興趣或許能夠一塊兒討論。
最後配置一下網站,也使用了本身開發的主題awesome-imlooke。作個廣告,喜歡就留個star給我吧?