前言:學習這個部署的過程中遇到了很多坑,“坑”主要是因為這些東西都沒有學過,需要涉及到很多的方面的知識,下面我會涉及到一些。大家知道的就看看,不知道的就去了解一下。其實我也沒有太多的去了解,只知道皮毛中的皮毛。這些坑我是一個一個的踩過去的,其中絕大部分坑都是有大神幫我填的。但是最后好歹也是能都跑出來了一個簡單的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腳本