Docker教程三之基於Centos7的Nginx環境鏡像以及簡單負載均衡及SSL證書簡單配置

上一章我完成了NodeJs鏡像,NodeJs跑起了服務,那麼這章,我們繼續對該服務進行創建負載的Nginx鏡像

 

因爲負載均衡需要單獨的服務器,當然,一個服務器也可以,但是就失去了多服務器的意義,所以,我還是決定單獨創建一個基於CentOS 7 的 Nginx 環境鏡像

 

我只需要對我的服務進行一個基礎負載,之所以選擇Nginx,就因爲開源,免費,且高效,使用過程中並沒有涉及到高級情況,所以就不多說Nginx的東西了(高級的我也沒去看過,呵呵),自行百度即可

再此基礎之上,我對Nginx配置又進行了SSL協議配置,簡單的來說,就是對域名訪問增加證書驗證,https請求

SSL證書的使用,我採用阿里雲SSL證書,具體操作步驟:SSL證書安裝指南     Nginx 配置指南

 

直接上乾貨

 

之前找了很多資料,但是需要跑起來的話,還是有點坑的,然後對其整理得到下面的 dockerfile 內容

坑:

1,Nginx的啓動問題,網上傳了很多Nginx相關dockerfile的文件內容,文件中的過程都是大同小異的,但是在結尾的CMD [] 命令上有了分歧,這也是造成我自己踩坑的原因,網上流傳大致以下幾種方式

a) 不啓用: #CMD[""]

b) 啓動Nginx:CMD["nginx","-c","nginx.conf"]

c) 啓動Shell: CMD["/bin/bash"]

d) 其他怪異的方式

以上方式我都嘗試了,但是似乎不對我的胃口,我也不能說這些都是錯的,可能是我的嘗試方法不對吧

最後使用的方式請向下看內容

dockerfile 

FROM centos:7 
  
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum -y install nginx && yum clean all 
  
EXPOSE 80 443
  
CMD ["nginx", "-g", "daemon off;"]


解釋:

From 引用CentOS 7 的基礎鏡像(上一章編譯而來)

 

RUN rpm -Uvh RPM更新Nginx源文件

 

RUN yum -y install nginx && yum clean all  執行安裝Nginx並清理yum緩存



EXPOSE 80 443  開放端口,因爲是負載,所以我就直接開通80 就好, 443 可以忽略

 

CMD ["nginx", "-g", "daemon off;"] 這句至關重要,這裏牽扯到容器的進程問題,容器bash的pid爲1,容器執行完畢後會自動退出該容器,所以啓動的時候,容器會感覺啓動不起來,實際上容器已經跑完了,所以這裏設置nginx的daemon 關閉,不要以守護進程方式進行運行,這樣就Ok了

 

 

最後的編譯: docker build --no-cache --rm -t nginx:7.0 . 

 

對於dockerfile 中的指令,以及 Nginx 的參數配置, 具體在專業教程基礎中去查看吧

 

再來說回 Nginx的基礎配置

 

 

nginx.conf 文件內容,因爲是yum安裝,所以文件存放位置在 /etc/nginx/ 目錄下

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
   
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream blog {  
            server 172.17.0.2:8888;  
            server 172.17.0.3:8888;  
            server 172.17.0.4:8888;          
    }
    upstream api {
        server 172.17.0.7:10000;
    }

    server {
        listen 80;
        server_name iuver.cn; 

        rewrite ^(.*)$  https://$host$1 permanent;  
    }

    server {
        listen 443 ssl;
        server_name iuver.cn;

        ssl on;    
        ssl_certificate  cert/1600551_www.iuver.cn.pem;
        ssl_certificate_key cert/1600551_www.iuver.cn.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;      

        location / {
            proxy_pass http://blog/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        location /api {
            proxy_pass   http://api/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        } 
    }
}

在 nginx.conf 的配置中, 我只設置了部分內容

upstream blog {  
       server 172.17.0.2:8888;     
}

這個配置是對本地的另一個 docker 容器進行負載,反代理配置,當然可以配置多個負載地址

 

server {
        listen 80;
        server_name iuver.cn; 

        rewrite ^(.*)$  https://$host$1 permanent;  
}

server {
        listen 443 ssl;
        server_name iuver.cn;

        ssl on;    
        ssl_certificate  cert/1600551_www.iuver.cn.pem;
        ssl_certificate_key cert/1600551_www.iuver.cn.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;      

        location / {
            proxy_pass http://blog/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        location /api {
            proxy_pass   http://api/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        } 
}

這個服務配置是關乎到 nginx 監聽的服務,以及代理轉接,注意 配置中,

第一個 server 監聽 80 端口,此處是用來監聽請求的

rewrite ^(.*)$  https://$host$1 permanent;  用於將 http 請求 轉換爲 https 請求

第二個 server 監聽 443 端口,也就是監聽 SSL 了

http:// 後面所跟着的爲反代理配置的名稱, 這樣就將http 直接轉換爲 https 了

 

##include /etc/nginx/conf.d / *.conf;

註釋掉了 nginx 默認顯示站點的配置項

 

通過配置上節中我們的 web 項目地址到nginx中,我們就完成了一個簡單的web負載

 

最後的啓動

docker run -d -p 80:80 -p 443:443 -v /root/docker/nginx/nginx.conf:/etc/nginx/nginx.conf  -v /root/docker/nginx/cert:/etc/nginx/cert --name nginx nginx:7.0

-p: 端口映射,通過nginx 的80端口,重定向到我們的web的端口上去,

通過 443 端口,對http請求進行https轉接

 

Nginx 下載地址:http://nginx.org/packages/centos/7/noarch/RPMS/

 

可以看我的碼雲:去碼雲看看

 

第三章,到此結束

 

 

 

 

 

 

 

 

 

 

EXPOSE 80 443  開放端口,因爲是負載,所以我就直接開通80 就好, 443 可以忽略

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