利用docker部署nginx-proxy實現(xiàn)ssl證書

前言:學習這個部署的過程中遇到了很多坑,“坑”主要是因為這些東西都沒有學過,需要涉及到很多的方面的知識,下面我會涉及到一些。大家知道的就看看,不知道的就去了解一下。其實我也沒有太多的去了解,只知道皮毛中的皮毛。這些坑我是一個一個的踩過去的,其中絕大部分坑都是有大神幫我填的。但是最后好歹也是能都跑出來了一個簡單的helloworld。關(guān)于進一步的怎樣把咱們的項目都部署成功目前還在研究中。我寫這個主要是怕以后再寫好多東西就記不得那么全了,所以趕緊寫出來。給大伙介紹我是怎么踩坑的。

具體步驟:

(一).寫一個HTML,里面就一句helloworld

(二).把這個東西打包成docker image

(三).使用打包的docker image啟動一個container

? ?(四) ?. 用瀏覽器訪問container,應(yīng)該可以看到之前在html頁面的helloworld

(五).用Nginx-proxy代理對container的訪問

(六).加https

實現(xiàn)步驟

(一)寫一個HTML,里面就一句helloworld

新建一個index.html這個都會就不多說了

(二,三,四)把這個東西打包成docker image

? 1.安裝docker

(1)標題是用docker部署的當然得用docker,所以得了解docker,安裝docker客戶端,版本號是17.06的,務(wù)必是高版本的(這里有個大坑我先不說)。

(2)學習一下docker基本命令,例如docker ps 、docker ps -a 、docker logs 、docker images 。網(wǎng)上有資源

2.創(chuàng)建鏡像創(chuàng)建container

因為我之前峰哥沒有給我腳本,我是按我自己的腳本練的。然后我就在網(wǎng)上找了一個教程開始學習。(這是第一個坑,我應(yīng)該拉取的是nignx:latest基礎(chǔ)鏡像,不然怎么操作都不會成功)

分享鏈接http://www.cnblogs.com/liusc/p/docker_node.html

$sudo docker pull node:latest

了解的內(nèi)容有:

(1).多級目錄的創(chuàng)建并切換到該目錄下,mkdir –p node/website&&cd node/website

(2).創(chuàng)建文件package.jsontouch package.json

(3).編輯文件vim package.json

(4).構(gòu)建imagesudo docker build –t name

? ?(5) ? .查看imagedocker images

(6).運行imagedocker run –d--name containerName –p port1:port2 imageName

-d:表示容器在后天運行

--name:容器名稱

-p表示端口映射。把本機的port1端口映射到容器的port2端口。這樣外網(wǎng)就能通過本機的port1端口訪問到我們的web了

imageName :表示這個image代表的REPOSITORY

如果(6)部署成功就可以curl了。Curl http://www.parkhome.wang就可以訪問到helloworld .當然沒那么簡單其實是要在本地配置一些東西的(這是第二個坑),要在本地的/etc文件夾里面的hosts添加127.0.0.1www.parkhome.wang才能成功,我是Mac的,window系統(tǒng)的hosts位于c:\Windows\System\drivers\etc\hosts。因為我用的是Mac,且/etc文件里的東西是不可以改的,用vim hosts可以修改但是就是保存不了,折騰了好長時間才解決要加sudo才能保存能夠。這時候就要了解linux系統(tǒng)的一些權(quán)限設(shè)置。分享鏈接:http://www.cnblogs.com/123-/p/4189072.html,

這就差不多curl成功了。

(五).用Nginx-proxy代理對container的訪問

? ?部署Nginx-proxy(做這一步就是一個坑,因為我沒意識到之前鏡像不是Nginx的鏡像,所以會影響到下一步成功,)

分享鏈接:https://github.com/jwilder/nginx-proxy

(1).看英文文檔,還好有Google翻譯。

(2).跑命令

docker run –d –p 80:80 –v /ver/run/docker.sock:/tmp/docker.sock:ro jwildwer/nginx-proxy

-v掛載目錄,而為什么要/ver/run/docker.sock這個可以參考:

http://www.cnblogs.com/fundebug/p/6723464.html。

(3)然后再跑docker run –e VIRTUAL_HOST =www.parkhome.wang

-d containterName

containterName:表示在步驟二里創(chuàng)建的容器。

然后再curl?http://www.parkhome.wang也能夠跑出來。這中間還是有些小坑的,具體的記不得了。遇到再說吧。

4.部署Nginx-proxy-compose

官方解釋:它是一個用于Nginx-proxy的輕量級協(xié)同容器,它允許創(chuàng)建/更新讓我們自動加密證書。

需要刪掉之前的Nginx-proxy,因為只暴露了80端口,加ssl有個特別的端口443,所以還要添加這個端口。所以上面的命令改為

docker run -d --name nginx-proxy -p 80:80 -p 443:443 \

-v/var/run/docker.sock:/tmp/docker.sock:ro \

-v${HOME}/var/data/nginx-proxy/certs:/etc/nginx/certs:ro \

-v/etc/nginx/vhost.d \

-v/usr/share/nginx/html \

jwilder/nginx-proxy

然后創(chuàng)建容器nginx-proxy-compose

docker run -d \

--namenginx-proxy-companion \

-v/var/run/docker.sock:/var/run/docker.sock:ro \

--volumes-fromnginx-proxy \

-v${HOME}/var/data/nginx-proxy/certs:/etc/nginx/certs:rw \

jrcs/letsencrypt-nginx-proxy-companion

雖然容器能夠創(chuàng)建成功,但是在docker logs的時候還是報錯。這個是因為我在創(chuàng)建Nginx容器的時候拉取的是node鏡像不是Nginx,所以一直沒發(fā)現(xiàn)。之后問峰哥,峰哥直接丟了一個腳本過來前兩個都能跑通。在跑Nginx-proxy-compose容器的時候還是不行。

峰哥發(fā)的腳本:

(1)跑Nginx容器

docker run -d\

--name myapp \

-eVIRTUAL_HOST=www.parkhome.wang\

-eVIRTUAL_PORT=80 \

-eLETSENCRYPT_HOST=www.parkhome.wang\

-e LETSENCRYPT_EMAIL=no-reply@parkhome.wang\

-p 81:80 \

-v${HOME}/var/data/myapp/data:/usr/share/nginx/html \

nginx

(2)跑nginx-proxy容器

docker run -d\

--name myapp \

-eVIRTUAL_HOST=www.parkhome.wang\

-eVIRTUAL_PORT=80 \

-eLETSENCRYPT_HOST=www.parkhome.wang\

-eLETSENCRYPT_EMAIL=no-reply@parkhome.wang\

-p 81:80 \

-v${HOME}/var/data/myapp/data:/usr/share/nginx/html \

nginx

(3)跑Nginx-proxy-compose容器

docker run -d\

--name myapp \

-eVIRTUAL_HOST=www.parkhome.wang\

-e VIRTUAL_PORT=80\

-eLETSENCRYPT_HOST=www.parkhome.wang\

-eLETSENCRYPT_EMAIL=no-reply@parkhome.wang\

-p 81:80 \

-v${HOME}/var/data/myapp/data:/usr/share/nginx/html \

nginx

為什么不行?因為生成ssl證書是要確保第三方服務(wù)也就是其他的電腦能訪問到這個域名。而我的域名是在本地設(shè)置的第三方怎么可能訪問到我的本地服務(wù)呢。所以需要云主機。還好公司有一臺閑置的云主機。這就需要了解一些服務(wù)器的知識了,還需要了解dns域名服務(wù)器。這里要搞清楚為什么要用dns服務(wù)器,它可以讓服務(wù)能被本地的和第三方訪問到,而本地的hosts也是可以解析的但是不能被第三方訪問到。我們的parkhome.wang域名是在阿里云上申請的。因為理解錯了一個概念就是dns服務(wù)器不需要自己搭。阿里云上就自帶有dns服務(wù)器。直接將騰訊云上的云主機的ip設(shè)置成58.87.101.174 ??www.parkhome.wang就OK了。

(六)加https

云服務(wù)器上部署,需要了解一些云服務(wù)器的一些知識。這個自己看文檔吧。

咱們的云主機的系統(tǒng)是Ubuntu14.04的.需要安裝一些工具docker,git,docker-compose。(這里又有一個坑,docker版本太低導(dǎo)致在最后階段出現(xiàn)的error。廢了大半天才知道是這個原因。我的版本是docker17.06的)

跑上面峰哥給的腳本。肯定都能跑出來。之后測試一下出現(xiàn)這個錯誤

curl:http://www.parkhome.wang:

是因為服務(wù)器有防火墻。要想訪問這個端口必須的對這個端口開放。需要在騰訊云主機上開放這個端口。云服務(wù)上一般都會有安全組這個功能就是設(shè)置防火墻的。需要了解一下安全組。

將81端口開放。再訪問就能訪問到hellworld了。只要開發(fā)端口基本就沒什么問題了。最后也還要開發(fā)80,443端口。https://www.parkhome.wang基本就能跑出來了。


部署咱們的官網(wǎng)

將咱們的官網(wǎng)部署成HTTPS需要跑通shell腳本

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容