建立博客隙券,使用Docker部署Ghost+MySQL+Nginx

為什么是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給我吧??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昆婿,一起剝皮案震驚了整個(gè)濱河市球碉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仓蛆,老刑警劉巖睁冬,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異看疙,居然都是意外死亡豆拨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門能庆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來施禾,“玉大人,你說我怎么就攤上這事相味∈盎” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵丰涉,是天一觀的道長拓巧。 經(jīng)常有香客問我,道長一死,這世上最難降的妖魔是什么肛度? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮投慈,結(jié)果婚禮上承耿,老公的妹妹穿的比我還像新娘。我一直安慰自己伪煤,他們只是感情好加袋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抱既,像睡著了一般职烧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上防泵,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天蚀之,我揣著相機(jī)與錄音,去河邊找鬼捷泞。 笑死足删,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锁右。 我是一名探鬼主播失受,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讶泰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贱纠?” 一聲冷哼從身側(cè)響起峻厚,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谆焊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浦夷,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辖试,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劈狐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罐孝。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肥缔,靈堂內(nèi)的尸體忽然破棺而出莲兢,到底是詐尸還是另有隱情,我是刑警寧澤续膳,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布改艇,位于F島的核電站,受9級(jí)特大地震影響坟岔,放射性物質(zhì)發(fā)生泄漏谒兄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一社付、第九天 我趴在偏房一處隱蔽的房頂上張望承疲。 院中可真熱鬧,春花似錦鸥咖、人聲如沸燕鸽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啊研。三九已至,卻和暖如春熙兔,著一層夾襖步出監(jiān)牢的瞬間悲伶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工住涉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麸锉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓舆声,卻偏偏與公主長得像花沉,于是被迫代替她去往敵國和親柳爽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理碱屁,服務(wù)發(fā)現(xiàn)磷脯,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 有關(guān)docker的介紹啊,為什么 要使用docker啊這些就不說了柿赊,因?yàn)楫?dāng)你點(diǎn)開這篇作文的時(shí)候俩功,你自己心里已經(jīng)有了...
    葉同學(xué)閱讀 8,222評(píng)論 6 15
  • 首先,祝各位新年快樂碰声,萬事如意诡蜓,雞年大吉。 這次要來說說一個(gè)和前端并不太相關(guān)的東西——docker compose...
    6ed7563919d4閱讀 4,224評(píng)論 0 21
  • 對(duì)胰挑,我說了蔓罚,艾艾不是個(gè)招人喜歡的姑娘。 她嗓門可太大了瞻颂。一次因?yàn)橛袀€(gè)環(huán)衛(wèi)工人在騎三輪車經(jīng)過豺谈,把她日本買回來的太陽傘...
    我的企鵝丟了閱讀 127評(píng)論 0 0
  • 靜謐而美好
    淡色如初閱讀 196評(píng)論 0 0