創建博客,使用Docker部署Ghost+MySQL+Nginx

爲何是Ghost、Docker

這個問題很容易獲得回答,由於ghost快又簡約,並且使用node.js開發,使用起來體驗十分良好。我本身曾經用過很多的博客系統,最長一次使用WordPress,但最後由於選擇合適插件這個問題上使我放棄了(選擇困難症,由於太多了)。node

使用docker?好吧,一是爲了學習docker技術,二是由於做爲學生沒有一臺穩定的服務器,每次都要從新配置服務器,很麻煩的。。mysql

廢話就說到這裏,開始進入正題。nginx

前提條件

  • 一臺安裝好docker的服務器git

  • 檢查docker-compose是否安裝github

  • 一些必要的基礎知識(LinuxMySQLNginx等等)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

創建Ghost鏡像

在國內任何國外資源下載安裝起來都會很麻煩,因此爲了保證安裝速度飛起來,換源是很重要的,另外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.jsonconfig.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

製做Nginx鏡像

社區的強大無時無刻不在影響開發者,真的是這樣。我使用了官方鏡像,而且加以簡單的修改,同時還啓用了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.keynginx.pem或直接替換爲你的文件。

製做Mysql鏡像

這一部分沒有什麼特殊設置,因此直接使用了現成的鏡像,具體的配置在後續的docker-compose.yml文件之中。

使用docker-compose

若是你的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.jsonconfig.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給我吧?

相關文章
相關標籤/搜索