記一次Docker部署服務的爬坑歷程

茉_莉發表於2019-03-11

第一次寫文。請允許我自我介紹一下...
大家好我是茉莉。為什麼叫茉莉呢?emmm ID茉莉轉圈圈? 皮一下,嘻嘻嘻。筆者兩年小菜雞(差三天滿兩年)。因為公司只有一個我和前端兩個人。所以線上服務部署的任務自然而然就落到了我的肩膀上啦。第一次用docker正式在生產環境部署服務。從一個坑爬出來又掉入另一個坑。就記錄一下這次上線遇到的bug。寫的不對的地方麻煩各位指正噢。見諒! 好啦。廢話不多說。action!

本專案採用的是spring cloud+spring boot+spring gateway+mysql還用到了rabbitmq。伺服器為centos7。 這裡漏掉了一位大鍋。我其實還有一個相處了三個月的後端同事。這位大鍋因為請假去面試老闆沒有批但是他還是去了被開了,框架都是他搭的。emmmm於是“鍋”便甩到了我的頭上!

他採用的zuul被我換成了gateway。 Zuul基於servlet 2.5(使用3.x),使用阻塞API。 它不支援任何長連線,如websockets。而Gateway建立在Spring Framework 5,Project Reactor和Spring Boot 2之上,使用非阻塞API。 Websockets得到支援,並且由於它與Spring緊密整合,所以將會是一個更好的開發體驗。(此段話抄自@https://juejin.im/post/5aa4eacbf265da237a4ca36f)

docker映象服務使用的是阿里雲的容器映象服務。問了一下同事,說是用的google的容器工具jib。於是Cmd+Shift+F全域性搜了一下jib。(原諒是公司程式碼所以是騎兵程式碼⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄)

記一次Docker部署服務的爬坑歷程
點選進去可以看到

記一次Docker部署服務的爬坑歷程
進入到阿里雲找到容器映象服務(此處省略不知道映象倉庫是分割槽的,找不到倉庫以為是沒許可權,然後厚著臉皮要來了管理員賬號修改了離職同事的員工賬號也還是沒有找到倉庫的步驟)

記一次Docker部署服務的爬坑歷程
然後我建立了一個名稱空間xxx-prod,然後在該空間下為每個服務都建好了倉庫.私有倉庫。程式碼源我選擇的是本地倉庫推送到映象倉庫。其他的我也不太瞭解。

記一次Docker部署服務的爬坑歷程
(後來發現其實不用建,jib提交會自動建立倉庫,手動建立的時候選擇) 使用jib提交上去後,可以在倉庫的版本資訊裡看到更新。

記一次Docker部署服務的爬坑歷程
記一次Docker部署服務的爬坑歷程
然後連線上伺服器。在home資料夾下面建立一個docker資料夾

//在root根目錄
//~]# centos7的emmm怎麼說呢,就是GitBash和OS系統上面是$ windows下面cmd是>
//home下面建立一個docker資料夾
~]# mkdir /home/docker
//進入建立的docker
~]# cd /home/docker
複製程式碼

然後開始pull我們上傳到阿里雲的映象。其實隨便哪個目錄都可以pull(此處省略第一次pull阿里映象服務時,沒有看操作指南,一度懷疑自己賬號沒有許可權其實是沒有login,然後一直docker login,殊不知後面應該加上阿里雲的映象地址:registry.cn-hangzhou.aliyuncs.com) 在阿里雲的映象服務管理控制檯,隨便點開一個映象倉庫——>管理,可以看到對映象倉庫的操作指南

記一次Docker部署服務的爬坑歷程
映象拉取完畢以後輸入

~]# docker images
複製程式碼

可以看到自己剛才pull到的映象。

記一次Docker部署服務的爬坑歷程
我問同事這裡怎麼這麼多映象,他跟我解釋說
記一次Docker部署服務的爬坑歷程
emmm,行吧!總覺得有很多映象佔記憶體(希望有知道的大佬不吝賜教,感謝)

啟動eureka

~]# docker run -d --name eureka -p 8761:8761 -p 15672:15672 -p 9001:9001  -v /etc/localtime:/etc/localtime registry.cn-hangzhou.aliyuncs.com/xx_xxx_prod/eureka
// -d後臺執行 -p繫結埠這裡繫結了三個埠,一個是註冊中心本身的埠,一個是閘道器的埠,另外一個是rabbitmq的埠 
//-v列印版本資訊 
複製程式碼

由於使用了rabbitmq,所以還需要再建立一個rabbitmq容器。 還是先拉取映象

//這裡注意獲取映象的時候要獲取management版本的,不要獲取last版本的,management版本的才帶有管理介面。
~]# docker pull rabbitmq:management
~]# docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=xxx -e RABBITMQ_DEFAULT_PASS=xxx --network=container:eureka rabbitmq:management
//因為docker容器間是網路隔斷的 --network是加入eureka一樣的網路環境這樣才能被eureka治理下的服務訪問到。
//-e是設定預設的賬戶密碼 指令中是xxx,用到的朋友請自行調整。
複製程式碼

然後啟動自己的服務

~]# docker run -d --name xxx -v /home/docker/web-prod/logs:/logs -v /etc/localtime:/etc/localtime --network=container:eureka registry.cn-hangzhou.aliyuncs.com/xx_xxx_prod/xxx 
//-v是將日誌掛載到自己制定的目錄。 同樣--network加入eureka的網路,這裡不用繫結埠。
//啟動後可以在註冊中心的控制檯檢視服務狀態。ip + eureka的埠。
複製程式碼

這樣服務就跑起來啦。其他服務步驟類似。最後補充一些在上線是遇到的小插曲。 一開始不知道docker容器間是網路隔斷的,一直連不上rabbitmq,因為之前一直沒有使用--network假如eureka的網路。所以服務內localhost訪問不到rabbitmq。還有,如果服務中有用到rabbitmq延時佇列的話,還需要安裝延時佇列的外掛。 外掛安裝步驟

開啟官網下載:http://www.rabbitmq.com/community-plugins.html
選擇相應的對應的版本“3.7.x”點選下載。
~]# docker cp /home/docker/rabbitmq_delayed_message_exchange-20171201-3.7.x.ez rabbit:/plugins
//進入到docker內部
~]# docker exec -it rabbit /bin/bash
//開啟外掛
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
//檢視安裝的所有外掛
rabbitmq-plugins list
複製程式碼

安裝成功,如圖:

記一次Docker部署服務的爬坑歷程

docker rm 刪除容器時,突然就刪除不了了。docker ps -a發現該容器的狀態是Dead(死亡),網上查閱了很多資料,什麼強刪、檢視掛載狀態、手動刪除資料夾、檢視埠占用情況。幾乎都試過了,沒有效果。

最後大概經驗使然,鬼使神差的把nginx和httpd都關掉然後就可以刪除了。 不要問我為什麼同一臺伺服器同時裝nginx和httpd,此專案原本是php專案,由他們部署的,我接手後自己使用的nginx。

還有一個很奇怪的問題,雖然解決了但後面我還是不太明白為什麼會這樣子。使用者表裡面有一個last_password_reset_date,使用者登入時會校驗這個時間欄位,一直報token失效,一個個欄位日誌輸入後,發著這個欄位比資料庫裡面的時間相差10個小時,當時想過是時區問題。但是同一張表的另一個register_date欄位時間是正常的,於是便沒有處理時區。排查了很久,以為是java接受的時間型別不對,或是同事對這個欄位進行了處理。一直沒搞定。後面我把線上環境臉上測試庫,發現又正常。最後檢視了一下測試環境資料庫的時區 ,是東八區。線上庫是預設的GTM。最後把正式庫的時間改成了東八區就好了。

還有一個就是Redis,因為之前有一個公眾號服務,用到了redis,當時redis服務是在宿主機上面的。所以,想就連伺服器宿主機上面算了,但是一開始連不上,後來把redis的配置檔案改了一下,bind引數繫結內網ip就好了。然後程式裡面使用內網ip連上redis。

好啦就這樣。利用零零碎碎的時間,寫了三天,希望可以給大家帶來一點幫助。掰掰!

相關文章