Docker面試問題與解答

banq發表於2018-12-29

如今,公司不再一次性發布大量功能,而是試圖透過一系列釋出列車將小功能傳輸給客戶。這具有許多優點,例如來自客戶的快速反饋,更好的軟體質量等,這反過來導致高的客戶滿意度。為實現這一目標,公司必須:
  1. 增加部署頻率
  2. 降低新版本的故障率
  3. 修復之間縮短了提前期
  4. 新版本崩潰時平均恢復時間更快

DevOps滿足所有這些要求,有助於實現無縫的軟體交付。

DevOps有哪些優勢?
技術優勢:

  • 持續的軟體交付
  • 修復不太複雜的問題
  • 更快地解決問題

商業利益:
  • 更快速地傳遞功能
  • 更穩定的操作環境
  • 有更多時間可以增加價值(而不是修復/維護)


CI(持續整合)伺服器的功能是什麼?
CI伺服器功能是不斷地整合所有正在進行的更改並由不同的開發人員提交到儲存庫,並檢查編譯錯誤。它需要每天多次構建程式碼,最好是在每次提交之後,以便它可以檢測在問題發生時是哪個提交Bug了。

什麼是虛擬化?
虛擬化允許您在相同的硬體上執行兩個完全不同的作業系統。每個客戶作業系統都經歷了引導,載入核心等所有過程。您可以擁有非常嚴格的安全性,例如,客戶作業系統無法完全訪問主機作業系統或其他客戶端並搞砸了。
可以基於虛擬化方法如何模仿客戶作業系統的硬體並模擬客戶操作環境來對虛擬化方法進行分類。主要有三種型別的虛擬化:

  • 模擬
  • 半虛擬化
  • 基於容器的虛擬化

Docker與虛擬機器有何不同?
Docker不是虛擬化方法。它依賴於實際實現基於容器的虛擬化或作業系統級虛擬化的其他工具。為此,Docker最初使用LXC驅動程式,然後移動到libcontainer現在重新命名為runc。Docker主要專注於在應用程式容器內自動部署應用程式。應用程式容器旨在打包和執行單個服務,而系統容器則設計為執行多個程式,如虛擬機器。因此,Docker被視為容器化系統上的容器管理或應用程式部署工具。

  • 與虛擬機器不同,容器不需要引導作業系統核心,因此可以在不到一秒的時間內建立容器。此功能使基於容器的虛擬化比其他虛擬化方法更加獨特和可取。
  • 由於基於容器的虛擬化為主機增加了很少或沒有開銷,因此基於容器的虛擬化具有接近本機的效能
  • 對於基於容器的虛擬化,與其他虛擬化不同,不需要其他軟體。
  • 主機上的所有容器共享主機的排程程式,從而節省了額外資源的需求。
  • 與虛擬機器映像相比,容器狀態(Docker或LXC映像)的大小很小,因此容器映像很容易分發。
  • 容器中的資源管理是透過cgroup實現的。Cgroups不允許容器消耗比分配給它們更多的資源。雖然主機的所有資源都在虛擬機器中可見,但無法使用。這可以透過在容器和主機上同時執行top或htop來實現。所有環境的輸出看起來都很相似。

容器內部機制?
大約在2006年,包括Google的一些員工在內的人們實現了名為名稱空間的新的Linux核心級功能(不過這個想法早在FreeBSD中就已存在)。作業系統的一個功能是允許將全域性資源(如網路和磁碟)共享到程式。如果將這些全域性資源包裝在名稱空間中,以使它們僅對在同一名稱空間中執行的那些程式可見,該怎麼辦?比如說,你可以獲得一大塊磁碟並將其放在名稱空間X中,然後在名稱空間Y中執行的程式無法檢視或訪問它。類似地,名稱空間X中的程式無法訪問分配給名稱空間Y的記憶體中的任何內容。當然,X中的程式無法檢視或與名稱空間Y中的程式通訊。這為全域性資源提供了一種虛擬化和隔離。
這就是Docker的工作原理:每個容器都在自己的名稱空間中執行,但使用與所有其他容器完全相同的核心。發生隔離是因為核心知道分配給程式的名稱空間,並且在API呼叫期間確保程式只能訪問其自己的名稱空間中的資源。


什麼是Docker?

  • Docker是一個容器化平臺,它以容器的形式將您的應用程式及其所有依賴項打包在一起,以確保您的應用程式在開發,測試或生產的任何環境中無縫執行。
  • Docker容器,將一個軟體包裝在一個完整的檔案系統中,該檔案系統包含執行所需的一切:程式碼,執行時,系統工具,系統庫等可以安裝在伺服器上的任何東西。
  • 這可以保證軟體始終執行相同,無論其環境如何。


如何使用Docker構建與環境無關的系統?
有三個主要功能有助於實現這一目標:

  • Volumes
  • 環境變數注入
  • 只讀檔案系統


什麼是Docker映象?
Docker映象是Docker容器的原始碼。換句話說,Docker映象用於建立容器。使用build命令建立映像,並且在使用run啟動時它們將生成容器。映象儲存在Docker登錄檔registry.hub.docker.com中,因為它們可能變得非常大,映象被設計為由其他映象層組成,允許在透過網路傳輸映象時傳送最少量的資料。

什麼是Docker容器?
Docker容器包括應用程式及其所有依賴項,但與其他容器共享核心,作為主機作業系統上使用者空間中的獨立程式執行。Docker容器不依賴於任何特定的基礎架構:它們可以在任何計算機,任何基礎架構和任何雲中執行。

什麼是Docker Hub?
Docker hub是一個基於雲的登錄檔服務,允許您連結到程式碼儲存庫,構建映象並測試它們,儲存手動推送的映象以及指向Docker雲的連結,以便您可以將映象部署到主機。它為整個開發流程中的容器映象發現,分發和變更管理,使用者和團隊協作以及工作流自動化提供了集中資源。

Docker容器有幾種狀態?
Docker容器可以有四種狀態:

  • 執行
  • 已暫停
  • 重新啟動
  • 已退出

我們可以透過執行命令來識別Docker容器的狀態:
docker ps –a
這將依次列出所有可用的docker容器及其在主機上的相應狀態。從那裡我們可以很容易地識別感興趣的容器,以相應地檢查其狀態。

什麼型別的應用程式 - 無狀態或有狀態更適合Docker容器?​​​​​​​
最好為Docker Container建立無狀態應用程式。我們可以從應用程式中建立一個容器,並從應用程式中取出可配置的狀態引數。現在我們可以在生產和具有不同引數的QA環境中執行相同的容器。這有助於在不同場景中重用相同的影像。使用Docker Containers比使用有狀態應用程式更容易擴充套件無狀態應用程式。

解釋基本的Docker使用流程

  1. 一切都從Dockerfile開始。Dockerfile是映象的原始碼。
  2. 建立Dockerfile後,您可以構建它以建立容器的映象。映象只是“原始碼”的“編譯版本”,即Dockerfile。
  3. 獲得容器的映象後,應使用登錄檔重新分發容器。登錄檔就像一個git儲存庫 - 你可以推送和拉取映象。
  4. 接下來,您可以使用該映象來執行容器。在許多方面,正在執行的容器與虛擬機器(但沒有管理程式)非常相似。



Dockerfile中最常見的指令是什麼?​​​​​​​
Dockerfile中的一些常用指令如下:

  • FROM:我們使用FROM為後續指令設定基本映象。在每個有效的Dockerfile中,FROM是第一條指令。
  • LABEL:我們使用LABEL按照專案,模組,許可等組織我們的映象。我們也可以使用LABEL來幫助實現自動化。在LABEL中,我們指定一個鍵值對,以後可用於以程式設計方式處理Dockerfile。
  • RUN:我們使用RUN命令在當前映象之上的新圖層中執行任何指令。使用每個RUN命令,我們在映象頂部新增一些內容,並在Dockerfile的後續步驟中使用它。
  • CMD:我們使用CMD命令提供執行容器的預設值。在Dockerfile中,如果我們包含多個CMD命令,則只使用最後一條指令。


Dockerfile中的命令COPY和ADD命令有什麼區別?
一般而言,雖然ADD並且COPY在功能上類似,但是COPY是優選的。
那是因為它比ADD更透明。COPY僅支援將本地檔案基本複製到容器中,而ADD具有一些功能(如僅限本地的tar提取和遠端URL支援),這些功能並不是很明顯。因此,ADD的最佳用途是將本地tar檔案自動提取到映象中,如ADD rootfs.tar.xz /中所示。

解釋一下dockerfile的ONBUILD指令?
當映象用作另一個映象構建的基礎時,ONBUILD指令向映象新增將在稍後執行的觸發指令。如果要構建將用作構建其他映象的基礎的映象(例如,可以使用特定於使用者的配置自定義的應用程式構建環境或守護程式),這將非常有用。


Docker映象和層有什麼區別?

  • 映象:Docker映象是由一系列只讀層構建的
  • 層:每個層代表映象Dockerfile中的一條指令。

下面的Dockerfile包含四個命令,每個命令都建立一個層。

FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py


重要的是,每個層只是與之前一層的一組差異層(相同的就不再放到新層中)。

什麼是Docker Swarm?
Docker Swarm是Docker的本機群集。它將Docker主機池轉變為單個虛擬Docker主機。Docker Swarm提供標準的Docker API,任何已經與Docker守護程式通訊的工具都可以使用Swarm透明地擴充套件到多個主機。

如何在生產中監控Docker?
Docker提供docker stats和docker事件等工具來監控生產中的Docker。我們可以使用這些命令獲取重要統計資料的報告。

  • Docker統計資料:當我們使用容器ID呼叫docker stats時,我們獲得容器的CPU,記憶體使用情況等。它類似於Linux中的top命令。
  • Docker事件:Docker事件是一個命令,用於檢視Docker守護程式中正在進行的活動流。

一些常見的Docker事件是:attach,commit,die,detach,rename,destroy等。我們還可以使用各種選項來限制或過濾我們感興趣的事件。

Docker如何在非Linux系統中執行容器?
透過新增到Linux核心版本2.6.24的名稱空間功能,可以實現容器的概念。容器將其ID新增到每個程式,並向每個系統呼叫新增新的訪問控制檢查。它由clone()系統呼叫訪問,該呼叫允許建立先前全域性名稱空間的單獨例項。
如果由於Linux核心中可用的功能而可以使用容器,那麼顯而易見的問題是非Linux系統如何執行容器。Docker for Mac和Windows都使用Linux VM來執行容器。Docker Toolbox用於在Virtual Box VM中執行容器。但是,最新的Docker在Windows中使用Hyper-V,在Mac中使用Hypervisor.framework。

如何在多個環境中使用Docker?
可以進行以下更改:

  • 刪除應用程式程式碼的任何卷繫結,以便程式碼保留在容器內,不能從外部更改
  • 繫結到主機上的不同埠
  • 以不同方式設定環境變數(例如,減少日誌記錄的詳細程度,或啟用電子郵件傳送)
  • 指定重啟策略(例如,重啟:始終)以避免停​​機
  • 新增額外服務(例如,日誌聚合器)

因此,您可能希望定義一個額外的Compose檔案,例如production.yml,它指定適合生產的配置。此配置檔案只需要包含您要從原始Compose檔案中進行的更改。

docker-compose -f docker-com

為什麼Docker Compose不會等待容器準備就緒,然後繼續以依賴順序啟動下一個服務?
Compose按照依賴順服啟動和停止容器,決定依賴關係語句有 depends_on, links, volumes_from, 和network_mode: "service:...".

但是,對於啟動,Compose不會等到容器“準備好它執行“。這裡有一個很好的理由:

  • 等待資料庫(例如)準備就緒的問題實際上只是分散式系統更大問題的一個子集。在生產中,您的資料庫可能隨時變得不可用或移動主機。您的應用程式需要能夠適應這些型別的故障。
  • 要處理此問題,請將應用程式設計為在發生故障後嘗試重新建立與資料庫的連線。如果應用程式重試連線,它最終可以連線到資料庫。
  • 最佳解決方案是在啟動時以及出於任何原因丟失連線時,在應用程式程式碼中執行此檢查。


 

相關文章