嘗試將正式服務遷移至docker中並管理的一次實踐

一、前言

我自己都對我自己博客記錄的次數太少感到無語了~...

目前公司是沒有使用docker的,因而自己希望對此作出改變,將服務都部署到docker容器中。

在這裏是有幾個方面是要考慮的:
1.怎麼去部署docker容器?
2.對於鏡像和容器該怎麼去統一管理?
3.使用docker發生線上故障該如何排查處理?
4.使用docker的時候有哪些方面需要注意的?

因爲以前的公司也沒有使用過docker,所以這次算是摸石頭過河~

二、怎麼去部署docker容器

部署docker容器有多種方式:

1.使用jenkins + git自動化部署(當然了我們公司運維都沒有。。只能靠自己打包放服務器部署了)
2.使用maven的docker 插件打包成鏡像(大致是這樣。。)
3.創建好一個包含java環境的鏡像,將某個文件夾掛載到容器上,後續更新服務的時候直接丟jar包到這個文件夾中重啓容器就可以了

在這裏我採用第三種方式。

在這裏我編寫了一個較簡單的Dockerfile 去構建鏡像:

FROM java:8

VOLUME /tmp

WORKDIR /app

RUN bash -c "touch /app/app.jar"

EXPOSE 9110

ENTRYPOINT ["java", "-jar", "/app/bigdata-1.0.jar", "&"]

編寫後使用構建鏡像命令:docker build -t xxx . (XXX爲要構建的鏡像名 注意最後的一個 .要加上)

如果需要暴露多個端口,比如開放JMX端口,則加在EXPOSE中

然後啓動容器:docker run --name docker-bigdata -d -v /mnt/bigdata/docker-bigdata:/app -p 9110:9110 bad1deaec0b1

將jar包和外置配置的Config目錄一起放在docker-bigdata目錄裏,掛載到容器的/app目錄上,容器啓動的時候會自己執行Dockerfile中的命令。

到這裏的時候服務已經啓動成功了。

三、怎麼去管理docker中的容器或鏡像

使用可視化的UI界面管理。這裏有幾個選擇:

1.k8s
2.swarm
3.portainer

當然了還有其他工具可以選擇。

在這裏我們首選k8s,因爲它可以做到一些更精細化的操作。但是因爲學習成本太高,以及服務太少,這裏我們略過選擇。
swarm是最貼合docker的,服務比較少的時候選擇swarm是不錯的選擇,但是因爲自己瞭解的比較少,所以不作選擇。
選擇portainer是因爲朋友公司在使用,部署以及管理都很方便,所以參考了他的推薦選擇了portainer。

portainer的使用非常簡單:

1.docker上面有portainer的鏡像,可以直接拉取下來

2.使用命令:docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name portainer docker.io/portainer/portainer

這裏--restart=always設置關閉後總是會自動重啓,至於掛載/var/run/docker.sock:/var/run/docker.sock是必須的,不然進入UI界面的時候會提示你掛載。

3.啓動成功後,使用http://ip:port 直接登錄,第一次登錄會設置賬號和密碼。
在這裏應該註冊個域名,將ip+port的訪問方式屏蔽掉。

這是portainer的管理界面,可以很方便的管理鏡像和容器,可以看到容器的運行狀況(是否運行以及CPU等狀況),實時日誌,容器信息,甚至還可以以命令行方式進入容器,具體一些管理操作等待後面熟悉。

clipboard.png

clipboard.png

在查看容器運行的日誌時,發現容器和宿主機的時間不一致,有剛使用docker的朋友應該注意一下。在Dockerfile中補上這段配置:

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

四、使用docker發生線上故障該如何排查處理或有哪些方面需要注意的?

其實我也不是很清楚。。。因爲也是第一次嘗試將服務遷到docker。
如果發生問題,如容器掛掉,則關注容器日誌以及及時重啓。
要更新服務,則到掛載的宿主機目錄裏面更新jar包然後重啓容器就可以了。

在這裏遇到問題:
1.容器時間與宿主機問題不一致,在上面已經寫了怎麼解決。

2.不能像之前一樣指定輸出控制檯日誌到某個文件中,如java -jar xxx.jar >log 2>&1 & 是不行的。在Dockerfile中用ENTRYPOINT重定向輸出日誌文件是不行的。原因:容器並不認爲這個文件是它自己的,嚴格來說這個文件應該是屬於宿主機的。

我覺得可以通過將啓動命令放置在腳本中,如:java -jar xxx.jar >log 2>&1 & ,將腳本掛載進容器,在Dockerfile中運行腳本文件,這樣子jar包啓動的時候就會將控制檯輸出到log文件中,然後通過掛載顯示出來到宿主機中,方便問題排查。

現在正處於初步使用階段,如有後續問題我會繼續關注寫出來。如有在使用docker中遇到那些坑的朋友,歡迎留言討論~

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