容器化技術與微服務結合---docker(一)

系列

容器化技術與微服務結合—docker(一)
容器化技術與微服務結合—Kubernetes基本介紹(二)
容器化技術與微服務結合—Pod詳解(三)
容器化技術與微服務結合—實操service並部署一個簡單對外開放的springboot HelloWord服務(四)
容器化技術與微服務結合—結合springcloud微服務框架進行部署(含切換成阿里雲docker倉庫)(五)
容器化技術與微服務結合—SpringCloud框架與阿里雲serverless k8s的結合(六)

微服務

微服務現在技術成熟,其實沒啥好說的,只是一種概念,一種大型項目無法單機和單應用研發部署而演進的一種新的概念,所以這裏就不多介紹了。有太多的開源項目可以讓你輕鬆玩轉微服務,springcloud系列、dubbo系列甚至基於netty等自研通信系列。

通信、安全、隔離、熔斷降級等,都是微服務的關鍵詞,未必任何場景都需要微服務化。微服務的框架也勢必造成研發、運維的成本增加

docker場景

這裏不過多介紹docker,可以自己去查看概念。docker是一種容器化,但是未必是最好的部署方式。對於創業團隊或者業務集羣(微服務)不是很多的,並且更在意跨區域通信的,使用雲方案進行獨佔資源部署即可,既方便又快捷。

初期使用docker,大部分場景都是爲了運維,docker的輕量簡單讓運維有了革命性的提升。並且大部分機房在同一個機架組內,每臺機器又是高配,所以使用docker來運行不同的服務搶佔同一個機器的資源。但是當涉及到雲或者混合雲的時候,你會發現,普通的系統,哪怕是十幾個微服務的系統,使用docker甚至k8s編排,都會極大的影響開發效率,提高運維成本,完全沒有單機搶佔部署(比如一個java程序獨佔一臺EC2資源,EC2不用高配即可)來的方便快捷,具體可以參考博主架構體系博客~

所以對於一個創業或者從0到1的團隊,不需要考慮容器化技術,不過當然還是要學習的。

在這裏插入圖片描述
可以看到,其實雲方案本身已經是容器化虛擬化技術了。docker和k8s的結合,更多用於獨有機房的IT企業,會讓運維變得輕量。如果是雲或者混合雲,博主極度不推薦自建容器化,使用雲方案即可

mac上docker安裝

系統要求

Docker for Mac 要求系統最低爲 macOS 10.10.3 Yosemite,或者 2010 年以後的 Mac 機型,準確說是帶 Intel MMU 虛擬化的,最低 4GB 內存。
如果系統不滿足需求,可以安裝 Docker Toolbox。

安裝

使用 Homebrew 安裝
Homebrew 的 Cask 已經支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 來進行安裝:

brew cask install docker

成功後就有小鯨魚圖標了,自己登陸自己的docker賬號,去dockerHub上創建個賬號,把鏡像發上去即可

docker簡單的用法就是:研發完畢打包鏡像上傳到鏡像倉庫,然後服務器執行腳本pull最新的鏡像,停止現有的鏡像服務,然後刪除老的鏡像,啓動新的鏡像服務就行啦~

linux上docker安裝

參考 https://www.jianshu.com/p/8b795475e3ce

Docker的一些命令

docker run -d -p 8080:80 --name webserver nginx —用docker啓動一個nginx實例,nginx默認80端口。docker將端口映射成8080。服務器訪問8080即可。這個服務名稱是webserver
docker ps --查看當前運行的服務
docker ps -a --查看所有的服務
docker stop webserver --停止webserver這個服務
docker rm webserver --刪除webserver這個服務
docker run -d -p 10002:10001 -e “spring.profiles.active=prod” --name demo luffy -e後面可以帶環境變量。更好的適配應用的配置文件
docker build -f ./Dockerfile -t codemon/luffy-dev . 創建鏡像,後面有那個點,如果Dockerfile在當前目錄下, -f ./Dockerfile 可以去掉
docker run -d -p 10001:10001 -e “spring.profiles.active=qa” -e “eureka_ip=10.31.12.218” --name demo luffy 這裏可以-e無限添加環境變量
docker logs -f -t --since=“2017-05-31” --tail=10 edu_web_1

–since : 此參數指定了輸出日誌開始日期,即只輸出指定日期之後的日誌。
-f : 查看實時日誌
-t : 查看日誌產生的日期
-tail=10 : 查看最後的10條日誌。
edu_web_1 : 容器名稱

springcloud結合docker部署

以springcloud微服務爲例,如何讓微服務和docker結合?springboot和cloud的腳手架這裏就不介紹了
1.在你的項目中創建一個Dockerfile文件,內容:

FROM frolvlad/alpine-oraclejdk8:slim
RUN mkdir /docker/demo
RUN mkdir /docker/demo/logs
ADD ./target/app.jar /docker/demo/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/docker/demo/app.jar"]

2.執行mvn package spring-boot:repackage docker:build
進行打包,達成可執行jar包,然後使用dockerFile構建鏡像:

docker build -t codemon/app-dev .
注意最後的點是docker編譯時的環境, 結尾重點講解

3.執行一個非常簡單的腳本進行發佈

docker stop app
docker rm app
docker rmi docker.io/codemon/app-dev
docker pull codemon/app-dev
docker run -d -p 10001:10001 -v /home/emper/logs/app:/app/logs -e "spring.profiles.active=qa" -e "mysql_ip=xx.xx.xx.xx" -e "mysql_user=qa" -e "mysql_passwd=qa" --name app docker.io/codemon/app-dev

意思就是在服務器上停止老的鏡像並刪除,下載最新的鏡像並啓動,-v是掛在磁盤,-e可以無限添加,用於環境變量設定

不需要sudo也可以執行docker命令:http://blog.csdn.net/he_wolf/article/details/37796285
docker換源: http://blog.csdn.net/zzy1078689276/article/details/77371782

docker build注意事項

docker build -t emper/eureka:v1 .

上面可以看到,默認當前路徑下的dockerFile,末尾的 . (點)代表此時docker開始運作(編譯)的上下文環境

如果我們將dockerfile改成自己喜歡的名字,並放在任意一個地方,那麼我們要執行如下語句

docker build -f ./qa-eureka-docker-file -t emper/eureka:v1 …/…/empr-eureka

-f 後面是dockerfile文件, 命令最後不在是點,而是指定:docker開始運作的時候,實在哪個地方執行的。

最後

微服務嚴格意義上來說,可以說成是k8s容器化編排的一個子集,容器化或者微服務的魅力在於每個業務集羣甚至個體都獨立掌管子集內部的邏輯甚至DB,相互之間有極大的邊界和隔離,這點類似於DDD。
在這裏插入圖片描述
原諒我盜了一張圖,可以看到,服務已經不再強依賴於一個共同語言,每個服務質檢靠某種協議傳輸,如果有容器化的編排和管理,那麼勢必整個大的業務集羣就相當於已給內置局域網VPC(參考博主的雲架構系列)

所以容器化極大提升了機器的利用率,提升了通信效率,不在依賴於某個雲或者某種機器,使得混合雲、私有云、公有云都可以隨時隨地編排部署。

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