Ubuntu18.04 下使用 Docker 測試靜態網站

Sample 網站的初始 Dockerfile

mkdir sample && cd sample
touch Dockerfile

需要一些配置文件才能運行這個網站:

cd sample
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 ..

Dockerfile 編輯如下:

FROM ubuntu:14.04
MAINTAINER nikki "[email protected]"
ENV REFRESHED_AT 2019-10-18
RUN apt-get update
RUN apt-get -y install nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

Dockerfile 主要內容:

  • 安裝 Nginx
  • 在容器中創建一個目錄 /var/www/html
  • 將來自我們下載的本地文件的 Nginx 配置文件添加到鏡像中
  • 公開鏡像的 80 端口

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 在 Docker 容器裏工作,因此還需要將 Nginx 配置爲非守護進程的模式,將文件 nginx/nginx.conf 複製到 /etc/nginx 目錄就是可以達到這個目的,nginx.conf:

user www-data;
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 進入後臺,強制在前臺運行

默認情況下,Nginx 會以守護進程的方式啓動,這會導致容器只是短暫運行,在守護進程被 fork 啓動後,發起守護進程的原始進程就會退出,容器就會停止運行

Dockerfile 指令目錄中 ADD 以 conf.d 和 nginx.conf 兩種風格都是允許的

構建 Sample 網站和 Nginx 鏡像

sudo docker build -t nikki01/nginx .

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

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

這將在 sample 目錄中創建一個名爲 website 的目錄,然後爲 Sample 網站下載 index.html 文件,放到 website 目錄中

現在創建一個容器:

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

-v 選項允許將宿主機的目錄作爲卷,掛載到容器中

卷是在一個或多個容器內被選定的目錄,可以繞過分層的聯合文件系統,爲 Docker 提供持久數據或共享數據,這意味着對卷的修改會直接生效,並繞過鏡像。當提交或創建鏡像時,卷不被包含在鏡像裏

卷可以在容器間共享,即使容器停止,卷裏的內容依舊存在

卷的價值:

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

-v 制定了卷的源目錄(本地宿主機的目錄)和容器裏的目的目錄,這兩個目錄通過 : 分隔,如果目的目錄不存在,Docker 會自動創建一個

也可以通過在目的目錄後面加上 rw 或 ro 制定目的目錄的讀寫狀態:

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

此時,目的目錄變成只讀狀態

sudo docker ps -l

查看端口映射

打開瀏覽器,輸入:

localhost:顯示的端口號

查看 sample 網站

vi $PWD/website/idnex.html

可以直接在文件中修改網頁內容,之後刷新網頁即可

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