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
分別在兩臺服務器上找一個容器看看效果