第一次寫文。請容許我自我介紹一下...
你們好我是茉莉。爲何叫茉莉呢?emmm ID茉莉轉圈圈? 皮一下,嘻嘻嘻。筆者兩年小菜雞(差三天滿兩年)。由於公司只有一個我和前端兩我的。因此線上服務部署的任務天然而然就落到了個人肩膀上啦。第一次用docker正式在生產環境部署服務。從一個坑爬出來又掉入另外一個坑。就記錄一下此次上線遇到的bug。寫的不對的地方麻煩各位指正噢。見諒! 好啦。廢話很少說。action!php
本項目採用的是spring cloud+spring boot+spring gateway+mysql還用到了rabbitmq。服務器爲centos7。 這裏漏掉了一位大鍋。我其實還有一個相處了三個月的後端同事。這位大鍋由於請假去面試老闆沒有批可是他仍是去了被開了,框架都是他搭的。emmmm因而「鍋」便甩到了個人頭上!html
他採用的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。(原諒是公司代碼因此是騎兵代碼⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄)java
//在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) 在阿里雲的鏡像服務管理控制檯,隨便點開一個鏡像倉庫——>管理,能夠看到對鏡像倉庫的操做指南mysql
~]# docker images
複製代碼
能夠看到本身剛纔pull到的鏡像。nginx
啓動eurekaweb
~]# 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,用到的朋友請自行調整。
複製代碼
而後啓動本身的服務redis
~]# 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延時隊列的話,還須要安裝延時隊列的插件。 插件安裝步驟spring
打開官網下載: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 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。
好啦就這樣。利用零零碎碎的時間,寫了三天,但願能夠給你們帶來一點幫助。掰掰!