容器 Docker 備份 還原 資料共享 監控

容器技術條理說分明 由淺入深QA快問快答

基礎知識打底必讀 Docker面試100題(二)

2019-03-11
本系列文章根據Ajeet Singh Raina所寫的「Top 100 Docker Interview Questions」文章,翻譯轉載成一百個問題與答案,並Docker相關面試問題分成初級、中級和進階級。本文為初級的第二部分,很適合正在準備Docker相關工作的職缺面試或是想要吸收Docker相關知識的IT從業人員。

以下的操作將示範如何替Docker Compose宣告預設環境變數。

如圖4所示,當執行「docker-compose up」時,其中Web服務定義是使用alpine:v3.4映像檔,可使用「docker-compose config」指令來驗證此變數,這個命令將會解析應用系統配置並且列出結果。

圖4  執行docker-compose config。

Q44:請列出Docker Compose下如何在檔案和專案之間共享Compose配置設定的方法?

Compose支持共享通用配置的兩種方法說明如下:

1. 可使用多個Compose配置檔依照不同情境來擴展整個Compose設定。例如docker-compose.yml,內容如下:

 

  web:  image: example/my_web_   app:latest   links:     - db     - cache db:   image: postgres:latest cache:   image: redis:latest

 

而docker-compose.prod.yml內容為:

 

 

  web:   ports:     - 80:80   environment:     PRODUCTION: 'true' cache:   environment:     TTL: '500'

 

當在營運環境時,就可用下列指令覆蓋過去:

 

 

  $ docker-compose -f docker- compose.yml -f docker-compose. prod.yml up –d

 

2. 在YMAL定義檔中使用extends欄位來擴展單一服務。

 

例如docker-compose.yml,內容如下:

 

  web:   extends:     file: common-services.yml     service: webapp

 

其Web服務就會參考common-services.yml定義檔來延伸設定:

 

 

  common-services.yml webapp:   build: .   ports:     - "8000:8000"   volumes:     - "/data"

 

但是,請留意links、volumes_from和depends_on這三項欄位,無法在服務間共享其配置,詳細請見官網文件(https://docs.docker.com/compose/extends/)。

 

Q45:請問.dockerignore文件的作用是什麼?

就如同.gitignore,要了解.dockerignore檔的作用,就來看一個實際的例子,可能你已經注意到,如果將Dockerfile放在home目錄中並啟動docker build,將看到一條上傳資料內容的訊息,對吧?這意味Docker會建立一個.tar檔,其中包含home目錄及所有子目錄的所有文件,並將此tar載入到Docker Daemon,如果home目錄底下有巨大的文件,便需要很長的執行時間。

為了避免這種情況,會需要建立一個特定目錄,其中放置Dockerfile,以及建構所需的相關內容,且有必要通知Docker在建構期間忽略一些檔案,因此,會需要在.dockerignore中放入建置時不需要的所有檔名,在Docker CLI將內容傳送到Docker Daemon之前,它會在Dockerfile所在的根目錄中尋找名為.dockerignore的文件,如果此檔案存在,CLI將修改上下文內容以便排除與其中模式吻合的文件和目錄,這有助於避免不必要的大型檔案或機敏文件目錄傳送到Daemon,且有可能利用ADD或COPY將它們加入到映像檔,造成關鍵資料外洩。

Q46:Dockerfile中的EXPOSE命令用途是什麼?

在編寫Dockerfile時,EXPOSE指令的目的在於通知Docker,其正在運行之容器具有哪些傾聽的特定連接埠(圖5),這主要是作為一種連接埠對應文件,便於之後在開通服務連接埠使用:

圖5  使用Dockerfile EXPOSE指令。

  EXPOSE [/
...]

 

也可以在docker run指令中指定,例如以下的範例:

 

 

  $ docker run -expose=1234 my_app

 

請注意,EXPOSE不允許透過定義的連接埠與同一網段之外的容器或主機進行通訊,如果要讓此情況發生,便需要公開連接埠。

 

Q47:Dockerfile中的ENTRYPOINT指令與RUN指令有何不同?

兩者皆可對執行的命令傳遞參數,但ENTRYPOINT用於提供執行唯一命令方式,而CMD則除了原先賦予的命令外,亦可指定新命令取代原先所設定的命令,如圖6所示。

圖6  CMD及ENTRYPOINT之Dockerfile。

除了上述差異外,CMD也可作為參數設定之用。為了更清楚地理解,以下面的Dockerfile來示範:



追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!