Docker測試一個靜態網站

使用Docker測試靜態網站

將Docker作爲本地Web開發環境是Docker的一個最簡單的應用場景。 這樣的環境可以完全複製生產環境,並確保用戶開發的東西在生產環境中也能運行。下面從將Nginx Web服務器安裝到容器來架構一個簡 單的網站開始。這個網站暫且命名爲Sample。 

Sample網站的初始Dockerfile

爲了完成網站開發,從這個簡單的Dockerfile開始。先來創建一個 目錄,保存Dockerfile

$ mkdir sample 
$ cd sample 
$ touch Dockerfile

現在還需要一些Nginx配置文件,才能運行這個網站。首先在這個示例 所在的目錄裏創建一個名爲nginx的目錄,用來存放這些配置文件。 然後我們可以從GitHub上下載作者準備好的示例文件

$ mkdir nginx && cd nginx 
$ wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/global.conf 
$ wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/nginx.conf 
$ cd ..

現在看一下我們將要爲Sample網站創建的Dockerfile,如代碼清單

FROM centos
MAINTAINER heian99 "[email protected]" 
ENV REFRESHED_AT 2014-06-01 
RUN yum -y update && yum  -y install nginx 
RUN mkdir -p /var/www/html/website 
ADD nginx/global.conf /etc/nginx/conf.d/ 
ADD nginx/nginx.conf /etc/nginx/nginx.conf 
EXPOSE 80

這個簡單的Dockerfile內容包括以下幾項。

  • 安裝Nginx。

  • 在容器中創建一個目錄/var/www/html/website/。

  • 將來自我們下載的本地文件的Nginx配置文件添加到鏡像中。

  • 公開鏡像的80端口。

這個Nginx配置文件是爲了運行Sample網站而配置的。將文件 nginx/global.conf用ADD指令複製到/etc/nginx/conf.d/目 錄中。配置文件

global.conf

server {
        listen          0.0.0.0:80;
        server_name     _;

        root            /var/www/html/website;
        index           index.html index.htm;

        access_log      /var/log/nginx/default_access.log;
        error_log       /var/log/nginx/default_error.log;
}

這個文件將Nginx設置爲監聽80端口,並將網絡服務的根路徑設置 爲/var/www/ html/website,這個目錄是我們用RUN指令創建 的。
我們還需要將Nginx配置爲非守護進程的模式,這樣可以讓Nginx在 Docker容器裏工作。將文件nginx/nginx.conf複製 到/etc/nginx目錄就可以達到這個目的

nginx.conf的清單

user www-data;#把這個刪除掉,不然後面docker裏面的nginx無法啓動
worker_processes 4;
pid /run/nginx.pid;
daemon off;

events {  }

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  gzip on;
  gzip_disable "msie6";
  include /etc/nginx/conf.d/*.conf;
}

在這個配置文件裏,daemon off;選項阻止Nginx進入後臺,強制其 在前臺運行。這是因爲要想保持Docker容器的活躍狀態,需要其中運 行的進程不能中斷。默認情況下,Nginx會以守護進程的方式啓動,這 會導致容器只是短暫運行,在守護進程被fork啓動後,發起守護進程 的原始進程就會退出,這時容器就停止運行了

這個文件通過ADD指令複製到/etc/nginx/nginx.conf。

第一個指令以 目錄/etc/nginx/ conf.d/結束,而第二個指令指定了文 件/etc/nginx/nginx.conf。將文件複製到Docker鏡像時,這兩 種風格都是可以用的。

構建Sample網站和Nginx鏡像

利用之前的Dockerfile,可以用docker build命令構建出新的鏡 像,並將這個鏡像命名爲heian/nginx

docker build -t heian/nginx .

這將構建並命名一個新鏡像。下面來看看構建的執行步驟。使用 docker history命令查看構建新鏡像的步驟和層級

 從Sample網站和Nginx鏡像構建容器

現在可以使用heian/nginx鏡像,並開始從這個鏡像構建可以用 來測試Sample網站的容器。爲此,需要添加Sample網站的代碼。現在
注意提示下載這段代碼到sample目錄

$ mkdir website && cd website 
$ wget http://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/website/index.html
$ cd..

現在來看看如何使用docker run命令來運行一個容器

docker run -d -p 80 --name website  -v $PWD/website:/var/www/html/website heian/nginx nginx

上面命令如果有問題,那就執行下面的命令

docker run -d  -p 80 --name nginx -v $PWD/website:/var/www/html/website  heian/nginx /bin/bash -c "tail -f /dev/null;/usr/sbin/nginx"

可以看到,在執行docker run時傳入了nginx作爲容器的啓動命令。一般情況下, 這個命令無法讓Nginx以交互的方式運行。我們已經在提供給Docker的配置里加入了指令 daemon off,這個指令讓Nginx啓動後以交互的方式在前臺運行

可以看到,我們使用docker run命令從heian/nginx鏡像創建 了一個名爲website的容器。讀者已經見過了大部分選項,不過-v選 項是新的。-v這個選項允許我們將宿主機的目錄作爲卷,掛載到容器 裏。
回到剛纔的例子。當我們因爲某些原因不想把應用或者代碼構建到鏡 像中時,就體現出卷的價值了。例如:

  • 希望同時對代碼做開發和測試;
  • 代碼改動很頻繁,不想在開發過程中重構鏡像;
  • 希望在多個容器間共享代碼

-v選項通過指定一個目錄或者登上與容器上與該目錄分離的本地宿主 機來工作,這兩個目錄用:分隔。如果容器目錄不存在,Docker會自 動創建一個。
 

 docker run -d -p 80 --name website \
 -v $PWD/website:/var/www/html/website:ro \ 
heian/nginx nginx

這將使目的目錄/var/www/html/website變成只讀狀態。

在Nginx網站容器裏,我們通過卷將$PWD/website掛載到容器 的/var/www/ html/website目錄,順利掛載了正在開發的本地網 站。在Nginx配置裏(在配置文 件/etc/ngingx/conf.d/global.conf中),已經指定了這個目 錄爲Nginx服務器的工作目錄。
現在,如果使用docker ps命令查看正在運行的容器,可以看到名爲 website的容器正處於活躍狀態,容器的80端口被映射到宿主機的 49161端口

修改網站

我們已經得到了一個可以工作的網站!現在,如果要修改網站,該怎 麼辦?可以直接打開本地宿主機的website目錄下的index.html文 件並修改

可以看到,Sample網站已經更新了。顯然這個修改太簡單了,不過可 以看出,更復雜的修改也並不困難。更重要的是,正在測試網站的運 行環境,完全是生產環境裏的真實狀態。現在可以給每個用於生產的 網站服務環境(如Apache、Nginx)配置一個容器,給不同開發框架 的運行環境(如PHP或者Ruby on Rails)配置一個容器,或者給後端 數據庫配置一個容器,等等。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章