本系列文章根據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」指令來驗證此變數,這個命令將會解析應用系統配置並且列出結果。
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),這主要是作為一種連接埠對應文件,便於之後在開通服務連接埠使用:
EXPOSE [/
...]
也可以在docker run指令中指定,例如以下的範例:
$ docker run -expose=1234 my_app
請注意,EXPOSE不允許透過定義的連接埠與同一網段之外的容器或主機進行通訊,如果要讓此情況發生,便需要公開連接埠。
Q47:Dockerfile中的ENTRYPOINT指令與RUN指令有何不同?
兩者皆可對執行的命令傳遞參數,但ENTRYPOINT用於提供執行唯一命令方式,而CMD則除了原先賦予的命令外,亦可指定新命令取代原先所設定的命令,如圖6所示。
除了上述差異外,CMD也可作為參數設定之用。為了更清楚地理解,以下面的Dockerfile來示範: