Docker運行nginx

Introduction

原文地址:Docker運行nginx - FindHao

本文介紹了從docker hub拉取官方nginx鏡像並自定義部分配置,綁定埠運行的過程。

docekr 學習目錄

nginx簡介

Nginx是一款面向性能設計的HTTP伺服器,相較於Apache、lighttpd具有佔有內存少,穩定性高等優勢。與舊版本(<=2.2)的Apache不同,nginx不採用每客戶機一線程的設計模型,而是充分使用非同步邏輯,削減了上下文調度開銷,所以並發服務能力更強。整體採用模塊化設計,有豐富的模塊庫和第三方模塊庫,配置靈活。 在Linux操作系統下,nginx使用epoll事件模型,得益於此,nginx在Linux操作系統下效率相當高。同時Nginx在OpenBSD或FreeBSD操作系統上採用類似於epoll的高效事件模型kqueue。

docker hub拉取

docker hub是docker官方的鏡像源,裡面有做好的nginx docker image,當然也可以發布自己的鏡像到上面去。

如果官方鏡像速度很慢,可以考慮用

阿里雲的docker鏡像倉庫

主要步驟如下:

  • 登錄阿里雲的docker鏡像倉庫
  • 獲取專屬加速器地址
  • 升級docker客戶端(建議在1.6.0以上)
  • 修改daemon配置文件(阿里已經給出了所有的命令,基本上只要copy paste即可)

然後使用

docker pull nginxn

就可以快速下載官方的nginx docker image了。

基礎的docker命令可以參看Docker初體驗

Nginx docker image

在docker官方的頁面上,有部分樣例的說明。可以發現,網站的主目錄是/usr/share/nginx/html,這跟我搜到的一些文章的說明不同。

我的需求是實現nginx搭建的文件瀏覽站。說白了就是下載站。實驗室(or校園內)共享文件。原來採用的是Python救急HttpServer和Ftpserver,儘管後來採用了python多線程啟動httpserver,但還是經常因為卡線程的問題,導致地址訪問失敗。所以那個方法作為臨時應急工具還是可以的,但是如果想要長期共享文件,必須採用有完善功能的http server。

nginx的配置文件都在/etc/nginx/下面,可以看到熟悉的conf.d文件夾,明顯裡面是用戶自定義配置文件的位置。

修改自定義配置

default.conf文件內容如下:

server {n listen 80;n server_name localhost;nn #charset koi8-r;n #access_log /var/log/nginx/log/host.access.log main;n root /usr/share/nginx/html;n location / {n root /usr/share/nginx/html;n index index.html index.htm;n ## 下面三行是添加的。n autoindex on;n autoindex_exact_size on;n autoindex_localtime on;n }nn #error_page 404 /404.html;nn # redirect server error pages to the static page /50x.htmln #n error_page 500 502 503 504 /50x.html;n location = /50x.html {n root /usr/share/nginx/html;n }nn # proxy the PHP scripts to Apache listening on 127.0.0.1:80n #n #location ~ .php$ {n # proxy_pass http://127.0.0.1;n #}nn # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000n #n #location ~ .php$ {n # root html;n # fastcgi_pass 127.0.0.1:9000;n # fastcgi_index index.php;n # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;n # include fastcgi_params;n #}nn # deny access to .htaccess files, if Apaches document rootn # concurs with nginxs onen #n #location ~ /.ht {n # deny all;n #}n}n

只需要完整的複製出來,並添加

autoindex on;nautoindex_exact_size on;nautoindex_localtime on;n

運行

docker run -p 8001:80 --name mynginx-v /home/embedded_310/haoyueming/2017:/usr/share/nginx/html:ro -v /home/embedded_310/haoyueming/dockerfile/default.conf:/etc/nginx/conf.d/default.conf -d --restart=always nginx n

run

啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。新建並啟動所需要的命令主要為 docker run。

-p

埠綁定 外部埠 : 容器內埠

–name

給容器制定一個特定的名字,而不是自動生成的一長串hex。

-v

使用 -v 標記也可以指定掛載一個本地主機的目錄到容器中去。 -v 本地文件夾:容器里的文件夾:讀寫許可權

-d

更多的時候,需要讓 Docker在後台運行而不是直接把執行命令的結果輸出在當前宿主機下。此時,可以通過添加 -d 參數來實現。

–restart=always

運行容器時使用–restart參數可以指定一個restart策略,來指示在退出時容器應該如何重啟或不應該重啟。

no – 容器退出時不要自動重啟。這個是默認值。

on-failure[:max-retries] – 只在容器以非0狀態碼退出時重啟。可選的,可以退出docker daemon嘗試重啟容器的次數。

always – 不管退出狀態碼是什麼始終重啟容器。當指定always時,docker daemon將無限次數地重啟容器。容器也會在daemon啟動時嘗試重啟,不管容器當時的狀態如何。

unless-stopped – 不管退出狀態碼是什麼始終重啟容器,不過當daemon啟動時,如果容器之前已經為停止狀態,不要嘗試啟動它。

nginx

鏡像的名稱,表示以什麼鏡像作為底包新建一個容器。

tips

我之前運行的時候,一般都採用互動式:

-i 保證容器的stdin開啟-t 為容器生成一個tty終端,在命令的最後加一個/bin/bash來保證可以交互。但是實際上,nginx並沒有運行,導致我以為容器的埠綁定不是持久化的。

以前的錯誤做法:

docker run -it nginx /bin/bashn

Reference

docker 從入門到實踐

[Docker run參考(7) – Restart策略(–restart)](https://www.centos.bz/2017/01/docker-run-restart-policy/)


推薦閱讀:

一個基於 Docker 的負載均衡實例
深度調查:24%的Docker鏡像都存在嚴重漏洞
如何編寫最佳的Dockerfile
Docker集群日誌收集:Syslog+Rsyslog+ELK

TAG:Docker | 容器虚拟化 | Linux |