.net core 微服務之 Docker(編排、集羣)

 

Docker 容器編排(Docker Compose)

docker的基礎應用這裏就講了,如果不知道怎樣安裝可以看這篇文章.

Compose 是用於定義和運行多容器 Docker 應用程序的工具。通過 Compose 使用 YML 文件來配置應用程序需要的所有服務。然後使用一個命令,就可以從 YML 文件配置中創建並啓動所有服務。

簡單來說就是一個命令行工具,文件內容指向所有需要創建服務的Dockerfile,每次只需要運行這個命令行文件就可以創建所有的服務。

docker-compose通過新建並創建一個docker-compose.yml 文件定義構成應用程序的服務的,這個文件是通過yml(類似於Json)寫的

yml 參考地址:https://www.runoob.com/w3cnote/yaml-intro.html

docker-compose.yml核心配置

docker-compose 命令行內容官方參考地址:  https://docs.docker.com/compose/compose-file/

		version 指定compose版本 最好是3.0以上版本 目前最新是3.8版本
		services 配置容器[容器列表]
			nginx: #配置容器標識(唯一編號)
			   image: #配置容器鏡像
			   ports: #配置容器映射端口號[數組]
			   networks: #配置容器網絡[數組]
		networks 網絡指定配置
			nginx-rmcore: #配置網絡名稱
			    external: true #網絡自定義
		volumes 數據掛載配置
		extensions 擴展配置

docker-compose 示例

1. 準備兩個測試的.net core的項目(一個叫test1 , 一個叫test2),把他們發佈後包含Dockerfile的文件拷貝到服務器上面,這裏貼一個test1 Dockerfile文件內容,這個系統也可以自動生成

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /src
COPY . .
EXPOSE 80
ENTRYPOINT ["dotnet", "test1.dll"]

Dockerfile 官方參考地址: https://docs.docker.com/engine/reference/builder/

指令內容:

     FROM:指定基礎鏡像(FROM是必備的指令,並且必須爲第一條指令)。

  RUN: 用來執行命令行命令。其基本格式:

      shell格式: RUN  <命令>  ,輸入在bash環境中的命令即可,一個dockerfile允許使用RUN不得超過127層,所以,使用一次RUN, 使用 ‘ \ ’ 換行,使用‘ && ’執行下一條命令。一般使用此種格式;

      exec格式: RUN  <"可執行文件", "參數1", "參數2">,此種方式像是函數調用中的格式;

  COPY:  複製文件。 其基本格式:

      格式1:COPY <源路徑>...<目標路徑>

      格式2:COPY [“<源路徑1>”,....."<目標路徑>"]

  ADD: 更高級的複製文件,在COPY的基礎上增加了一些功能,如果複製的是壓縮包的話,會直接解壓,而不需要在使用RUN解壓;

  CMD:容器啓動命令。其基本格式:

      shell格式: CMD <命令>

      exec格式: CMD ["可執行文件", "參數1", "參數2"...]

      參數列表格式: CMD [“參數1”, “參數2”...],在指定了ENTRYPOINT指令後,用CMD指定具體的參數

  ENTRYPOINT: 入口點。其基本格式分爲exec和shell,

      ENTRYPOINT的目的和CMD一樣,都是在指定容器啓動程序及參數。ENTRYPOINT在運行中可以替代,不過比CMD繁瑣,需要通過docker run 的參數--entrypoint 來指定。當指定了ENTRYPOINT後,CMD的含義就發生了改變,不在是直接運行其命令,而是將CMD的內容作爲參數傳遞給ENTRYPOINT指令。其執行時就變成了:  <ENTRYPOINT> "<CMD>"

  ENV: 設置環境變量。(都可以使用這裏使用的變量)其基本格式:

      格式1:ENV <key> <value>

      格式2:ENV <key1>=<value1> <key2>=<value>...

  ARG: 構建參數。構建參數和ENV的效果一樣,都是設置環境變量,所不同的是ARG所構建的環境變量在將來容器運行時是不存在的。其基本格式:

      格式1: ARG <參數名> [=<默認值>]

      格式2: 該默認值可以在構建命令 docker build  中用 --build-arg <參數名>=<值> 來覆蓋

  VOLUME: 定義匿名卷。 其基本格式:

      格式1: VOLUME ["<路徑1>", "<路徑2>"...]

      格式2: VOLUME <路徑>

  EXPOSE:  暴露端口。EXPOSE指令是聲明運行時容器所提供的端口,在啓動容器時不會在因爲這個聲明而開啓端口。 其基本格式:

      格式1: EXPOSE <端口1> [<端口2>...]

  WORKDIR: 指定工作目錄。其基本格式:

      格式1: WORKDIR <工作目錄路徑>

  USER: 指定當前用戶。USER是幫助你切換到指定用戶。 其基本格式:

      格式1: USER <用戶名>

  HEALTCHECK: 健康檢查,判斷容器的狀態是否正常。 其基本格式:

      格式1: HEALTCHECK [選項] CMD <命令> :設置檢查容器健康狀況的命令

      格式2: HEALTCHECK NONE: 如果基礎鏡像有健康檢查指令,使用此格式可以屏蔽掉其健康檢查指令
指令內容

貼一下常見的命令

	FROM  指定基礎鏡像構建
		寫法:
		FROM 指定基礎鏡像

	COPY  複製命令。從上下文目錄中複製文件或者目錄到容器裏指定路徑。

		寫法:

		COPY 源路徑,目標路徑

		COPY ["源路徑","目標路徑"]	

	RUN  運行指令。構建的時候運行的指令

		主要在於鏡像構建的時候運行,運行build命令的時候 

		後面接的命令就是shell輸入的命令
	
		寫法

		RUN  shell命令 參數1 參數2

		RUN ["shell命令 ","參數1"," 參數2"]

		例如:

		RUN ["echo",">"," /usr/share/index.html"]

	CMD  運行指令。運行容器時候運行的指令

		主要在於鏡像運行容器的時候生成,運行run的時候運行

		寫法

		CMD <shell 命令> 
		CMD ["<可執行文件或命令>","<param1>","<param2>",...] 

		例如:

		CMD ["dotnet","rmcore.dll"]

		缺點:在run 命令後面可以進行覆蓋

		docker run -d -P  rmcore dotnet rmcore.dll 進行覆蓋掉

     ENTRYPOINT  運行指令。運行容器時候運行的指令(不會被覆蓋)

		寫法

		ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

		可以和CMD動態結合,設置動態的配置參數

		例如 

		ENTRYPOINT ["nginx", "-c"] 定參

		CMD ["/etc/nginx/nginx.conf"]變參

     EXPOSE  暴露端口指令

		僅僅聲明端口,就是指定鏡像暴露的端口

		在run 的時候,通過docker run -p 會自動隨機映射到EXPOSE端口

		寫法

		EXPOSE 端口

		EXPOSE 端口

		例如 

		EXPOSE 5000

		EXPOSE 5001

    WORKDIR  工作目錄指令
		用於應用在容器內的工作目錄,就好比:ruanmou目錄
	
		寫法

		WORKDIR <工作目錄路徑>

		例如

		WORKDIR /rmcore

		或者

		WORKDIR /nginx

  

2. 創建一個叫compose文件夾,文件夾中創建docker-compose.yml 文件(一定要這個名稱),文件內容

version: '3'    #版本號
services:
         fcbtest1:    #服務唯一名稱,隨便起名
                   build: ../test1   #test1項目位置,也就是Dockerfile所在位置 
                   ports:
                        - 6066:80     #外網映射端口號:內網端口號
                        - 6067:443
         fcbtest2:
                   build: ../test2
                   ports:
                       - 6068:80

3.  進入到 docker-compose.yml 文件所在目錄, 運行命令 

docker-compose up -d

運行成功之後就可以看到生成了兩個鏡像文件 compose_fcbtest1 和 compose_fcbtest2 說明成功了

手動docker run 一下兩個鏡像,運行其中一個

Docker 集羣

集羣概念

集羣:不同服務實例來共同提供服務的一組集合

集羣分類

對稱集羣:不同服務實例,功能地位相等(每一個實例提供的功能機會相同) 。 

    特點:數據計算(不會存儲任何狀態)

    例如:Nginx

非對稱集羣:不同服務實例,功能地位不相等(每一個實例提供功能的機會不相同)

              特點:數據存儲(會存儲數據狀態)

    例如:Redis、Docker(因爲會存儲鏡像和容器,所以屬於非對稱集羣)

 

 

Docker Swarm

swarm是docker官方提供的集羣工具。。它將 Docker 主機池轉變爲單個虛擬 Docker 主機。 Docker Swarm 提供了標準的 Docker API,所有任何已經與 Docker 守護程序通信的工具都可以使用 Swarm 輕鬆地擴展到多個主機

特點

1、單點故障問題

​2、性能問題

核心概念

node :節點概念,docker 別名

task :在集羣環境中,用來運行容器

service : 指不同節點容器集合,用來維護容器

stack : stack的集合,用來維護service

manager:管理節點(容器服務管理,集羣配置)

worker : 工作節點

Docker集羣示例

創建管理節點

docker swarm init --advertise-addr [當前主機ip]

創建成功後會提供工作節點添加方式,其中包含一串token,直接把命令整個複製,放到需要添加爲工作節點的主機上面執行就行了

 

創建 工作節點

例如這裏就執行上面創建管理節點返回的命令

docker swarm join --token SWMTKN-1-1p1jdsrxh6dsoajcs8uol72d5siw5ap4cxa6a7gyw5zezhf8jv-7bui8196ans11v1dze33fgpcv 192.168.230.130:2377

創建完成之後,執行 docker info 可以看到 swarm的狀態

也可以直接通過 docker node ls 命令查看集羣狀態

創建服務

1. 創建服務

docker service create --replicas 2 --name fcbtestservice_test2 compose_fcbtest1
--replicas 配置服務副本(容器在不同節點啓動,也就是隨機啓動多少個節點)
--name 服務名稱(service名稱)
--compose_fcbtest1 需要實例化容器的鏡像名

 

 2. 服務列表

docker service ls

3. 查看服務運行在哪個節點

docker service ps fcbtestservice_test2

4. 服務擴展(向其他節點添加服務副本)

docker service scale fcbtestservice_test2=2

5. 刪除服務

docker service rm fcbtestservice_test2

6. 服務設置外部訪問端口

docker service create --replicas 2  --name fcbtestservice_test2  --publish 6066:80 compose_fcbtest1

這裏通過docker ps 看不到映射的端口,只有通過docker service ls 可以查看監控到的端口映射。注意,這裏如果外網訪問不到,注意檢查主機的網絡問題

使用satck 管理服務、批量處理 

上面我們只能一個一個去創建指定鏡像的集羣,如果我們想一次性創建多個鏡像的集羣,那麼我們就要用到了statck 。就相當於是批量處理,也就會用到文章開頭的docker-compose.yml , 配置大概差不多,只是會新增一些選項

1. 準備一個 docker-compose.yml 文件.這裏複製一下之前的稍微改動一下

version: '3'
services:
         fcbtest1:
                   image: compose_fcbtest1   #鏡像名稱
                   ports:
                        - 6076:80     #映射端口號
                        - 6077:443
                   deploy: #集羣模式配置 
                        mode: replicated   #配置副本模式,如果爲replicated必須配置replicas。還可以配置gload,全局模式
                        replicas: 2   #副本份數
         fcbtest2:
                   image: compose_fcbtest2    #鏡像名稱
                   ports:
                       - 6078:80
                   deploy:
                        mode: replicated
                        replicas: 2

關於stack  docker-compose.yml 中deploy 的所有配置說明

endpoint_mode:訪問集羣服務的方式。
	endpoint_mode: vip 
	# Docker 集羣服務一個對外的虛擬 ip。所有的請求都會通過這個虛擬 ip 到達集羣服務內部的機器。
	endpoint_mode: dnsrr
	# DNS 輪詢(DNSRR)。所有的請求會自動輪詢獲取到集羣 ip 列表中的一個 ip 地址。
labels:在服務上設置標籤。可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。

mode:指定服務提供的模式。
	replicated:複製服務,複製指定服務到集羣的機器上。
    global:全局服務,服務將部署至集羣的每個節點。	
replicas:mode 爲 replicated 時,需要使用此參數配置具體運行的節點數量。

resources:配置服務器資源使用的限制,例如上例子,配置 redis 集羣運行需要的 cpu 的百分比 和 內存的佔用。避免佔用資源過高出現異常。

restart_policy:配置如何在退出容器時重新啓動容器。

condition:可選 none,on-failure 或者 any(默認值:any)。
	delay:設置多久之後重啓(默認值:0)。
	max_attempts:嘗試重新啓動容器的次數,超出次數,則不再嘗試(默認值:一直重試)。
	window:設置容器重啓超時時間(默認值:0)。
	rollback_config:配置在更新失敗的情況下應如何回滾服務。

parallelism:一次要回滾的容器數。如果設置爲0,則所有容器將同時回滾。
	delay:每個容器組回滾之間等待的時間(默認爲0s)。
	failure_action:如果回滾失敗,該怎麼辦。其中一個 continue 或者 pause(默認pause)。
	monitor:每個容器更新後,持續觀察是否失敗了的時間 (ns|us|ms|s|m|h)(默認爲0s)。
	max_failure_ratio:在回滾期間可以容忍的故障率(默認爲0)。
	order:回滾期間的操作順序。其中一個 stop-first(串行回滾),或者 start-first(並行回滾)(默認 stop-first )。
	update_config:配置應如何更新服務,對於配置滾動更新很有用。

parallelism:一次更新的容器數。
	delay:在更新一組容器之間等待的時間。
	failure_action:如果更新失敗,該怎麼辦。其中一個 continue,rollback 或者pause (默認:pause)。
	monitor:每個容器更新後,持續觀察是否失敗了的時間 (ns|us|ms|s|m|h)(默認爲0s)。
	max_failure_ratio:在更新過程中可以容忍的故障率。
	order:回滾期間的操作順序。其中一個 stop-first(串行回滾),或者 start-first(並行回滾)(默認stop-first)

2. 在當前目錄中執行一下

docker stack deploy -c docker-compose.yml fcbstack

#  -c 是指定docker-compose.yml文件
#  fcbstack 指定stack 標識(名稱)

3. 此時已經部署成功了,查看stack 列表

docker stack ls

4. 查看stack 服務列表信息 

docker stack ps fcbstack

5. 刪除 stack

docker stack rm fcbstacks 

 分別在兩臺服務器上找一個容器看看效果

 

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