1. 程式人生 > 實用技巧 >ElasticSearch(十八):解決org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];

ElasticSearch(十八):解決org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];

閱讀目錄(Content)

回到頂部(go to top)

一、什麼是Docker?

Docker時Docker.Lnc公司開源的一個基於LXC技術之上搭建的Container容器引擎,原始碼託管在Github上,基於Go語言並遵從Apache2.0協議開源。
Docker屬於Linux容器的一種封裝,提供簡單易用的容器使用介面。
Docker將應用程式與該程式的依賴,打包在一個檔案裡面。執行這個檔案,就會生成一個虛擬容器。程式在這個虛擬容器裡執行,就好像在真實的物理機上執行一樣。有了Docker,就不用擔心環境問題。
總體來說,Docker的介面相當簡單,使用者可以方便地建立和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的程式碼一樣。

回到頂部(go to top)

二、Docker的概念

Docker是開發人員和系統管理員使用容器開發、部署和執行應用程式的平臺。使用Linux容器來部署應用程式稱為集裝箱化。使用docker輕鬆部署應用程式。

集裝箱化的優點:

  • 靈活:即使是複雜的應用程式也可封裝。
  • 輕量級:容器利用並共享主機核心。
  • 行動式:您可以在本地構建,部署到雲上並在任何地方執行。
  • 可擴充套件性:您可以增加和自動分發容器副本。
  • 可堆疊:您可以垂直堆疊服務並及時並及時堆疊服務。
回到頂部(go to top)

三、images和容器

通過執行images啟動容器,一個images是一個可執行的包,其中包括執行應用程式所需要的所有內容-程式碼,執行時,庫、環境變數和配置檔案。
容器時images執行時示例-當被執行時(即,images狀態,或者使用者程序)在記憶體中,可以使用命令檢視正在執行容器的列表docker ps,就像在Linux中一樣。
回到頂部(go to top)

四、虛擬機器

虛擬機器(virtual machine)就是帶環境安裝的一種解決方案。它可以在一種作業系統裡面執行另一種作業系統,比如在Windows系統裡面執行Linux系統。應用程式對此毫無感知,因為虛擬機器看上去跟真絲系統一模一樣,而對於底層系統來說,虛擬機器就是一個普通檔案,不需要了就刪掉,對其它部分毫無影響。

虛擬機器的缺點:

  • 資源佔用多:虛擬機器會獨佔一部分記憶體和硬碟空間。它執行的時候,其他程式就不能使用這些資源了。哪怕虛擬機器裡面的應用程式,真正使用的記憶體只有1M,虛擬機器依然需要幾百MB的內容才能執行。
  • 冗餘步驟多:虛擬機器是完整的作業系統,一些系統級別的操作步驟,往往無法跳過,比如使用者登入。
  • 啟動慢:啟動作業系統需要多久,啟動虛擬機器就需要多久。可能要等幾分鐘,應用陳故鄉才能真正執行。
回到頂部(go to top)

五、Linux容器

由於虛擬機器存在這個缺點,Linux發展出了另一種虛擬化技術:Linux容器(Linux Containers,縮寫為LXC)。
Linux容器不是模擬一個完整的作業系統,而是對程序進行隔離。或者說,在正常程序的外面套了一個保護層。對於容器裡面的程序來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。
由於容器是程序級別的,相比虛擬機器又很多優勢。
  • 啟動快:容器裡面的應用,直接就是底層系統的一個程序,而不是虛擬機器內部的程序。所以,啟動容器相當於啟動本機的一個程序,而不是啟動一個作業系統,速度就快很多。
  • 資源佔用少:容器只佔用需要的資源,不佔用那些沒有用到的資源;虛擬機器由於是完整的作業系統,不可避免要佔用所以資源。另外,多個容器可以共享資源,虛擬機器都是獨享資源。
  • 體積小:容器只要包含用到的元件即可,而虛擬機器是整個作業系統的打包,所以容器檔案比虛擬機器檔案要小很多。總之,容器有點像輕量級的虛擬機器,能夠提供虛擬化的環境,但是成本開銷小得多。
回到頂部(go to top)

六、容器和虛擬機器

一個容器中執行原生Linux和共享主機與其它容器的核心,它執行一個獨立的程序,不佔用任何其它可執行檔案的記憶體,使其輕量化。

相比之下,虛擬機器(VM)執行一個完整的“客戶”作業系統,通過虛擬機器管理程式虛擬訪問主機資源。一般來說,虛擬機器提供的環境比大多數應用程式需要的資源多。

回到頂部(go to top)

七、Docker產生的目的就是解決以下問題

  • 環境管理複雜:從各種OS到各個中介軟體再到各種App,一款產品能夠成功釋出,作為開發者需要關心的東西太多,且難於管理,這個問題在軟體興業中普遍存在並需要直接面對。Docker可以簡化部署多種應用例項工作,比如Web應用、後臺應用、資料庫應用、大資料應用比如Hadoop叢集、訊息佇列等等都可以打包成一個image部署。
  • 雲時代的到來:AWS的成功,引到開發者將應用轉移到雲上,解決來硬體管理的問題,然而軟體配置和管理香瓜的問題依然存在。Docker的出現正好能幫助軟體開發著開闊思路,嘗試新的軟體管理的方法解決這個問題。
  • 虛擬化手段的變化:雲時代採用標配硬體來降低成本,採用虛擬化手段來滿足使用者按需分配的資源需求以及保證可用性和隔離性。然而無論是KVM還是Xen,在Docker看來都是在浪費資源,又難於管理,更加輕量級大LXC更加靈活和快速:
  • LXC的便攜性:LXC在Linux 2.6的Kernel裡就已經存在了,但是其設計之初並非為雲端計算考慮,缺少標準化的描述手段和容器的可便攜性,決定其構建出的環境難於分發和標準化管理(相對於KVM之類的image和sanpshot的概念)。Docker就在這個問題上作出了實質性的創新方法。
回到頂部(go to top)

八、Docker的用途

Docker的主要用途,目前又三大類:

  • 提供了一次性的環境:比如,本地測試他人的軟體、持續整合的時候提供單元測試和構建的環境。
  • 提供彈性的雲服務:因為Docker容器可以隨開隨關,很適合動態擴容和所容。
  • 組建微服務架構:通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構。
回到頂部(go to top)

九、基本概念

Docker映象

作業系統分為核心和使用者空間,對於Linux而言,核心啟動後,會掛載root檔案系統為其提供使用者空間支援。而Docker映象(Image),就相當於是一個root檔案系統。
Docker映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。

分層儲存

因為映象包含系統完整的root檔案系統,其體積往往是龐大的,因此在Docker設計時,就充分利用Union FS技術,將其設計為分層儲存的架構。所以嚴格來說,映象並非是像一個ISO那樣的打包檔案,映象只是一個虛擬的概念,其實際體現並非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層系統聯合組成。
映象構建時會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層,比如,刪除前一層檔案的操作,實際不是真的刪除前一層的檔案,而是僅在當前層標記為該檔案已刪除。在最終容器執行的時候,雖然不會看到這個檔案,但是實際上該檔案會一直跟隨映象。因此,在構建映象的時候,需要額外小心,每一層儘量只包含該層需要新增的東西,任何額外的東西應該在該層構建結束前清理掉。
分層儲存的特徵還使得映象的複用、定製變的更為容易。甚至可以用之前構建好的映象作為基礎層,然後進一步新增新的層,以定製自己所需要的內容,構建新的映象。

Docker容器

映象(image)和容器(container)的關係,就像是面向物件程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
容器的實質是程序,但與直接在宿主執行的程序不同,容器程序運行於屬於自己的獨立的名稱空間。因此容器可以擁有自己的root檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者ID空間。容器內的程序是執行在一個隔離的環境裡,使用起來,就好像是在一個獨立宿主的系統下操作一樣。這種特性使容器封裝的應用比直接在宿主執行更加安全。
前面講過映象使用的是分層儲存,容器也是如此。每一個容器執行時,是以映象為基礎層,在其上建立一個當前容器的儲存層,可以稱這個味容器執行時讀寫而準備的儲存層為容器儲存層。
容器儲存層的生存週期和容器一樣,容器消亡時,容器儲存層也隨之消亡。因此,任何保存於容器儲存層的資訊都會隨容器刪除而丟失。
按照Docker最佳實踐的要求,容器不應該向其儲存層寫入任何資料,容器儲存層要保持無狀態化。所有的檔案寫入操作,都應該使用資料卷(volume)、或者繫結宿主目錄,在這些位置的讀寫會跳過儲存層,直接對宿主(或網路儲存)發生讀寫,其效能和穩定性更高。
資料卷的生存週期獨立於容器,容器消亡,資料卷不會消亡。因此,使用資料卷後,容器刪除或者重新執行之後,資料卻不會丟失。

倉庫

Docker Registry

映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務,Docker Registry就是這樣的服務。
一個Docker Registry中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(tag);每個標籤對應一個映象。
通常,一個倉庫會包含一個軟體不同版本的映象,而標籤就常用於對應該軟體的各個版本。我們可以通過<倉庫名>:<標籤>的格式來指定具體是這個軟體那個版本的映象。如果不給出標籤,將以laest作為預設標籤。
以ubuntu映象為例,ubuntu是倉庫的名字,其包含有不同的版本標籤,如,14.04,16.04。我們可以通過ubuntu:14.04或者ubuntu:16.04來具體指定所需要哪個版本的映象。如果忽略了標籤,比如ubuntu,那將視為ubuntu:latest。
倉庫名經常以兩段式路徑形式出現,比如jwilder/nginx-proxy,前者意味著Docker Registry多使用者環境下的使用者名稱,後者則往往是對應的軟體名。但這並非絕對,取決於所使用的具體Docker Registry的軟體或服務。

Docker Registry公開服務

Docker Registry公開服務是開放給使用者使用、允許使用者管理映象的Registry服務。一般這類公開服務允許使用者免費上傳、下載公開的映象,並可能提供收費服務供使用者管理私有映象。
最常使用的Registry公開服務是官方的Docker Hub,這也是預設的Registry,並擁有大量的高質量的官方映象。除此以外,還有CoreOS的Quay.io,CoreOS相關的映象儲存在這裡;Google的Google Container Registry,Kubernetes的映象使用的就是這個服務。
在國內訪問這些服務可能會比較慢,郭恩ID餓一些雲服務商題提供了針對Docker Hub的映象服務(Registry Mirror),這些映象服務被稱為加速器。常見的有阿里雲加速器、DaoCloud加速器等。使用加速器會直接從國內的地址下載Docker Hub的映象,比直接從Docker Hub下載速度會提高很多。