HOME 首頁
SERVICE 服務產品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關于我們
CONTACT 聯系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    dockerswarm負載均衡(docker swarm負載均衡)

    發(fā)布時間:2023-04-08 12:11:31     稿源: 創(chuàng)意嶺    閱讀: 84        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于dockerswarm負載均衡的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網頁版、PC客戶端

    官網:https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    dockerswarm負載均衡(docker swarm負載均衡)

    一、使用 Docker Stack 部署多服務集群

    單機模式下,我們可以使用 Docker Compose 來編排多個服務,而在 上一篇文章 中介紹的 Docker Swarm 只能實現對單個服務的簡單部署。于是就引出了本文的主角 Docker Stack ,通過 Docker Stack 我們只需對已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群環(huán)境下的多服務編排。

    注意:如果有多個 manager 節(jié)點,portainer 和 visualizer 可能分別部署在兩臺機器上,所以ip可能會不一樣。

    評論區(qū)有小伙伴提到,容器間通過服務名 ( 比如文中的 nginx ) 通訊時,對應的 IP 卻和容器的實際 IP 對不上。出現這個情況是因為負載均衡( 對外表現為一個服務,內部為多個服務 )。下面是我做的試驗,希望能幫助大家理解。

    總結下:

    整個請求的調用流程應該就是: 通過服務名 nginx 訪問 -- 指向 --> stack 集群網關 ( 10.0.6.5 ) -- 轉發(fā) --> stack 集群中,位于當前服務器的負載均衡實例 ( 10.0.6.4 ) -- 分發(fā) --> 最終的應用

    二、微服務架構:基于微服務和Docker容器技術的PaaS云平臺架構設計

    基于微服務架構和Docker容器技術的PaaS云平臺建設目標是給我們的開發(fā)人員提供一套服務快速開發(fā)、部署、運維管理、持續(xù)開發(fā)持續(xù)集成的流程。平臺提供基礎設施、中間件、數據服務、云服務器等資源,開發(fā)人員只需要開發(fā)業(yè)務代碼并提交到平臺代碼庫,做一些必要的配置,系統(tǒng)會自動構建、部署,實現應用的敏捷開發(fā)、快速迭代。在系統(tǒng)架構上,PaaS云平臺主要分為微服務架構、Docker容器技術、DveOps三部分,這篇文章重點介紹微服務架構的實施。

    如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。

    實施微服務需要投入大量的技術力量來開發(fā)基礎設施,這對很多公司來說顯然是不現實的,別擔心,業(yè)界已經有非常優(yōu)秀的開源框架供我們參考使用。目前業(yè)界比較成熟的微服務框架有Netflix、Spring Cloud和阿里的Dubbo等。Spring Cloud是基于Spring Boot的一整套實現微服務的框架,它提供了開發(fā)微服務所需的組件,跟Spring Boot一起使用的話開發(fā)微服務架構的云服務會變的很方便。Spring Cloud包含很多子框架,其中Spring Cloud Netflix是其中的一套框架,在我們的微服務架構設計中,就使用了很多Spring Cloud Netflix框架的組件。Spring Cloud Netflix項目的時間還不長,相關的文檔資料很少,博主當時研究這套框架啃了很多英文文檔,簡直痛苦不堪。對于剛開始接觸這套框架的同學,要搭建一套微服務應用架構,可能會不知道如何下手,接下來介紹我們的微服務架構搭建過程以及 需要那些 框架或組件來支持微服務架構。

    為了直接明了的展示微服務架構的組成及原理,畫了一張系統(tǒng)架構圖,如下:

    從上圖可以看出,微服務訪問大致路徑為:外部請求 → 負載均衡 → 服務網關(GateWay)→ 微服務 → 數據服務/消息服務。服務網關和微服務都會用到服務注冊和發(fā)現來調用依賴的其他服務,各服務集群都能通過配置中心服務來獲得配置信息。

    服務網關(GateWay)

    網關是外界系統(tǒng)(如:客戶端瀏覽器、移動設備等)和企業(yè)內部系統(tǒng)之間的一道門,所有的客戶端請求通過網關訪問后臺服務。為了應對高并發(fā)訪問,服務網關以集群形式部署,這就意味著需要做負載均衡,我們采用了亞馬遜EC2作為虛擬云服務器,采用ELB(Elastic Load Balancing)做負載均衡。EC2具有自動配置容量功能,當用戶流量達到尖峰,EC2可以自動增加更多的容量以維持虛擬主機的性能。ELB彈性負載均衡,在多個實例間自動分配應用的傳入流量。為了保證安全性,客戶端請求需要使用https加密保護,這就需要我們進行SSL卸載,使用Nginx對加密請求進行卸載處理。外部請求經過ELB負載均衡后路由到GateWay集群中的某個GateWay服務,由GateWay服務轉發(fā)到微服務。服務網關作為內部系統(tǒng)的邊界,它有以下基本能力:

    1、動態(tài)路由:動態(tài)的將請求路由到所需要的后端服務集群。雖然內部是復雜的分布式微服務網狀結構,但是外部系統(tǒng)從網關看就像是一個整體服務,網關屏蔽了后端服務的復雜性。

    2、限流和容錯:為每種類型的請求分配容量,當請求數量超過閥值時拋掉外部請求,限制流量,保護后臺服務不被大流量沖垮;黨內部服務出現故障時直接在邊界創(chuàng)建一些響應,集中做容錯處理,而不是將請求轉發(fā)到內部集群,保證用戶良好的體驗。

    3、身份認證和安全性控制:對每個外部請求進行用戶認證,拒絕沒有通過認證的請求,還能通過訪問模式分析,實現反爬蟲功能。

    4、監(jiān)控:網關可以收集有意義的數據和統(tǒng)計,為后臺服務優(yōu)化提供數據支持。

    5、訪問日志:網關可以收集訪問日志信息,比如訪問的是哪個服務?處理過程(出現什么異常)和結果?花費多少時間?通過分析日志內容,對后臺系統(tǒng)做進一步優(yōu)化。

    我們采用Spring Cloud Netflix框架的開源組件Zuul來實現網關服務。Zuul使用一系列不同類型的過濾器(Filter),通過重寫過濾器,使我們能夠靈活的實現網關(GateWay)的各種功能。

    如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。

    服務注冊與發(fā)現

    由于微服務架構是由一系列職責單一的細粒度服務構成的網狀結構,服務之間通過輕量機制進行通信,這就引入了服務注冊與發(fā)現的問題,服務的提供方要注冊報告服務地址,服務調用放要能發(fā)現目標服務。我們的微服務架構中使用了Eureka組件來實現服務的注冊與發(fā)現。所有的微服務(通過配置Eureka服務信息)到Eureka服務器中進行注冊,并定時發(fā)送心跳進行 健康 檢查,Eureka默認配置是30秒發(fā)送一次心跳,表明服務仍然處于存活狀態(tài),發(fā)送心跳的時間間隔可以通過Eureka的配置參數自行配置,Eureka服務器在接收到服務實例的最后一次心跳后,需要等待90秒(默認配置90秒,可以通過配置參數進行修改)后,才認定服務已經死亡(即連續(xù)3次沒有接收到心跳),在Eureka自我保護模式關閉的情況下會清除該服務的注冊信息。所謂的自我保護模式是指,出現網絡分區(qū)、Eureka在短時間內丟失過多的服務時,會進入自我保護模式,即一個服務長時間沒有發(fā)送心跳,Eureka也不會將其刪除。自我保護模式默認為開啟,可以通過配置參數將其設置為關閉狀態(tài)。

    Eureka服務以集群的方式部署(在博主的另一篇文章中詳細介紹了Eureka集群的部署方式),集群內的所有Eureka節(jié)點會定時自動同步微服務的注冊信息,這樣就能保證所有的Eureka服務注冊信息保持一致。那么在Eureka集群里,Eureka節(jié)點是如何發(fā)現其他節(jié)點的呢?我們通過DNS服務器來建立所有Eureka節(jié)點的關聯,在部署Eureka集群之外還需要搭建DNS服務器。

    當網關服務轉發(fā)外部請求或者是后臺微服務之間相互調用時,會去Eureka服務器上查找目標服務的注冊信息,發(fā)現目標服務并進行調用,這樣就形成了服務注冊與發(fā)現的整個流程。Eureka的配置參數數量很多,多達上百個,博主會在另外的文章里詳細說明。

    微服務部署

    微服務是一系列職責單一、細粒度的服務,是將我們的業(yè)務進行拆分為獨立的服務單元,伸縮性好,耦合度低,不同的微服務可以用不同的語言開發(fā),每一個服務處理的單一的業(yè)務。微服務可以劃分為前端服務(也叫邊緣服務)和后端服務(也叫中間服務),前端服務是對后端服務做必要的聚合和剪裁后暴露給外部不同的設備(PC、Phone等),所有的服務啟動時都會到Eureka服務器進行注冊,服務之間會有錯綜復雜的依賴關系。當網關服務轉發(fā)外部請求調用前端服務時,通過查詢服務注冊表就可以發(fā)現目標服務進行調用,前端服務調用后端服務時也是同樣的道理,一次請求可能涉及到多個服務之間的相互調用。由于每個微服務都是以集群的形式部署,服務之間相互調用的時候需要做負載均衡,因此每個服務中都有一個LB組件用來實現負載均衡。

    微服務以鏡像的形式,運行在Docker容器中。Docker容器技術讓我們的服務部署變得簡單、高效。傳統(tǒng)的部署方式,需要在每臺服務器上安裝運行環(huán)境,如果我們的服務器數量龐大,在每臺服務器上安裝運行環(huán)境將是一項無比繁重的工作,一旦運行環(huán)境發(fā)生改變,就不得不重新安裝,這簡直是災難性的。而使用Docker容器技術,我們只需要將所需的基礎鏡像(jdk等)和微服務生成一個新的鏡像,將這個最終的鏡像部署在Docker容器中運行,這種方式簡單、高效,能夠快速部署服務。每個Docker容器中可以運行多個微服務,Docker容器以集群的方式部署,使用Docker Swarm對這些容器進行管理。我們創(chuàng)建一個鏡像倉庫用來存放所有的基礎鏡像以及生成的最終交付鏡像,在鏡像倉庫中對所有鏡像進行管理。

    服務容錯

    微服務之間存在錯綜復雜的依賴關系,一次請求可能會依賴多個后端服務,在實際生產中這些服務可能會產生故障或者延遲,在一個高流量的系統(tǒng)中,一旦某個服務產生延遲,可能會在短時間內耗盡系統(tǒng)資源,將整個系統(tǒng)拖垮,因此一個服務如果不能對其故障進行隔離和容錯,這本身就是災難性的。我們的微服務架構中使用了Hystrix組件來進行容錯處理。Hystrix是Netflix的一款開源組件,它通過熔斷模式、隔離模式、回退(fallback)和限流等機制對服務進行彈性容錯保護,保證系統(tǒng)的穩(wěn)定性。

    1、熔斷模式:熔斷模式原理類似于電路熔斷器,當電路發(fā)生短路時,熔斷器熔斷,保護電路避免遭受災難性損失。當服務異?;蛘叽罅垦訒r,滿足熔斷條件時服務調用方會主動啟動熔斷,執(zhí)行fallback邏輯直接返回,不會繼續(xù)調用服務進一步拖垮系統(tǒng)。熔斷器默認配置服務調用錯誤率閥值為50%,超過閥值將自動啟動熔斷模式。服務隔離一段時間以后,熔斷器會進入半熔斷狀態(tài),即允許少量請求進行嘗試,如果仍然調用失敗,則回到熔斷狀態(tài),如果調用成功,則關閉熔斷模式。

    2、隔離模式:Hystrix默認采用線程隔離,不同的服務使用不同的線程池,彼此之間不受影響,當一個服務出現故障耗盡它的線程池資源,其他的服務正常運行不受影響,達到隔離的效果。例如我們通過andThreadPoolKey配置某個服務使用命名為TestThreadPool的線程池,實現與其他命名的線程池隔離。

    3、回退(fallback):fallback機制其實是一種服務故障時的容錯方式,原理類似Java中的異常處理。只需要繼承HystixCommand并重寫getFallBack()方法,在此方法中編寫處理邏輯,比如可以直接拋異常(快速失?。?,可以返回空值或缺省值,也可以返回備份數據等。當服務調用出現異常時,會轉向執(zhí)行getFallBack()。有以下幾種情況會觸發(fā)fallback:

    1)程序拋出非HystrixBadRequestExcepption異常,當拋出HystrixBadRequestExcepption異常時,調用程序可以捕獲異常,沒有觸發(fā)fallback,當拋出其他異常時,會觸發(fā)fallback;

    2)程序運行超時;

    3)熔斷啟動;

    4)線程池已滿。

    4、限流: 限流是指對服務的并發(fā)訪問量進行限制,設置單位時間內的并發(fā)數,超出限制的請求拒絕并fallback,防止后臺服務被沖垮。

    Hystix使用命令模式HystrixCommand包裝依賴調用邏輯,這樣相關的調用就自動處于Hystrix的彈性容錯保護之下。調用程序需要繼承HystrixCommand并將調用邏輯寫在run()中,使用execute()(同步阻塞)或queue()(異步非阻塞)來觸發(fā)執(zhí)行run()。

    動態(tài)配置中心

    微服務有很多依賴配置,某些配置參數在服務運行期間可能還要動態(tài)修改,比如:根據訪問流量動態(tài)調整熔斷閥值。傳統(tǒng)的實現信息配置的方法,比如放在xml、yml等配置文件中,和應用一起打包,每次修改都要重新提交代碼、打包構建、生成新的鏡像、重新啟動服務,效率太低,這樣顯然是不合理的,因此我們需要搭建一個動態(tài)配置中心服務支持微服務動態(tài)配置。我們使用Spring Cloud的configserver服務幫我們實現動態(tài)配置中心的搭建。我們開發(fā)的微服務代碼都存放在git服務器私有倉庫里面,所有需要動態(tài)配置的配置文件存放在git服務器下的configserver(配置中心,也是一個微服務)服務中,部署到Docker容器中的微服務從git服務器動態(tài)讀取配置文件的信息。當本地git倉庫修改代碼后push到git服務器倉庫,git服務端hooks(post-receive,在服務端完成代碼更新后會自動調用)自動檢測是否有配置文件更新,如果有,git服務端通過消息隊列給配置中心(configserver,一個部署在容器中的微服務)發(fā)消息,通知配置中心刷新對應的配置文件。這樣微服務就能獲取到最新的配置文件信息,實現動態(tài)配置。

    以上這些框架或組件是支撐實施微服務架構的核心,在實際生產中,我們還會用到很多其他的組件,比如日志服務組件、消息服務組件等等,根據業(yè)務需要自行選擇使用。在我們的微服務架構實施案例中,參考使用了很多Spring Cloud Netflix框架的開源組件,主要包括Zuul(服務網關)、Eureka(服務注冊與發(fā)現)、Hystrix(服務容錯)、Ribbon(客戶端負載均衡)等。這些優(yōu)秀的開源組件,為我們實施微服務架構提供了捷徑。

    如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。

    三、生產環(huán)境,測試環(huán)境中,Docker 可以做什么

    生產環(huán)境,測試環(huán)境中,Docker 可以做什么

    Docker 是容器管理工具

    Docker

    是一個輕量級、便攜式、與外界隔離的容器,也是一個可以在容器中很方便地構建、傳輸、運行應用的引擎。和傳統(tǒng)的虛擬化技術不同的是,Docker

    引擎并不虛擬出一臺虛擬機,而是直接使用宿主機的內核和硬件,直接在宿主機上運行容器內應用。也正是得益于此,Docker

    容器內運行的應用和宿主機上運行的應用性能差距幾乎可以忽略不計。

    但是 Docker 本身并不是一個容器系統(tǒng),而是一個基于原有的容器化工具 LXC 用來創(chuàng)建虛擬環(huán)境的工具。類似 LXC 的工具已經在生產環(huán)境中使用多年,Docker 則基于此提供了更加友好的鏡像管理工具和部署工具。

    Docker 不是虛擬化引擎

    Docker 第一次發(fā)布的時候,很多人都拿 Docker 和虛擬機 VMware、KVM 和 VirtualBox

    比較。盡管從功能上看,Docker 和虛擬化技術致力于解決的問題都差不多,但是 Docker

    卻是采取了另一種非常不同的方式。虛擬機是虛擬出一套硬件,虛擬機的系統(tǒng)進行的磁盤操作,其實都是在對虛擬出來的磁盤進行操作。當運行 CPU

    密集型的任務時,是虛擬機把虛擬系統(tǒng)里的 CPU

    指令“翻譯”成宿主機的CPU指令并進行執(zhí)行。兩個磁盤層,兩個處理器調度器,兩個操作系統(tǒng)消耗的內存,所有虛擬出的這些都會帶來相當多的性能損失,一臺虛擬機所消耗的硬件資源和對應的硬件相當,一臺主機上跑太多的虛擬機之后就會過載。而

    Docker 就沒有這種顧慮。Docker 運行應用采取的是“容器”的解決方案:使用 namespace 和 CGroup

    進行資源限制,和宿主機共享內核,不虛擬磁盤,所有的容器磁盤操作其實都是對 /var/lib/docker/

    的操作。簡言之,Docker 其實只是在宿主機中運行了一個受到限制的應用程序。

    從上面不難看出,容器和虛擬機的概念并不相同,容器也并不能取代虛擬機。在容器力所不能及的地方,虛擬機可以大顯身手。例如:宿主機是

    Linux,只能通過虛擬機運行 Windows,Docker 便無法做到。再例如,宿主機是 Windows,Windows 并不能直接運行

    Docker,Windows上的 Docker 其實是運行在 VirtualBox 虛擬機里的。

    Docker 使用層級的文件系統(tǒng)

    前面提到過,Docker 和現有容器技術 LXC 等相比,優(yōu)勢之一就是 Docker 提供了鏡像管理。對于 Docker

    而言,鏡像是一個靜態(tài)的、只讀的容器文件系統(tǒng)的快照。然而不僅如此,Docker

    中所有的磁盤操作都是對特定的Copy-On-Write文件系統(tǒng)進行的。下面通過一個例子解釋一下這個問題。

    例如我們要建立一個容器運行 JAVA Web 應用,那么我們應該使用一個已經安裝了 JAVA 的鏡像。在

    Dockerfile(一個用于生成鏡像的指令文件)中,應該指明“基于 JAVA 鏡像”,這樣 Docker 就會去 Docker Hub

    Registry 上下載提前構建好的 JAVA 鏡像。然后再 Dockerfile 中指明下載并解壓 Apache Tomcat 軟件到 /opt/tomcat

    文件夾中。這條命令并不會對原有的 JAVA 鏡像產生任何影響,而僅僅是在原有鏡像上面添加了一個改動層。當一個容器啟動時,容器內的所有改動層都會啟動,容器會從第一層中運行 /usr/bin/java

    命令,并且調用另外一層中的 /opt/tomcat/bin

    命令。實際上,Dockerfile 中每一條指令都會產生一個新的改動層,即便只有一個文件被改動。如果用過 Git

    就能更清楚地認識這一點,每條指令就像是每次 mit,都會留下記錄。但是對于 Docker

    來說,這種文件系統(tǒng)提供了更大的靈活性,也可以更方便地管理應用程序。

    我們Spantree的團隊有一個自己維護的含有 Tomcat 的鏡像。發(fā)布新版本也非常簡單:使用 Dockerfile

    將新版本拷貝進鏡像從而創(chuàng)建一個新鏡像,然后給新鏡像貼上版本的標簽。不同版本的鏡像的不同之處僅僅是一個 90 MB 大小的 WAR

    文件,他們所基于的主鏡像都是相同的。如果使用虛擬機去維護這些不同的版本的話,還要消耗掉很多不同的磁盤去存儲相同的系統(tǒng),而使用 Docker

    就只需要很小的磁盤空間。即便我們同時運行這個鏡像的很多實例,我們也只需要一個基礎的 JAVA / TOMCAT 鏡像。

    Docker 可以節(jié)約時間

    很多年前我在為一個連鎖餐廳開發(fā)軟件時,僅僅是為了描述如何搭建環(huán)境都需要寫一個 12 頁的 Word 文檔。例如本地 Oracle

    數據庫,特定版本的

    JAVA,以及其他七七八八的系統(tǒng)工具和共享庫、軟件包。整個搭建過程浪費掉了我們團隊每個人幾乎一天的時間,如果用金錢衡量的話,花掉了我們上萬美金的時間成本。雖然客戶已經對這種事情習以為常,甚至認為這是引入新成員、讓成員適應環(huán)境、讓自己的員工適應我們的軟件所必須的成本,但是相比較起來,我們寧愿把更多的時間花在為客戶構建可以增進業(yè)務的功能上面。

    如果當時有 Docker,那么構建環(huán)境就會像使用自動化搭建工具 Puppet / Chef / Salt / Ansible

    一樣簡單,我們也可以把整個搭建時間周期從一天縮短為幾分鐘。但是和這些工具不同的地方在于,Docker

    可以不僅僅可以搭建整個環(huán)境,還可以將整個環(huán)境保存成磁盤文件,然后復制到別的地方。需要從源碼編譯 Node.js 嗎?Docker

    做得到。Docker 不僅僅可以構建一個 Node.js 環(huán)境,還可以將整個環(huán)境做成鏡像,然后保存到任何地方。當然,由于 Docker

    是一個容器,所以不用擔心容器內執(zhí)行的東西會對宿主機產生任何的影響。

    現在新加入我們團隊的人只需要運行 docker-pose up

    命令,便可以喝杯咖啡,然后開始工作了。

    Docker 可以節(jié)省開銷

    當然,時間就是金錢。除了時間外,Docker 還可以節(jié)省在基礎設施硬件上的開銷。高德納和麥肯錫的研究表明,數據中心的利用率在 6% -

    12% 左右。不僅如此,如果采用虛擬機的話,你還需要被動地監(jiān)控和設置每臺虛擬機的 CPU 硬盤和內存的使用率,因為采用了靜態(tài)分區(qū)(static

    partitioning)所以資源并不能完全被利用。。而容器可以解決這個問題:容器可以在實例之間進行內存和磁盤共享。你可以在同一臺主機上運行多個服務、可以不用去限制容器所消耗的資源、可以去限制資源、可以在不需要的時候停止容器,也不用擔心啟動已經停止的程序時會帶來過多的資源消耗。凌晨三點的時候只有很少的人會去訪問你的網站,同時你需要比較多的資源執(zhí)行夜間的批處理任務,那么可以很簡單的便實現資源的交換。

    虛擬機所消耗的內存、硬盤、CPU 都是固定的,一般動態(tài)調整都需要重啟虛擬機。而用 Docker 的話,你可以進行資源限制,得益于

    CGroup,可以很方便動態(tài)調整資源限制,讓然也可以不進行資源限制。Docker

    容器內的應用對宿主機而言只是兩個隔離的應用程序,并不是兩個虛擬機,所以宿主機也可以自行去分配資源。

    Docker 有一個健壯的鏡像托管系統(tǒng)

    前面提到過,這個托管系統(tǒng)就叫做 Docker Hub Registry。截止到 2015年4月29日,互聯網上大約有 14000

    個公共的 Docker,而大部分都被托管在 Docker Hub 上面。和 Github 已經很大程度上成為開源項目的代表一樣,Docker

    官方的 Docker Hub 則已經是公共 Docker 鏡像的代表。這些鏡像可以作為你應用和數據服務的基礎。

    也正是得益于此,你可以隨意嘗試最新的技術:說不定有些人就把圖形化數據庫的實例打包成了 Docker 鏡像托管在上面。再例如

    Gitlab,手工搭建 Gitlab 非常困難,譯者不建議普通用戶去手工搭建,而如果使用 Docker

    Gitlab,這個鏡像則會五秒內便搭建完成。再例如特定 Ruby 版本的 Rails 應用,再例如 Linux 上的 .NET

    應用,這些都可以使用簡單的一條 Docker 命令搭建完成。

    Docker 官方鏡像都有 official 標簽,安全性可以保證。但是第三方鏡像的安全性無法保證,所以請謹慎下載第三方鏡像。生產環(huán)境下可以只使用第三方提供的 Dockerfile 構建鏡像。

    Docker Github 介紹:5 秒內搞定一個 Gitlab

    關于 Linux 上的 .NET 應用和 Rails 應用,將會在以后的文章中做詳細介紹。

    Docker 可以避免產生 Bug

    Spantree 一直是“固定基礎設置”(immutable

    infrastructure)的狂熱愛好者。換句話說,除非有心臟出血這種漏洞,我們盡量不對系統(tǒng)做升級,也盡量不去改變系統(tǒng)的設置。當添加新服務器的時候,我們也會從頭構建服務器的系統(tǒng),然后直接將鏡像導入,將服務器放入負載均衡的集群里,然后對要退休的服務器進行健康檢查,檢查完畢后移除集群。得益于

    Docker 鏡像可以很輕松的導入導出,我們可以最大程度地減少因為環(huán)境和版本問題導致的不兼容,即便有不兼容了也可以很輕松地回滾。當然,有了

    Docker,我們在生產、測試和開發(fā)中的運行環(huán)境得到統(tǒng)一。以前在協同開發(fā)時,會因為每個人開發(fā)的電腦配置不同而導致“在我的電腦上是能運行的,你的怎么不行”的情況,而如今

    Docker 已經幫我們解決了這個問題。

    Docker 目前只能運行在 Linux 上

    前面也提到過,Docker 使用的是經過長時間生產環(huán)境檢驗的技術,雖然這些技術已經都出現很長時間了,但是大部分技術都還是 Linux

    獨有的,例如 LXC 和 Cgroup。也就是說,截止到現在,Docker 容器內只能在 Linux 上運行 Linux

    上的服務和應用。Microsoft 正在和 Docker 緊密合作,并且已經宣布了下一個版本的 Windows Server 將會支持

    Docker 容器,并且命名為 Windows Docker,估計采用的技術應該是Hyper-V

    Container,我們有望在未來的幾年內看到這個版本。

    Docker是一個為開發(fā)人員和系統(tǒng)管理員開發(fā)、遷移和運行應用程序的平臺。應用程序通過Docker打包成DockerImage后,可以實現統(tǒng)一的方式來下載、啟動、擴展、刪除和遷移,這樣方便了應用程序的部署和運維。本文將介紹如何在不同操作系統(tǒng)平臺上部署Docker環(huán)境的方法。信息Ubuntu:Docker剛推出的時候只支持Ubuntu,后來才一點點開始對其他平臺的支持。所以在Ubuntu平臺上部署Docker平臺還是挺簡單的。官方目前支持的版本有UbuntuTrusty14.04(LTS)、UbuntuPrecise12.04(LTS)、UbuntuSaucy13.10。Docker要求64位的系統(tǒng)且內核版本至少為3.10(如果是Ubuntu12.04LTS,則要求內核版本至少是3.13)??梢允褂胾name–r命令來確認當前系統(tǒng)的內核版本:$uname-r3.11.0-15-generic可以使用以下命令來升級內核:$sudoapt-getupdate$sudoapt-getinstalllinux-image-generic-lts-trusty$sudoreboot之后就可以安裝Docker了:$wget-qO-/boot2docker/osx-installer/releases/latest獲得。安裝完成后,Boot2Docker位于Applications文件夾。注:Boot2Docker目前只是作為開發(fā)工具發(fā)布,請不要將其應用在生產環(huán)境中。創(chuàng)建Boot2Docker虛擬機:$boot2dockerinit$boot2dockerstart$boot2dockershellinit顯示或設置Docker客戶端環(huán)境變量$boot2dockershellinit$eval"$(boot2dockershellinit)"最后驗證安裝是否成功:$dockerrunhello-worldWindows:Windows與MACOS相同,也需要安裝Boot2Docker工具。安裝文件可以在/boot2docker/windows-installer/releases/latest獲得。Windows版的Boot2Docker在啟動時會自動確認環(huán)境變量,因此可以直接驗證安裝是否成功:$dockerrunhello-world。

    測試環(huán)境和生產環(huán)境能互相轉換么

    大家做etl任務分測試環(huán)境和生產環(huán)境嗎,各個環(huán)境之間怎么切換呢?

    一般分 開發(fā),測試,uat,生產環(huán)境。切換的話先導出資源庫,在導入即可。

    怎樣利用鏡像將生產環(huán)境復制到測試環(huán)境

    通常企業(yè)不會直接導數據,而是復制整個生產環(huán)境作為測試環(huán)境,這樣可以保證測試環(huán)境的配置和正式系統(tǒng)的一樣。

    目前測試環(huán)境規(guī)劃時,通常有三套:聯調測試環(huán)境、功能測試環(huán)境、準發(fā)布環(huán)境。

    為了更接近用戶的真實環(huán)境,比如可能會用一些真實的數據來測試軟件,這時重點覆蓋的用例應當是重要的業(yè)務流程,用戶最常用的功能,本次新加的功能,對公司利益影響最大的功能等等

    運行環(huán)境和測試環(huán)境

    運行環(huán)境就是 機子支持軟件的條件 比如說有些老游戲不能在windows環(huán)境下運行,只能在DOS下運行,就是說該游戲運行環(huán)境是DOS

    同樣測試環(huán)境就是能夠支持軟件進行測試的條件

    開發(fā)環(huán)境跟測試環(huán)境于個人來說,通常是一樣的。應為通常你就用同一部電腦。

    具體說 我開發(fā)一個網站

    開發(fā)環(huán)境:windows

    tomcat

    jdk

    ·

    ·

    ·

    docker swarm 有在生產環(huán)境中用的企業(yè)嗎

    Docker Swarm 是官方發(fā)布的集群容器管理工具。它的特點是:比較輕量級,無縫支持標準的docker API。 深入淺出Swarm 一文很清晰地講解了它的架構和命令。本文從零開始搭建并管理一個swarm集群。

    準備工作

    我們需要先安裝 virtualBox 和 vagrant 。通過vagrant來驅動virtualBox搭建一個虛擬測試環(huán)境。首先在本地任意路徑新建一個空文件夾比如 test ,運行以下命令:

    virtual box host

    mkdir test

    cd test

    vagrant init minimum/ubuntu-trusty64-docker

    vi Vagrantfile

    里面應該有一句 config.vm.box = "minimum/ubuntu-trusty64-docker" ,在它的下面添加如下幾行代碼,相當于給它分配三臺虛擬機,一臺叫做 manager ,它的IP是 192.168.33.17 ;另兩臺叫做 node1 和 node2 ,它們的IP是 192.168.33.18 和192.168.33.19 。

    Vagrantfile

    config.vm.define "manager" do | host |

    host.vm.hostname = "manager"

    host.vm.neork "private_neork", ip: "192.168.33.17"

    end

    config.vm.define "node1" do | host |

    host.vm.hostname = "node1"

    host.vm.neork "private_neork", ip: "192.168.33.18"

    end

    config.vm.define "node2" do | host |

    host.vm.hostname = "node2"

    host.vm.neork "private_neork", ip: "192.168.33.19"

    end

    這個vagrant鏡像已經在ubuntu的基礎上幫我們安裝了docker,用起來很方便。然后分別在三個終端運行以下命令啟動并連接三臺虛擬機。

    virtual box host terminal 1

    vagrant up

    vagrant ssh manager

    virtual box host terminal 2

    vagrant ssh node1

    virtual box host terminal 3

    vagrant ssh node2

    搭建環(huán)境

    想要讓swarm管理node,首先得讓docker daemon支持TCP。在三臺虛擬機上運行以下命令:

    manager and node1 and node2

    sudo sh -c 'echo DOCKER_OPTS="-H tcp:0.0.0.0:2375 -H unix:/var/run/docker.sock" >> /etc/default/docker'

    sudo rm /etc/docker/key.json # 免得我們用vagrant生成的docker id都一樣,刪掉了重啟docker服務會自動生成一個新的

    sudo service docker restart

    學環(huán)境監(jiān)測這專業(yè)可以做什么?

    首先,是可以進 *** 的環(huán)境監(jiān)測站做環(huán)境監(jiān)測工作,其次可以進環(huán)境治理公司當技術員(可以是環(huán)境監(jiān)測,也可以其他工作),還可以進儀器公司當儀器設計、儀器檢驗、儀器應用、儀器售后、儀器咨詢、儀器銷售,可以進化工廠當化驗員等等。

    搭建windinws測試環(huán)境和linux測試環(huán)境有什么區(qū)別

    沒明白你想做什么,如果是應用程序測試環(huán)境,那安裝linux系統(tǒng),部署應用就行了,如果是測試數據庫,就安裝數據庫軟件

    四、docker 和 k8s 面試總結

    花了大半個月對k8s&docker進行了梳理,包括之前讀過的書,官方文檔以及k&d在公司項目的實踐等。

    以下是個人對docker & k8s 面試知識點的總結:

    1 docker

    常見面試題如下 每一點可根據回答進行適當深入

    1.1 什么是docker

    docker和傳統(tǒng)linux的差異?

    容器和鏡像的區(qū)別?

    如何理解docker的緩存機制?

    1.2 docker 網絡模型是什么?有何局限

    docker的網絡基礎是什么?

    docker的網絡模型是?有什么局限?

    docker如何實現容器間通信的?

    1.3 docker 基礎命令

    cmd和entryPoint差異?

    copy和add的差異?

    簡單講下swam/compose?

    2 kubernetes

    常見面試題如下 每一點可根據回答進行適當深入

    2.1 什么是k8s?

    1 為什么用k8s 解決了什么問題?

    2 k8s有哪些組件,有什么作用?【同:Master節(jié)點和Node節(jié)點都用哪些組件】

    3 可以簡單說下Node Pod container 之間的關系嗎? 【可引入2.2/2.3對Pod SVC的考察】

    4 什么是SVC可以簡單描述下嗎?【可引入2.3對SVC的考察】

    5 可以簡單講下k8s的網絡模型嗎?

    6 Pod SVC Node Container 之間如何相互訪問

    7 swarm和k8s如何選擇?

    2.2 考察Pod

    靜態(tài)Pod和普通Pod的差異?

    簡單講下Pod的生命周期重啟策略呢?

    - 不同組件對Pod的重啟策略要求一樣嗎?

    如何檢查Pod的健康狀態(tài)?哪2種探針?

    - 2種探針的實現方式

    簡單說下Pod的調度方式?

    2.3 考察SVC

    SVC有哪4種類型

    2.4 k8s網絡模型

    DNS和Iptables在k8s中的運用?有何差異

    - k8s如何解決多機器部署容器的網絡問題?

    Pod SVC Node Container 之間如何相互訪問

    3 參考答案

    答案是根據所在公司項目結合自己的理解給出的答案 不一定完全準確但在面試中要做到有理有據突出自己的思路即可。

    4 docker

    問題和答案 如下

    4.1 什么是docker?

    通常問這個問題主要在于考察候選人是否真正了解過docker,很多人項目中都有用到docker,真正去了解過概念,架構的不多。從而來辨別簡歷上的熟悉/了解docker的水分。

    如果這個都無法回答,那么接下來的docker考察也就毫無意義了,此問題通常也會結合以下問題來進行考察。

    docker和傳統(tǒng)linux的差異?

    docker都有哪些核心組件?

    可以簡單說下docker的架構嗎?

    容器和鏡像的區(qū)別?

    docker是什么:  Docker是一個可以把開發(fā)的應用程序自動部署到容器的開源引擎。

    docker和VM差異:  docker是一個應用層的抽象,容器之間通過網絡命名空間進行隔離,多個容器共享同一個操作系統(tǒng)內核。VM是對物理硬件層的抽象,每個VM都包含獨立的操作系統(tǒng),重且啟動緩慢。VM主要為了提供系統(tǒng)環(huán)境,容器主要是為了提供應用環(huán)境。

    docker組件:  docker引擎【包含Docker客戶端&服務端】,docker鏡像,docker容器,Registry【鏡像倉庫】

    docker的架構:  C/s架構

    容器和鏡像的區(qū)別:  鏡像是一個只讀模板,包括運行容器所需的數據,其內容在構建之后就不會被改變,可以用來創(chuàng)建新的容器。 鏡像由多個只讀層組成,容器在只讀層的基礎上多了一個讀寫層。

    4.2 docker 網絡模型是什么?有何局限

    這里也經常會結合K8s網絡原理進行考察,以及如下幾個考點

    docker的網絡基礎是什么?

    docker的網絡模型是?有什么局限?

    docker如何實現容器間通信的?

    Docker網絡基礎:  Docker是在操作系統(tǒng)層上對應用的抽象,使用網絡命名空間來對不同容器之間進行網絡隔離,用Veth設備對來進行容器之間的通訊。

    docker的網絡模型:  有4種網絡模型 分別是Bridge Container host none 默認使用bridge網絡模型,容器的初次啟動會虛擬化出來一個新的網卡名為docker0,在多機器部署下docker0地址可能會沖突。所以docker對多機部署支持的不夠友好。

    4.3 docker 基礎命令

    出現頻率較高的為以下幾條命令的考察

    cmd和entry差異?

    copy和add的差異?

    docker-compose & docker swarm?

    CMD & ENTRYPONIT

    都是容器操作指令:

    CMD 用于指定容器啟動時候默認執(zhí)行的命令。可以被docker run指定的啟動命令覆蓋。ENTRYPONIT 指令可讓容器以應用程序或者服務的形式運行。一般不會被docker run指定的啟動命令覆蓋。dockerfile中的多個CMD & ENTRYPONIT只有最后一個會生效。

    注意區(qū)別docker run 和RUN 一個是容器啟動命令,一個是鏡像構建時候所用。

    copy & add

    ADD & COPY 選取目標文件復制到鏡像當中。是針對鏡像的指令,唯一差別在于add源文件可以支持url且可以對壓縮文件進行解壓操作。而copy針對的是當前構建環(huán)境。

    docker-compose & docker swarm

    使用Docker compose可以用YAML文件來定義一組需要啟動的容器,以及容器運行時的屬性。docker-compose用來對這一組容器進行操作。

    docker swarm 原生的Docker集群管理工具,依賴docker本身,很多重要功能依賴團隊二次開發(fā)。且社區(qū)不夠活躍,一般公司生產環(huán)境會選擇k8s,個人項目或者容器數量較少可選swarm,只需要docker即可完成,相對較輕。

    5 kubernetes

    5.1 什么是k8s?

    對k8s的考察一般逃不過這樣入門級的問題,針對入門級的問題,面試官可能也會針對如下幾個點進行考察,在候選人答出來的基礎上,選擇其中一個進行深入。

    為什么用k8s 解決了什么問題?

    k8s有哪些組件,有什么作用?

    可以簡單說下Node Pod container 之間的關系嗎? 【進一步可對Pod SVC細節(jié)進行考察】

    什么是SVC可以簡單描述下嗎?【可引對SVC的考察】

    可以簡單講下k8s的網絡模型嗎?【可以和docker網絡模型結合考察】

    Pod SVC Node Container 之間如何相互訪問【衍生 外部環(huán)境如何訪問k8s】

    swarm和k8s如何選擇?

    1 什么是k8s 為什么用k8s:

    一個開源的容器集群管理平臺【容器編排工具】,可提供容器集群的自動部署,擴縮容,維護等功能。分為管理節(jié)點Master和工作節(jié)點Node。在我們的項目中主要解決了環(huán)境一致性的問題,通過CI/CD使得運維部署變得簡單起來,以及自動部署,故障監(jiān)控,自動擴縮容??梢蕴嵘_發(fā)效率。

    2 k8s有那些組件:

    etcd保存了整個集群的狀態(tài);

    apiserver提供了資源操作的唯一入口,并提供認證、授權、訪問控制、API注冊和發(fā)現等機制;

    controller manager負責維護集群的狀態(tài),比如故障檢測、自動擴展、滾動更新等;

    scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;

    kubelet負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理;

    Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);

    kube-proxy負責為Service提供cluster內部的服務發(fā)現和負載均衡;

    3 Node&Pod&container之間的關系:Node一般指工作節(jié)點包含多個Pod Pod中包含多個Container,Pod中的container共享同一個網絡命名空間。

    4 什么是SVC: SVC是對一組功能相似的Pod資源的抽象,相當于一組服務的負載均衡。

    5 k8s的網絡模型:IP-Per-Pod 每個Pod有獨立的Ip地址,無論是否處于同一個Node節(jié)點,Pod可以通過IP相互訪問,且Pod和容器的地址和外部看到的地址是同一個地址。

    6 Pod SVC Node Container 之間如何相互訪問:

    同Pod內的容器:同一個Pod的容器共享同一個網絡命名空間可以直接進行通訊

    同Node內不同Pod的容器:多個Pod都關聯在同一個Docker0網橋上,通過docker0網橋完成相互通訊。

    不同Node內Pod的容器:不同Node上的docker0可能會相同,PodIP和docker0是同網段的,所以需要將PodIP和NodeIP進行關聯且保障唯一,不同Pod之間的數據通過物理機的端口進行轉發(fā)即可完成通訊。

    7: k8s 和docker swarm如何選擇:  :

    5.2 對SVC的考察

    SVC是k8s中的核心概念 這里涉及知識點眾多 常見的面試考點如下

    什么是SVC? 如何創(chuàng)建SVC?

    使用SVC創(chuàng)建多個副本和使用RC創(chuàng)建多個副本有什么差異?

    SVC有哪幾種類型?

    SVC 負載分發(fā)策略有那些?

    集群外如何訪問SVC?

    SVC: 是對一組功能相似的Pod資源的抽象,相當于一組服務的負載均衡??梢允褂门渲梦募姆绞絼?chuàng)建也可以使用命令創(chuàng)建kubectl expose

    SVC和RC提供服務的差距:  RC創(chuàng)建的服務PodIP可能會變。SVC提供的clusterIP不會。通過Iptables的NAT轉換重定向到本地端口,在均衡到后端Pod。

    svc的幾種類型:  ClusterIp/NodePort/LoadBalancer/ExternalName

    ClusterIp 默認類型 分配的一個虛擬地址,內部可以相互訪問,外部不行

    NodePort 將SVC端口號映射到物理機

    LoadBalancer 基于NodePort,云服務商在外部創(chuàng)建了一個負載均衡到Pod

    ExternalName 將外部地址經過集群內部的再一次封裝(實際上就是集群DNS服務器將CNAME解析到了外部地址上),實現了集群內部訪問即可。

    svc負載分發(fā)策略:  RoundRobin/SessionAffinity/自定義實現【基于標簽選擇器】

    集群外部訪問:  端口映射到物理機即可

    5.2 Pod考察

    Pod和靜態(tài)Pod的區(qū)別

    生命周期和重啟策略 【這里可擴展 不同控制器對Pod的重啟策略要求】

    Pod如何健康檢查?

    Pod的調度方式?【擴展調度算法】

    Pod如何擴縮容?【擴展 RC和RS的差異】

    答案

    待補充 --詳見 《k8s權威指南》讀書筆記

    5.3 基礎原理類考察

    主要考察對基本組件的理解 和原理分析

    API Server

    Controller Manager【Replication Controller/Node Controller/ResourceQuota Controller/Namespace Controller/SVC Controller& Endpoint Controller】

    Scheduler

    Kubelet 【Pod健康檢查 資源監(jiān)控】

    Kube-Proxy

    k8s-DNS & Iptables差異

    k8s中Ingress是什么

    簡述k8s中的如下屬性及其作用resources tolerations affinity

    k8s中pod、rs、deployment、hpa的基本概念,以及他們之間的關系

    答案

    待補充 --詳見 《k8s權威指南》讀書筆記

    5.4 網絡原理類考察

    主要考察對基本組件的理解 和原理分析

    k8s的網絡模型是什么?

    Docker的網絡基礎是什么?

    Docker的網絡模型和局限?

    k8s的網絡組件之間是如何通訊的?

    外部如何訪問k8s集群?

    有那些開源組件支持k8s網絡模型?

    以上就是關于dockerswarm負載均衡相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。


    推薦閱讀:

    晚上12點過后投抖加好嗎(晚上12點投dou+可以嗎)

    英文版原版windows10

    windows關機命令cmd立即關機(cmd命令關機win10)

    抖音經典廣告語(抖音經典廣告語語音)

    小紅書專欄開通條件(小紅書如何開設專欄)