Docker學習筆記之使用 Docker Hub 中的鏡像

0x00 概述

本身編寫 Dockerfile 可以很好的實現咱們想要的程序運行環境,不過若是裝有咱們想要環境的鏡像已經由熱心的開發者構建好並共享在 Docker Hub 上,直接使用它們就會遠比本身編寫 Dockerfile 並進行構建要來的簡單的多了。事實上,在開發過程當中咱們用到的鏡像大部分仍是直接採用 Docker Hub 中已經存在的鏡像的,即便本身編寫 Dockerfile,也只是對已有鏡像進行簡單的改動,不多會從零開始搭建鏡像。在這一節中,咱們要來看看如何更好地使用 Docker Hub 上由其餘開發者共享的鏡像。mysql

 

0x01 選擇鏡像與程序版本

因爲 Docker 的容器設計是程序即容器的,因此組成咱們服務系統的多個程序通常會搭建在多個容器裏,互相之間協做提供服務。例如一套最簡單的 Web 服務,咱們可能會須要 Java 容器來運行基於 Spring Boot 的程序,須要 MySQL 容器來提供數據庫支持,須要 Redis 容器來做爲高速 KV 存儲等等。裝有這些程序的鏡像咱們均可以很容易的在 Docker Hub 上找到並直接使用,但在咱們使用前,光選擇鏡像仍是不夠的,咱們還得根據須要選擇對應程序版本的鏡像。git

雖然咱們常把軟件的版本放在 Tag 裏做爲鏡像名的一部分,但對於一些複雜的應用,除了版本外,還存在不少的變量,鏡像的維護者們也喜歡將這些變量一同組合到鏡像的 Tag 裏,因此咱們在使用鏡像前,必定要先了解不一樣 Tag 對應的不一樣內容。github

這裏咱們來看個例子,下面是由 Docker 官方提供的 OpenJDK 鏡像的說明頁面。web

一般來講,鏡像的維護者會在鏡像介紹中展現出鏡像全部的 Tag,若是沒有,咱們也可以從頁面上的 Tags 導航裏進入到鏡像標籤列表頁面。sql

在 OpenJDK 鏡像的 Tag 列表裏,咱們能夠看到一樣版本號的鏡像就存在多種標籤。在這些不一樣的標籤上,除了定義 OpenJDK 的版本,還有操做系統,軟件提供者等信息。docker

鏡像維護者爲咱們提供這麼多的標籤進行選擇,其實方便了咱們在不一樣場景下選擇不一樣環境實現細節時,都能直接用到這個鏡像,而不須要再單獨編寫 Dockerfile 並構建。數據庫

可是換句話說,正是有這麼多不一樣標籤的鏡像存在,因此咱們在選擇的時候,更要仔細認真,找到咱們想要的那個鏡像。網絡

 

0x02 Alpine 鏡像

若是你們多接觸幾個鏡像,就會發現帶有 Alpine 的版本是許多鏡像中都常見的標籤。帶有 Alpine 標籤的鏡像究竟是什麼樣的存在呢?它與相同軟件不一樣標籤的鏡像又有什麼樣的區別呢?app

鏡像標籤中的 Alpine 其實指的是這個鏡像內的文件系統內容,是基於 Alpine Linux 這個操做系統的。Alpine Linux 是一個至關精簡的操做系統,而基於它的 Docker 鏡像能夠僅有數 MB 的尺寸。若是軟件基於這樣的系統鏡像之上構建而得,能夠想象新的鏡像也是十分小巧的。webapp

在 Docker 裏,Alpine 系統的鏡像到底有多小,咱們不妨來與其餘系統鏡像作一個比較。

 

能夠看到,Alpine 系統鏡像的尺寸要遠小於其餘常見的系統鏡像。讓咱們再來比較同一個軟件在基於普通系統的鏡像和基於 Alpine 系統的鏡像後尺寸上的區別。

 

因爲基於 Alpine 系統創建的軟件鏡像遠遠小於基於其餘系統的軟件鏡像,它在網絡傳輸上的優點尤其明顯。若是咱們選擇這類的鏡像,不但能夠節約網絡傳輸的時間,也能減小鏡像對硬盤空間的佔用。

固然,有優勢也會有缺點,Alpine 鏡像的缺點就在於它實在過於精簡,以致於麻雀雖小,也沒法作到五臟俱全了。在 Alpine 中缺乏不少常見的工具和類庫,以致於若是咱們想基於軟件 Alpine 標籤的鏡像進行二次構建,那搭建的過程會至關煩瑣。因此若是你想要對軟件鏡像進行改造,並基於其構建新的鏡像,那麼 Alpine 鏡像不是一個很好的選擇 (這時候咱們更提倡基於 Ubuntu、Debian、CentOS 這類相對完整的系統鏡像來構建)。

 

0x03 對容器進行配置

除了合理選擇鏡像外,許多鏡像還爲咱們提供了更加方便的功能,這些細節咱們一般均可以在鏡像的詳情裏閱讀到。

這裏咱們以 MySQL 爲例,看看一般咱們是怎樣閱讀和使用鏡像的特殊功能的。

本身安裝過 MySQL 的朋友必定知道,搭建 MySQL 最麻煩的地方並非安裝的過程,而是安裝後進行初始化配置的過程。就拿更改 root 帳號的密碼來講,在初始的 MySQL 裏就要耗費很多工做量。

若是咱們拿到一個 MySQL 鏡像,運行起來的 MySQL 也就約等於一個剛剛安裝好的程序,面臨的正好是複雜的初始化過程。

好在 MySQL 鏡像的維護者們爲咱們打造了一些自動化腳本,經過它們,咱們只須要簡單的傳入幾個參數,就可以快速實現對 MySQL 數據庫的初始化。

在 MySQL 鏡像的詳情裏,描述了咱們要如何傳入這些參數來啓動 MySQL 容器。

 

對於 MySQL 鏡像來講,進行軟件配置的方法是經過環境變量的方式來實現的 ( 在其餘的鏡像裏,還有經過啓動命令、掛載等方式來實現的 )。咱們只須要經過這些給出的環境變量,就能夠初始化 MySQL 的配置了。

例如,咱們能夠經過下面的命令來直接創建 MySQL 中的用戶和數據庫。

$ sudo docker run --name mysql -e MYSQL_DATABASE=webapp -e MYSQL_USER=www -e MYSQL_PASSWORD=my-secret-pw -d mysql:5.7

經過這條命令啓動的 MySQL 容器,在內部就已經完成了用戶的建立和數據庫的建立,咱們經過 MySQL 客戶端就可以直接登陸這個用戶和訪問對應的數據庫了。

若是深究 MySQL 是如何實現這樣複雜的功能的,你們能夠到 MySQL 鏡像的 Dockerfile 源碼庫裏,找到 docker-entrypoint.sh 這個腳本,全部的祕密正暗藏在其中。MySQL 正是利用了 ENTRYPOINT 指令進行初始化這種任務安排,對容器中的 MySQL 進行初始化的。

經過 MySQL 鏡像這樣的邏輯,你們還能夠觸類旁通,瞭解其餘鏡像所特用的使用方法,甚至能夠參考編寫、構建一些可以提供這類方法的 Dockerfile 和鏡像。

 

0x04 共享本身的鏡像

若是咱們但願將咱們鏡像公開給網絡上的開發者們,那經過 Docker Hub 無疑是最佳的方式。

要在 Docker Hub 上共享鏡像,咱們必須有一個 Docker Hub 的帳號,這自沒必要說了。在登陸到咱們帳號的控制面板後,咱們可以找到建立的按鈕,在這裏選擇 Create Automated Build ( 建立自動構建 )。

自動構建鏡像是 Docker Hub 爲咱們提供的一套鏡像構建服務,咱們只須要提供 Dockerfile 和相關的基本文件,Docker Hub 就可以在雲端自動將它們構建成鏡像,以後即可以讓其餘開發者經過 docker pull 命令拉取到這一鏡像。

自動構建讓不須要咱們再用本機進行鏡像的構建,既能節約時間,又能享受高速的雲端機器構建。

在 Docker Hub 中並不直接存放咱們用於構建的 Dockerfile 和相關文件,咱們必須將 Docker Hub 帳號受權到 GitHub 或是 Bitbucket 來從這些代碼庫中獲取 Dockerfile 和相關文件。

 

在鏈接到 GitHub 或 Bitbucket 後,咱們就能夠選擇咱們存放 Dockerfile 和相關文件的代碼倉庫用來建立自動構建了。

 

在基本信息填寫完成,點擊建立按鈕後,Docker Hub 就會開始根據咱們 Dockerfile 的內容構建鏡像了。而此時,咱們也可以訪問咱們鏡像專有的詳情頁面了。

 

在 Build Details 頁面裏,咱們能夠看到鏡像構建的進度和詳細的構建狀況。

相關文章
相關標籤/搜索