1. 程式人生 > 其它 >Docker實戰之compose配置檔案詳解

Docker實戰之compose配置檔案詳解

  Docker Compose是使用yml檔案來定義多個容器關係,因此掌握docker-compose.yml檔案的寫法能更好書寫配置檔案,方便管理多容器應用。其通過定義解析容器依賴關係來按順序啟動容器。

  Compose配置檔案中定義的每個服務都必須通過image標籤指定映象或build標籤來執行構建。對於上下文中存在的Dockerfile使用compose命令時,其中的指令依然有效而不必在配置檔案中重寫設定。例如,在Dockerfile中定義的變數可以在docker-compose.yml檔案中使用,用法就如shell指令碼寫法一樣,形如${}即可。

  以官網提供案例Compose specification | Docker Documentation

為例,詳解docker-compose.yml基本配置,如下:

  1、指定服務使用的映象:image

      

    在services標籤下的二級標籤是frontend/backtend,這個名字是使用者自定義的,它就是服務名。image則指定服務的映象名稱或者ID。如果映象在本地不存在,Compose江漢引數拉取這個映象。

  2、指定構建上下文:build

    服務除了可以基於指定的映象,還可以基於一份Dockerfile,在使用up命令啟動指示執行構建任務,這個構建標籤就是build——它可以指定Dockerfile所在資料夾的路徑。Compose將會利用它自動構建這個映象,然後使用這個映象啟動服務容器。其路徑格式可以如下:

    1)絕對路徑:

      build:  /path/to/build/dir

    2)相對路徑:

      build:  ./dir

    3)設定上下文根目錄,再以此目錄為準指定Dockerfile:

      build: 

        context:  ../

        dockerfile:  path/of/Dockerfile

    如果同時指定了image和build兩標籤,那麼Compose會構建映象並且吧映象命名為image後面的名字。

  3、指定服務映象啟動命令:command

    使用該命令可以覆蓋容器啟動後預設執行的命令。

  4、指定執行服務的容器名稱:container_name

    預設容器名稱格式是<專案名>_<服務名>_<序號>。雖然可以自定義,但是如果想網橋控制容器的命名就得使用該命令指定容器名稱:

      container_name:  app

  5、指定服務依賴關係:depends_on

    使用Compose最大的優勢在於減少使用繁瑣的啟動命令,但是一般專案容器啟動的順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗。

    例如在沒有啟動資料庫容器的時候啟動了應用容器,這時候應用容器因為找不到資料庫而退出(與非容器啟動專案一樣)。為了避免此種情況,得找到解決方案:加入一個標籤,就是depends_on。該標籤解決了容器依賴,啟動先後順序的問題。

    如docker-compose實戰之Nginx反向代理 - 池塘裡洗澡的鴨子 - 部落格園 (cnblogs.com)中配置檔案就使用了該標籤:tomcat的啟動依賴於nginx,即確保nginx啟動成功tomcat才會啟動。

        

     如果docker-compose up 指定啟動tomcat1,nginx也會啟動。因為配置檔案中定義了依賴關係,對於存在依賴關係的應用預設啟動。

  還有其他很多配置,如:指定服務的DNS配置:dns;掛載臨時目錄:tmpfs;指定服務映象的接入點:entrypoint;設定compose變數:env_file;設定環境變數:environment;指定埠暴露:expose;選擇專案外的容器:external_links;擴充套件連線伺服器的hosts列表:extra_hosts;新增元資料:labels;設定容器互聯:links;配置服務日誌:logging……等此處不詳述,後續使用過程中詳細闡述。

  除了以上基本配置,還有網路配置,如下:

        

        

   Compose可以知道自定義網路,而不是使用預設的應用網路,這就為使用者建立更復雜的拓撲結構和指定自定義網路驅動程式和選項提供了條件。以官網提供配置檔案應用之間訪問為例:

        

    webapp服務位於專案的中間網路,database服務與後端網路。

   處理配置預設網路之外,還可以使用已經存在的網路,在service同級標籤中設定networks覆蓋全部服務容器。