覺得是脫離企業需求的校內課程,沒想到是軟件開發相關技術課程。可是聽到說像軟工實踐相似的課程仍是有些懼怕,畢竟不是一我的可以輕鬆完成的。由於疫情的關係,本學期的時間嚴重不足,但願不要佔用太多時間爲好。mysql
微服務是一種軟件開發技術,是面向服務的體系結構(SOA)結構樣式的一種變體,它將應用程序安排爲一組鬆散耦合的服務。在微服務架構中,服務是細粒度的,協議是輕量級的。sql
Martin Fowler將基於微服務的體系結構描述爲具備如下屬性:docker
微服務運用了以業務功能爲導向的設計概念,應用程序在設計時對業務功能或流程設計先行分割,將各個業務功能都獨立實現成一個能自主運行的個體服務,而後再利用相同的協議將全部應用程序須要的服務都組合起來,造成一個應用程序。編程
若須要針對特定業務功能進行擴展時,只要對該業務功能的服務進行擴展就好,不須要整個應用程序都擴展,同時,因爲微服務是以業務功能導向的實現,所以不會受到應用程序的干擾,微服務的管理員能夠視運算資源的須要來配置微服務到不一樣的運算資源內,或是布建新的運算資源並將它配置進去。json
因爲微服務是獨立的,獨立的應用程序單元,每一個微服務單元僅履行一個特定的業務功能,所以,它們自己能夠被視爲小型應用程序。若是應用程序建立十幾個微服務或者構建具備不一樣技術棧的多個微服務,那麼,開發團隊很快就會遇到麻煩,由於開發人員必須負責比開發傳統的單體應用程序更多的開發任務。windows
不過,目前有一個解決方案:使用容器封裝每一個微服務。Docker是一個容器化工具,旨在提供一種更簡單的方式來處理容器化應用程序。它將微服務封裝爲所謂的Docker container,而後能夠對其進行獨立維護和部署。每個容器中將負責一種特定的業務功能,而開發人員只需專一於自身的技術特色,開發微服務並將微服務封裝成容器,微服務之間架構的任務只需交給另外一些專業人員便可。tomcat
Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基於 Linux 內核,對進程進行封裝隔離,屬於 操做系統層面的虛擬化技術。因爲隔離的進程獨立於宿主和其它的隔離的進程,所以也稱其爲容器。bash
Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的建立和維護。使得 Docker 技術比虛擬機技術更爲輕便、快捷。服務器
傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬。所以容器要比傳統虛擬機更爲輕便。網絡
Docker 包括三個基本概念:鏡像(Image)、容器(Container)、倉庫(Repository)
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。鏡像並不是是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現並不是由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。
鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的 類 和 實例 同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。
每個容器運行時,是以鏡像爲基礎層,在其上建立一個當前容器的存儲層,咱們能夠稱這個爲容器運行時讀寫而準備的存儲層爲容器存儲層。
一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本。咱們能夠經過 <倉庫名>:<標籤> 的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 latest 做爲默認標籤。
Compose 項目是Docker官方的開源項目,負責實現Docker容器集羣的快速編排。Docker Compose 能夠輕鬆、高效的管理容器,它是一個用於定義和運行多容器 Docker 的應用程序工具。
Dockerfile是一個包含用於組合映像的命令的文本文檔。可使用在命令行中調用任何命令。 Docker經過讀取Dockerfile中的指令自動生成映像。
Docker Machine 是一個工具,它容許你在虛擬宿主機上安裝Docker,並使用docker-machine命令管理這個宿主機,可使用Docker Machine在本地的MAC或者windows box、公司網絡,數據中心或者AWS這樣的雲提供商上建立docker。Docker Machine 也能夠集中管理因此得docker主機。
Docker Swarm提供 Docker 容器集羣服務,是 Docker 官方對容器雲生態進行支持的核心方案。Docker Swarm 能夠在多個服務器或主機上建立容器集羣服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。
Kubernetes(k8s)是Google開源的容器集羣管理系統。在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提升了大規模容器集羣管理的便捷性。
在測試或開發環境中 Docker 官方爲了簡化安裝流程,提供了一套便捷的安裝腳本,Ubuntu 系統上可使用這套腳本安裝:
$ curl -fsSL get.docker.com -o get-docker.sh $ sudo sh get-docker.sh --mirror Aliyun
安裝完成後輸入:
$ docker version
出現版本信息即爲成功安裝。
國內從 Docker Hub 拉取鏡像有時會遇到困難,此時能夠配置鏡像加速器。Docker 官方和國內不少雲服務商都提供了國內加速器服務,例如:
這裏以阿里雲加速器爲例進行介紹。在 /etc/docker/daemon.json 中寫入以下內容(若是文件不存在請新建該文件)
{ "registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"] }
以後重啓服務。
$ sudo systemctl daemon-reload $ sudo systemctl restart docker
在命令行執行
$ docker info
若是從結果中看到了以下內容,說明配置成功。
從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull。其命令格式爲:
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標籤]
$ docker pull tomcat
上面的命令中沒有給出 Docker 鏡像倉庫地址,所以將會從 Docker Hub 獲取鏡像。而鏡像名稱是 tomcat,所以將會獲取官方鏡像 library/tomcat 倉庫中標籤爲 latest(默認) 的鏡像。
使用命令:
docker images
能夠查看目前docker已獲取的鏡像。列表包含了 倉庫名、標籤、鏡像 ID、建立時間 以及 所佔用的空間。
有了鏡像後,就可以以這個鏡像爲基礎啓動並運行一個容器。以上面的 tomcat 爲例,打算啓動以tomcat爲鏡像的容器,能夠輸入下面的命令:
$ docker run -it --rm -p 8080:8080 tomcat
下面驗證一下tomcat是否啓動成功。
再登錄hub.docker.com中查看版本是否正確。
能夠看到,tomcat的版本號正好是5.54,與hub.docker.com中一致。
若是要刪除本地的鏡像,可使用 docker image rm 命令,其格式爲:
$ docker image rm [選項] <鏡像1> [<鏡像2> ...]
其中,<鏡像> 能夠是 鏡像短 ID、鏡像長 ID、鏡像名 或者 鏡像摘要。
如:
docker image rm tomcat
啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另一個是將在終止狀態(stopped)的容器從新啓動。所須要的命令主要爲 docker run。
以上面的 tomcat 爲例,打算新建以tomcat爲鏡像的容器並啓動,能夠輸入下面的命令:
$ docker run -it --rm -p 8080:8080 tomcat
下面驗證一下tomcat是否啓動成功。
能夠利用
$ docker container start
直接將一個已經終止的容器啓動運行。
使用
$ docker container stop CONTAINER ID
來終止一個容器
在啓動容器時附帶-d參數,容器會在後臺駐留。這時若是須要進入容器,可使用
$ docker exec -it CONTAINER ID bash
進入容器。其中參數 i 表示交互式,參數 t 表示以Linux 終端形式進行。
退出容器時,輸入 exit 便可。
使用
$ docker container rm
來刪除一個容器。須要注意的是,在刪除一個容器前,必須先終止它,不然出現錯誤提示。
登陸 https://hub.docker.com/ 免費註冊一個屬於本身的我的帳戶。
使用
$ docker login
命令,並根據提示登陸帳號。
使用
$ dokcer search
能夠搜索在docker hub中的相關鏡像。如 docker search mysql:
能夠看到有關MySQL鏡像的信息,其中包括鏡像名字、描述、收藏數(表示該鏡像的受關注程度)、是否官方建立、是否自動建立。另外,在查找的時候經過 --filter=stars=N 參數能夠指定僅顯示收藏數量爲 N 以上的鏡像。
使用
$ docker pull
進行拉取鏡像操做。如 docker pull mysql:
先使用
$ docker tag
爲鏡像打上本身的用戶名/鏡像名:標籤。再使用
$ docker push
將鏡像推送到本身的鏡像倉庫。
登陸docker hub,可以看到相關鏡像倉庫