前言
老實說悯许,不用Docker來架設(shè)nginx服務(wù)器仆嗦,是更方便的。
sudo apt-get install nginx
當(dāng)然先壕,如果你要指定最新版本瘩扼,會麻煩一些,需要從源碼編譯安裝垃僚,但也復(fù)雜不到哪兒去集绰。
Docker的優(yōu)勢是便于大規(guī)模部署。個人或小公司的單臺谆棺、幾臺服務(wù)器的部署栽燕,直接安裝可能更方便一些,解決問題也更便捷一些改淑。我作為一個個人用戶碍岔,用Docker更多是一種學(xué)習(xí)、或者趣向朵夏。
本文主旨是展示一次簡單的docker使用過程蔼啦,不對原理做出過多描述。默認(rèn)讀者已經(jīng)知道Nginx侍郭、Docker的基本概念询吴,已經(jīng)具備一臺(Debian/Ubutu系的)Linux服務(wù)器或本地電腦,并且已經(jīng)安裝了docker亮元、docker-compose。
Nginx的Docker鏡像
雖然唠摹,從基礎(chǔ)鏡像開始爆捞,自行寫一個Dockerfile,然后通過docker build
來創(chuàng)建一個Docker鏡像勾拉,也并不是太難煮甥。但是盗温,這很繁瑣,足以嚇跑三分之二的初學(xué)者成肘,并且未必能收到最好的部署效果卖局。
一般要用Docker安裝一個東西的第一個步驟是,看看已經(jīng)有什么鏡像双霍。
$ sudo docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 5358 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 947 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 349 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as... 149 [OK]
……
事實是砚偶,常用鏡像、或者新鮮出爐的服務(wù)洒闸,都早已有人做好了鏡像染坯。像Nginx這樣的,還有官方(Official)鏡像丘逸。
$ sudo docker pull nginx
這樣单鹿,官方鏡像已輕松收入囊中。
鏡像版本的選擇
默認(rèn)情況下深纲,鏡像的tag是latest仲锄。這是個類似git的master分支的東西,往往是最新版本的鏡像湃鹊。最新儒喊,意味著不穩(wěn)定。個人折騰時無所謂涛舍,如果是正式部署澄惊,還是需要追求穩(wěn)定。
對目前(2017年2月)的Nginx來說富雅,有以下常用鏡像可供選擇:
1.11.10
,mainline
,1
,1.11
, latest (mainline/jessie/Dockerfile)1.11.10-alpine
,mainline-alpine
,1-alpine
,1.11-alpine
, alpine (mainline/alpine/Dockerfile)1.10.3
,stable
,1.10
(stable/jessie/Dockerfile)1.10.3-alpine
,stable-alpine
,1.10-alpine
(stable/alpine/Dockerfile)
我個人傾向于選擇stable-alpine
掸驱,它遠(yuǎn)比普通基于Debian制作的鏡像要小得多。
This image is based on the popular Alpine Linux project, available in the alpine official image. Alpine Linux is much smaller than most distribution base images (~5MB), and thus leads to much slimmer images in general.
Nginx的Debian與Alpine鏡像的比較:
基礎(chǔ)鏡像 | Docker Hub 大忻挥印(壓縮狀態(tài)) | 本地大斜显簟(解壓狀態(tài)) |
---|---|---|
Debian | 72 MB | 181.5 MB |
Alpine | 18 MB | 57.18 MB |
雖然沒有詳細(xì)比較過運行時的性能差異,不過僅鏡像大小差異就足夠初次使用者做出選擇了蛤奢。
Alpine這個冷門的Linux發(fā)行版鬼癣,在Docker時代似乎正在開始流行起來。
使用docker-compose
直接使用docker run
命令來運行一個容器啤贩,是比較麻煩的待秃。
sudo docker run \
-p 80:80 \
-v /srv/nginx/nginx.conf:/etc/nginx/nginx.conf \
...
-d
nginx:stable-alpine
這么長的命令,是不適合在命令行敲的痹屹。所以章郁,通常需要寫到一個shell文件里。
既然需要一個文件志衍,為何不用docker-compose呢暖庄?
# vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:
version: '2'
services:
nginx:
image: nginx:stable-alpine
restart: unless-stopped
network_mode: host
volumes:
- /srv/nginx/nginx.conf:/etc/nginx/nginx.conf
- /srv/nginx/conf.d:/etc/nginx/conf.d
- /srv/nginx/html:/usr/share/nginx/html
- /var/log/nginx:/var/log/nginx
ports:
- "80:80"
environment:
- NGINX_HOST=your.domain
- NGINX_PORT=80
將上述內(nèi)容聊替,寫入一個docker-compose.yml文件。在同級目錄培廓,執(zhí)行sudo docker-compose up
惹悄,即可等價于一個超復(fù)雜的docker run ...
。
docker-compose最擅長的是描述一組容器的配置與關(guān)系肩钠,同時啟動或關(guān)閉泣港。但如果單個容器的配置也很復(fù)雜,我也傾向于使用它蔬将。
內(nèi)容管理
玩Nginx爷速,主要就是改它的配置。在最近的版本中霞怀,默認(rèn)配置是在/etc/nginx/nginx.conf
惫东,而默認(rèn)的的網(wǎng)頁是在/usr/share/nginx/html
。
我看過一些其它的教程毙石,是基于官方鏡像廉沮,把自己的配置復(fù)制進(jìn)去,build出一個新的鏡像徐矩,然后再運行滞时。這樣的方案不太好,多加了一層滤灯,還不利于更新坪稽。
其實,把主機上需要修改和配置的內(nèi)容鳞骤,變成數(shù)據(jù)卷(Volume)掛載到容器中就好了窒百,就如我前面的docker-compose配置。
volumes:
- /srv/nginx/nginx.conf:/etc/nginx/nginx.conf
- /srv/nginx/conf.d:/etc/nginx/conf.d
- /srv/nginx/html:/usr/share/nginx/html
- /var/log/nginx:/var/log/nginx
雖然從實現(xiàn)技術(shù)來說豫尽,是把主機的目錄作為Volumn掛載到容器中去篙梢,但我還是更喜歡看做是把容器內(nèi)的東西,映射到外面的主機上來美旧,就像軟鏈接一樣渤滞。所謂理解,就是用簡單代表復(fù)雜榴嗅,用熟悉解釋陌生妄呕。
這里,所有內(nèi)容都放到主機的/srv/nginx
目錄下嗽测,讓掛載進(jìn)容器使用趴腋;而/var
那邊,相當(dāng)于把log也映射出來论咏。這樣优炬,在主機上也可以方便地修改配置與網(wǎng)頁,并且可以查看log厅贪。
如果考慮到更方便的部署與遷移蠢护,甚至可以把Nginx的配置與docker-compose.yml放在同一個目錄,組成一個Git庫养涮。volumes參數(shù)葵硕,也可改成相對路徑。然后贯吓,三條命令就可以在一臺機器上部署一個網(wǎng)站懈凹。
git clone git@server:repo/name.git Website
cd Website
sudo docker-compose up
這樣的部署方案,如此簡潔悄谐,以致優(yōu)雅介评。
參考
- Nginx的Docker頁面:https://hub.docker.com/r/library/nginx/
- Nginx的Dockerfile的GitHub頁面:
https://github.com/nginxinc/docker-nginx - 《Docker 安裝 Nginx》
- 《Docker — 從入門到實踐》
附錄
最后,以審美的目光爬舰,欣賞一下Nginx的stable鏡像的Dockerfile们陆。
FROM debian:jessie
MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
ENV NGINX_VERSION 1.10.3-1~jessie
RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
&& echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y \
ca-certificates \
nginx=${NGINX_VERSION} \
nginx-module-xslt \
nginx-module-geoip \
nginx-module-image-filter \
nginx-module-perl \
nginx-module-njs \
gettext-base \
&& rm -rf /var/lib/apt/lists/*
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
該文件地址:
https://github.com/nginxinc/docker-nginx/tree/master/stable/jessie
曾經(jīng)有個想法,要把一些復(fù)雜的軟件安裝的過程情屹,從最初始的發(fā)行版開始腳本化坪仇,以便于二次安裝、移植垃你、大規(guī)模部署椅文、調(diào)試、除錯……
這些惜颇,Docker都以更優(yōu)雅的方式實現(xiàn)了皆刺。
集裝箱改變世界。