Docker面試題

1、什麼是虛擬化?

虛擬化容許在同一硬件上運行兩個徹底不一樣的操做系統,每一個客戶操做系統都經歷了引導,加載內核等全部過程。能夠擁有很是嚴格的安全性!git

能夠基於虛擬化方法如何模仿客戶操做系統的硬件並模擬客戶操做環境來對虛擬化方法進行分類。docker

主要有三種類型的虛擬化:shell

  • 仿真;
  • 半虛擬化;
  • 基於容器的虛擬化;

2、docker與虛擬機有何不一樣?

docker不是虛擬化方法,它依賴與實際實現基於容器的虛擬化或操做系統及虛擬化的其餘工具。爲此,docker最初使用LXC驅動程序,而後移動到libcontainer如今重命名爲runc。Docker主要專一於在應用程序容器內自動部署應用程序。應用程序容器旨在打包和運行單個服務,而系統容器則設計爲運行多個進程,如虛擬機。所以,Docker被視爲容器化系統上的容器管理或應用程序部署工具。編程

主要表如今如下幾個方面:安全

  • 與虛擬機不一樣,容器不須要引導操做系統內核,所以能夠在不到一秒的時間內建立容器。此功能使基於容器的虛擬化比其餘虛擬化方法更加獨特和可取;
  • 因爲基於容器的虛擬化爲主機增長了不多或沒有開銷,所以基於容器的虛擬化具備接近本機的性能;
  • 對於基於容器的虛擬化,與其餘虛擬化不一樣,不須要其餘軟件;
  • 主機上的全部容器共享主機的調度程序,從而節省了額外資源的需求;
  • 與虛擬機映像相比,容器狀態(Docker或LXC映像)的大小很小,所以容器映像很容易分發;
  • 容器中的資源管理是經過cgroup實現的。Cgroups不容許容器消耗比分配給它們更多的資源。雖然主機的全部資源都在虛擬機中可見,但沒法使用。這能夠經過在容器和主機上同時運行top或htop來實現。全部環境的輸出看起來都很類似;

3、CI(持續集成)服務器的功能是什麼?

CI功能就是在每次提交以後不斷地集成全部提交到存儲庫的代碼,並編譯檢查錯誤。服務器

4、容器內部機制?

每一個容器都是在本身的名命空間中運行,但使用與全部其餘容器徹底相同的內核。發生隔離是由於內核知道分配給進程的命名空間,而且在API調用期間確保進程只能訪問其本身的命名空間中的資源。網絡

5、什麼是docker?

  • DOcker是一個容器化平臺,它以容器的形式將您的應用程序及其全部依賴項打包在一塊兒,以確保應用程序在任何環境中無縫運行;
  • docker容器,將一個軟件包裝在一個完整的文件系統中,該文件系統包含運行所需的一切:代碼、系統工具、系統庫等能夠安裝在服務器上的任何東西;

6、什麼是docker鏡像?

docker鏡像是docker容器的源代碼,Docker鏡像用於建立容器。架構

7、什麼是docker容器?

Docker容器包括應用程序及其全部依賴項,但與其餘容器共享內核,做爲主機操做系統上用戶空間中的獨立進程運行。Docker容器不依賴於任何特定的基礎架構:它們能夠在任何計算機,任何基礎架構和任何雲中運行。ide

8、docker容器常見的幾種狀態?

Docker容器能夠有四種狀態:工具

  • 運行;
  • 已暫停;
  • 從新啓動;
  • 已退出;

能夠經過運行「docker ps –a」命令來識別Docker容器的狀態,這將依次列出全部可用的docker容器及其在主機上的相應狀態。

9、docker的基本使用流程?

  • (1)一切都從Dockerfile開始,Dockerfile是鏡像的源代碼;
  • (2)建立Dockerfile後,能夠構建它以建立容器的鏡像,鏡像只是「源代碼」的「編譯版本」,即Dockerfile;
  • (3)得到容器的鏡像後,應使用註冊表從新分發容器。註冊表就像一個git存儲庫——能夠推送和拉取鏡像;
  • (4)接下來,就可使用該鏡像來運行容器,在許多方面,正在運行的容器與虛擬機很是類似;

10、Dockerfile中常見的指令?

  • 1)FROM:構建鏡像基於哪一個鏡像;
  • 2)MAINTAINER:鏡像維護者姓名或郵箱地址;
  • 3)RUN:構建鏡像時運行的shell指令;
  • 4)CMD:運行容器時執行的shell環境;
  • 5)EXPOSE:聲明容器的服務端口(僅僅是聲明);
  • 6)ENV:設置容器環境變量;
  • 7)ADD:拷貝文件或目錄到容器中,若是是URL或壓縮包便會自動下載或自動解壓;
  • 8)COPY:拷貝文件或目錄到容器中,跟ADD相似,但不具有自動下載或解壓的功能;
  • 9)ENTRYPOINT:運行容器時執行的shell命令;
  • 10)VOLUME:指定容器掛載點到宿主機自動生成的目錄或其餘容器;
  • 11)USER:爲RUN、CMD、和ENTRYPOINT執行命令指定運行用戶;
  • 12)WORKDIR:爲RUN、CMD、ENTRYPOINT、COPY和ADD設置工做目錄,意思爲切換目錄;
  • 13)HEALTHCHECH:健康檢查;
  • 14)ARG:構建時指定的一些參數;
  • 15)LABEL:咱們使用LABEL按照項目,模塊,許可等組織咱們的鏡像。咱們也可使用LABEL來幫助實現自動化。在LABEL中,咱們指定一個鍵值對,之後可用於以編程方式處理Dockerfile;

注意:

(1)RUN在building時運行,能夠寫多條;
(2)CMD和ENTRYPOINT在運行container時,只能寫一條,若是寫多條,最後一條生效;
(3)CMD在構建容器時能夠被COMMAND覆蓋,ENTRYPOINT不會被COMMAND覆蓋,但能夠指定——entrypoint覆蓋;
(4)若是在Dockerfile文件中須要往鏡像中導入文件,則該文件必須在Dockerfile所在目錄或子目錄中;
(5)每一個目錄下最好就只有一個Dockerfile,若是有多個Dockerfile文件時,使用Dockerfile生成鏡像時便須要使用「-f」來指定具體的Dockerfile文件;
(6)指令必須所有爲大寫;
(7)使用Dockerfile生成鏡像時,保證Dockerfile中所需的軟件、文件與Dockerfile在同一個目錄下;

11、dockerfile的ONBUILD指令?

當鏡像用做另外一個鏡像構建的基礎是,ONBUILD指令向鏡像添加將在稍後執行的觸發指令。若是要構建其餘鏡像的基礎的鏡像(例如,可使用特定於用戶的配置自定義的應用程序構建環境或守護程序),這將很是有用。

12、docker鏡像和層有什麼區別?

  • 鏡像:Docker鏡像是由一些列只讀層構建的;
  • 層:每一個層表明鏡像Dockerfile中的一條指令;

重要的是,每一個層只是與以前一層的一組差別層(相同的就再也不放到鋅層中);

十3、什麼是docker swarm?

docker swarm是Docker的本機羣集,它將Docker主機池轉變爲單個虛擬Docker主機。Docker swarm提供標準的Docker API,任何已經與Docker守護進程通訊的工具均可以使用Swarm透明地擴展到多個主機。

十3、如何在多個環境中使用Docker?

能夠進行如下更改:

  • 刪除應用程序代碼的任何卷綁定,以便代碼保留在容器內,不能從外部更改;
  • 綁定到主機上的不一樣端口;
  • 以不一樣方式設置環境變量(例如,減小日誌記錄的詳細程度,或啓用電子郵件發送);
  • 指定重啓策略(例如,重啓:始終)以免停機;
  • 添加額外服務(例如,日誌聚合器);

所以,但願定義一個額外的Compose文件,它指定適合生產的配置。此配置文件只須要包含您要從原始Compose文件中進行的更改。

十4、docker默認的網絡類型?

docker默認狀況下,有五種網絡模式:

  • host模式:直接使用docker宿主機的I網絡。如IP地址、網卡類型等;
  • none模式:不會給容器進行任何網絡配置。也就是說,使用這種模式的容器沒有IP地址(只有一個迴環地址);
  • bridge模式:docker默認的網絡配置,此模式會爲每個容器分配名稱空間,能夠設置IP,可是要與docker host主機的虛擬網絡在同一網段;經過虛擬網卡與外界通訊;
  • container模式:這種模式與已經存在的容器共有同一個IP地址;
  • Network:自定義網絡。能夠自行建立而且能夠註定多種網絡驅動,如bridge、overlay等;

十5、docker容器的跨主機網絡通訊?

跨主機通訊的兩種解決方案:

  • overlay網絡:使用這種方法,須要事先建立一個consul服務,將須要跨主機通訊的docker host加入到同一個consul集羣中,而後再建立一個overlay類型的自定義網絡。因爲其網卡做用因而全局的,因此基於此網卡類型建立的容器就能夠正常通訊;

  • macvlan網絡:使用這種方法,首先開啓網卡的混雜模式,而後配置虛擬網卡,這些虛擬網卡擁有獨立的mac地址,能夠配置IP地址進行通訊。與overlay不一樣的是,macvlan的做用範圍是本地有效。

若是使用macvlan網絡的方式,須要如下步驟:

  • 首先要保證須要跨主機通訊的docker hos是能夠正常通訊的;
  • 兩臺docker host建立的虛擬網卡是在同一網段;
  • 而後兩臺docker host基於虛擬網卡建立macvlan類型的網卡;
  • 經過macvlan網絡類型建立的容器便可通訊;

十6、docker數據持久化

docker實現數據持久化的方式:

(1)Bind mount(綁定掛載):

建立容器時,使用「-v」選項,將本地的目錄掛載到容器中。採用這種方式容器的掛載類型爲bind!

Bind mount的特色:

  • Data Volume是目錄或文件,不能是沒有格式化的磁盤(塊設備);
  • 容器能夠讀寫volume中的數據;
  • 隨源文件變化而變化;
  • volume數據能夠永久保存,即便使用它的容器已經被銷燬;

注意:

  • DockerHost上須要被掛着的源文件或目錄,必須是已經存在,不然,當作的一個目錄掛着到容器中;
  • 默認掛載到容器內的文件,容器是有讀寫權限。能夠在運行容器是-v後邊加「:ro」 限制容器的寫入權限;
  • 能夠掛載單獨的文件到容器內部,使用場景:若是不想對整個目錄進行覆蓋,而只但願添加某個文件,就可使用掛載單個文件;

(2)Manager Volume(數據卷管理員)

建立容器時,使用「-v「選項,只指定容器中的目錄便可!採用這種方式容器的掛載類型爲volume;

特色:

  • 隨着源文件的變化而變化,跟Bind mount效果是同樣;
  • 刪除容器的操做,默認不會對dockerhost主機上的原文件進行刪除,若是想要在刪除容器是將原文件刪除,能夠在刪除容器時添加「-v」選項,(通常狀況下不建議使用,由於文件有可能被其餘容器就使用);

(3)Volume containe(容器與容器的數據共享)

採用這種方式,即事先建立一個容器,專用於掛載本地的目錄,而後建立容器時,使用「--volumes-from」指定掛載本地目錄的容器便可(這種模式是將本來容器中掛載的全部目錄都掛載到新建立的容器中)!

這種方式也是提供bind mount模式和manager volume模式!

—————————————————————未完待續!!!—————————————————————

相關文章
相關標籤/搜索