Docker最全教程——從理論到實戰(四)

往期內容連接

http://www.javashuo.com/article/p-zwsmmmid-bm.htmlhtml

http://www.javashuo.com/article/p-ewonxmgb-eq.html前端

http://www.javashuo.com/article/p-cyahnits-ep.htmlnode

 

在筆者參加騰訊容器服務技術交流會時,咱們瞭解到了藏區牧民的目前的生活艱辛情況,所以除了在同事朋友之間推薦其土特產以外,咱們也在此進行初步分享,但願略盡綿薄之力,可以幫助到他們:linux

貨真價實、確保都是3700米海拔以上的超風乾犛牛肉,115元一斤包郵(貨真價實、低於淘寶京東、咱們不賺差價),有香辣、五香兩種口味,三斤犛牛肉才能作出一斤超風乾牛肉!但願這個冬天,咱們可以給他們一點點溫暖!有購買意向的朋友能夠聯繫博主。git

 

 

建立自定義 Docker 鏡像

 

建立了Dockerfile以後,需爲應用程序中的每項服務建立一個相關鏡像。若是應用程序由單個服務或 Web 應用程序組成,則只需建立一個鏡像。github

咱們可使用docker build命令來建立鏡像,例如:web

docker build ./ -t {鏡像名稱}redis

鏡像打包好後,咱們使用docker image ls命令便可查看當前鏡像:sql

注意:Docker鏡像使用分層存儲的架構,也就是說鏡像實際是由多層文件系統聯合組成。鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。由於分層存儲的特徵,使得鏡像的複用、定製變的更爲容易。甚至能夠用以前構建好的鏡像做爲基礎層,而後進一步添加新的層,以定製本身所需的內容,構建新的鏡像。因此,當咱們使用Docker images命令,會列出這麼多的鏡像,咱們能夠按期清理那些無用的鏡像。docker

若是使用 Visual Studio 建立帶 Docker 支持的項目時,不會顯式建立鏡像。咱們按下 F5 並運行時,VS就會自動建立鏡像,不會出現明顯的過程(在輸出面板能夠了解整個過程,以下圖所示),但咱們須要瞭解其原理,不然出現問題將無從下手。

 

在 docker-compose.yml中定義服務

 

關於Compose

Compose是一個用於定義和運行多Docker應用程序的工具。使用Compose,咱們可使用YAML文件來配置應用程序的服務。而後,使用單個命令,咱們就能夠從配置中建立並啓動全部服務。

Compose適用於全部環境:生產環境、模擬(演示)環境、開發環境和測試環境以及CI工做流程。

主要功能和特性:

  • 單個主機上的多個隔離環境

    Compose使用項目名稱來隔離環境,所以能夠根據不一樣的環境要求來進行定義。

  • 建立容器時保留卷數據

    Compose會保留服務使用的全部卷和數據。當使用docker-compose up命令運行時,若是發現該服務以前運行過,它會將進行增量操做,可確保在卷中建立的數據都不會丟失。

  • 僅從新建立已更改的容器

    Compose存在緩存,可用於建立容器。當從新啓動未更改的服務時,Compose將重用現有容器。

  • 能夠定義變量,並且能夠根據不一樣環境不一樣用戶之間進行組合使用

    Compose支持Compose文件的變量定義,咱們可使用這些變量爲不一樣環境或不一樣用戶進行自定義組合。

另外,Compose可以經過命令管理應用程序的整個生命週期,經過命令能夠:

  • 啓動,中止和重建服務等

  • 查看正在運行的服務的狀態

  • 經過流輸出正在運行的服務的日誌

  • 對某個服務執行命令

注意:Docker for Windows安裝包括:安裝提供 Docker Engine,Docker CLI客戶端,Docker Compose,Docker Machine和 Kitematic。也就是若是是使用Docker for Windows的用戶,無需再獨立安裝Docker Compose。

咱們能夠經過運行如下命令來確認咱們本地的環境:

docker-compose -v

 

常見場景

  • 開發或本地環境運行多個服務

    在開發過程時,在隔離環境中運行應用程序並與之交互的能力相當重要。Compose命令行工具可用於建立環境並與之交互。好比經過Compose文件,配置全部應用程序的服務依賴(數據庫,消息隊列,高速緩存,Web服務的API,等等),而後使用單個命令(docker-compose up)爲每一個依賴項建立和啓動一個或多個容器,使整個程序可以正常運行起來。

  • 自動化測試環境

    任何持續部署或持續集成過程的一個重要部分是自動化測試套件。自動化端到端測試須要一個運行測試的環境。Compose提供了一種方便的方法來建立和銷燬隔離的測試環境。咱們只須要經過在Compose文件,便可定義完整環境,而且能夠在幾個命令中建立和銷燬這些環境,以下所示:

  • 單主機部署

 

使用Compose

使用Compose有如下三個步驟:

  1. 使用Dockerfile定義應用環境,以便在任意地方進行復制

  2. 在 docker-compose.yml 中定義組合應用,以便它們能夠在隔離的環境中一塊兒運行

  3. 最後,執行docker-compose up命令,Compose 將啓動並運行整個應用程序。

因而可知,第二步決定了Compose的執行,一個簡單的docker-compose.yml文件以下所示:

其定義了web和redis兩個應用。接下來,咱們一塊兒來了解docker-compose.yml 文件。

 

瞭解docker-compose.yml

藉助 docker-compose.yml 文件,咱們能夠定義一組相關服務,經過部署命令將其部署爲組合應用程序。簡單的說,咱們能夠經過docker-compose.yml來定義多個服務,以便一次執行。

這裏筆者以Magicodes.Admin爲例,基礎框架提供了後臺接口服務以及後臺前端應用兩個,那麼咱們能夠定義docker-compose.yml 文件以便部署爲組合應用程序,也就是說,一個命令託管和運行多個服務:

以上是一個簡化的配置,定義了兩個服務以及環境變量和端口。值得說明的是,在docker中咱們沒法訪問localDb,這時咱們建議訪問獨立的數據庫服務或者使用數據庫鏡像,例如:

sql.data:

image: mssql-server-linux:latest

environment:

- SA_PASSWORD=Pass@word

- ACCEPT_EULA=Y

ports:

- "5433:1433"

注意:SQL Server也提供了Docker鏡像,而且支持Linux容器。在上面的配置中,經過環境變量設置了sa帳號的密碼。值得注意的是,咱們並不推薦在生產環境中使用數據庫的容器鏡像來託管數據,這點咱們後續再來詳聊。

 

瞭解YAML語言

不少教程並不會講述這點,可是筆者認爲這點也很是重要,由於瞭解YAML的語法和規範,能夠在開發調測的過程當中避免不少錯誤,也便於咱們更好的配置基於YAML語法的文件——好比docker-compose.yml文件。

 

什麼是YAML?

YAML 是一種簡潔的非標記語言。YAML以數據爲中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易讀。

這裏提供一個YAML語法驗證網站:http://nodeca.github.io/js-yaml/

基本規則

  1. 大小寫敏感

  2. 使用縮進表示層級關係

  3. 禁止使用tab縮進,只能使用空格鍵

  4. 縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級

  5. 使用#表示註釋

  6. 字符串能夠不用引號標註

YAML中容許表示三種格式,分別是常量值,對象和數組,以下所示:

對於YAML的講解,咱們就說到這裏,咱們繼續本篇內容。

 

docker-compose.yml文件配置項

docker-compose.yml 文件不只指定正在使用的容器,還指定如何單獨配置各容器。經常使用的配置項以下所示:

  • build:定義鏡像生成,能夠指定Dockerfile文件所在的目錄路徑,支持絕對路徑和相對路徑;

  • image:從指定的鏡像中啓動容器,能夠是存儲倉庫、標籤以及鏡像 ID,若是鏡像不存在,Compose 會自動拉去鏡像;

  • environment:定義環境變量和配置;

  • ports:定義端口映射,好比上面配置中將容器上的公開端口 80 轉接到主機上的外部端口 9901和9902;

  • depends_on,定義依賴關係。此定義會讓當前服務處於等待狀態,直到這些依賴服務啓動。好比某個服務依賴數據庫服務,那麼經過此配置解決了服務的啓動順序的問題;

  • volumes,掛載一個目錄或者一個已存在的數據卷容器,能夠直接使用 HOST:CONTAINER 這樣的格式,或者使用 HOST:CONTAINER:ro 這樣的格式,後者對於容器來講,數據卷是隻讀的,這樣能夠有效保護宿主機的文件系統;

  • context,指定Dockerfile 的文件路徑,也能夠是到連接到 git 倉庫的 url;

  • args,指定構建參數,這些參數只能在構建過程當中訪問;

  • target,定義構建指定的階段Dockerfile,好比針對不一樣階段使用不一樣的dockerfile,開發階段使用支持編譯調試的dockerfile,而生產環境,則使用輕量級的dockerfile;command,覆蓋默認命令;

  • container_name,指定自定義容器名稱,而不是生成的默認名稱。

因爲篇幅有限,咱們就不提供過多介紹和示例了。不過咱們建議你們訪問此地址,來作一個全面的瞭解:

https://docs.docker.com/compose/compose-file/#reference-and-guidelines

最後,分享幾個小技巧:

  • 能夠經過配置項depends_on來定義依賴關係,這點對於控制服務的執行順序尤其重要,好比先啓動數據庫而後再啓動web服務。

  • 如何使用JSON文件進行配置?能夠指定文件名稱,以下所示:

    docker-compose -f docker-compose.json up

  • 如何分階段構建?推薦使用target配置項。

 

Visual Studio和docker-compose

咱們定義完docker-compose.yml以後,若是是使用Visual Studio進行開發,經過其Docker tool會讓開發調測變得很是簡單和易用。對於未啓用docker支持的項目,咱們能夠經過右鍵菜單進行啓用:

啓用以後,會自動添加相關支持(包括生成dockerfile、docker-compose.yml以及.dockerignore等),而後經過其docker工具能夠直接啓動運行而且支持調試,以下圖所示:

點擊工具欄的【Docker】按鈕或者按下【F5】都可直接運行並調試,啓動後以下圖所示:

運行完成後,VS還會自動打開相關服務的默認頁。

若是不依賴Visual Studio進行運行,咱們在下節進行講述。

相關文章
相關標籤/搜索