Docker 介紹

Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實作。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,原始碼在 GitHub 上進行維護。

Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支援 Docker Google 也在其 PaaS (平台及服務)產品中廣泛應用。

Docker 專案的目標是實作輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。

在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。

參考資料: https://philipzheng.gitbook.io/docker_practice/introduction/what

Docker 哲學

Docker 的基本哲學 Build and Ship any Application Anywhere,也就是讓你可以建置任何應用程式並運行在任何地方。它讓我們可以分離應用程式運行的基礎設施(infrastructure),快速的建立、發佈應用程式。開發應用程式時也可以專注開發應用,而不用花太多的時間在安裝/運行環境的設置。

Docker 架構

參考資料: https://docs.docker.com/get-started/overview/

虛擬機器 vs 容器

Virtual Machine

參考資料: https://oer.gitlab.io/oer-on-oer-infrastructure/figures/OS/virtual-machines.png


Container

參考資料:https://oer.gitlab.io/oer-on-oer-infrastructure/figures/OS/containers.png

差異比較

Docker虛擬機
消耗資源只消耗軟體實際運行需要的資源,一臺普通PC機可以輕鬆啟動幾十到上百個容器需要預分配CPU/記憶體/硬碟資源,一臺普通PC機一般只能啟動幾個虛擬機
文件大小MB級別,只包括運行必要的文件和一些元數據,一般只包含操作系統外殼不包含內核GB級別,需要包括完整的操作系統以及預分配的磁碟文件
隔離性Docker可以限制容器的資源消耗,但不能防止別的進程占用容器資源虛擬機之前相互干擾比較少
啟動速度啟動速度快,可以在秒級十秒級甚至分鐘級
安全性Docker運行環境導致開發維護人員需要使用root許可權,風險比較高。有一些黑客手段可以在容器裡面對宿主機器進行破壞。安全性比較高
穩定性Docker版本一直在快速更新,不同版本間細節差異會比較大。技術較穩定

Docker的三個基本觀念

映像檔(Image)

映像檔為一個唯獨的模板,內可包含完整的ubuntu作業系統環境。映像檔可用來快速生產Docker容器,並可重複產生。映像檔可以透過Dockerfile建立,或是開放公開下載的地方取得。

容器(Container)

容器是由映像檔建立出來的實例,Docker即是利用容器來執行關鍵技術,容器可以被啟動、開始、停止、刪除,且容易與容器之間是相互隔離、保證安全的。

倉庫(Repository)

倉庫是用以放置映像檔檔案的場所,每個倉庫可收納多個映像檔,而每個映像檔又有相對應的標籤。倉庫共有公開倉庫(Public)及私有倉庫(Private)兩種形態。而最大的公開倉庫為Docker Hub,裡面存放了大量的現成、實用映像檔供使用者下載。

基礎常用指令

docker images列出本機映像檔docker images
docker pull下載映像檔
docker rm刪除已停止的 container
docker rmi刪除映像檔
docker build建立 docker image 可參考這裡的 dockerFile 
docker run執行 docker container 以下面例子會
echo 出 hello world docker run busybox echo “hello world”
docker stop停止執行中的 container
docker ps -a可以看到目前所有被管控的 container,不論它是開著關著甚至是剛建立都可以看到
docker logs輸出 container 本身的 log ,預設container 的輸出就是這個地方

常見專有名詞

  • Container (容器) –
    docker 只是容器其中一款,市面上還有許多不同種容器,例
    containerd、Podman … etc。
  • Docker Registry –
    存放 docker image 的地方,例 docker hub,也可自建私有 docker registry 參考
  • Docker Compose –
    如名稱一樣,可將多個 docker 服務整合成一個設定檔,然後一次執行多個服務,建立一個完整的服務架構,可參考 web project 的 docker 開發環境 link
  • Docker Image –
    docker 鏡像,可想像成是一個 iso 檔,裡面一個或多個服務,
    使用 docker pull 下來就立即使用
  • DcokerFile -docker image 產生用的 script 檔, 可 參考 nginx dockefile

我們可以拿 Docker 做什麼?

在本機建立開發環境

  優點如下:

  • 獨立環境-
      開發環境各個自獨立,任何環境測試設定,不影響其他協作者
  • 快速建立-
      快速建立開發環境,程式所需要的服務與應用
  • 簡化操作-
      source code 可直接放於本機,不需透過 ftp 工具 或
      samba 上傳異動程式,再經由開發機測試。
  • 增加開發效率-
     開發工具、 Git 版本控管工具,相關操作可在本機端執行,
      速度不再受限於網路層,加快程式關鍵字搜尋回應時間。

快速建立實驗環境

過往要建立實驗環境,需請求管網協助建立相關服務,例如 DB、cache、mq 相關的服務,或是在自己本機環境先建立虛擬機器後,再安裝相關服務,實在曠日費時,自從有了 docker 後,需要什麼服務、應用都是彈指間完成,只需短短 docker run 11211:11211 -d memcached:1.5.16  一行指令,就建立完成所需的服務。

結論

過去團隊開發環境採用「集中式主機開發模式」,因網路層問題,不管是在開發工具(搜尋檔案) 或 Git 版本控管工具,在使用開發的效率上,回應非常緩慢,轉向「Docker 開發模式」後,解決了以上痛點,加快了開發環境的開發效率。

過去團隊的開發方式

當然轉換的過程中,會有不少的問題要處理,例如過去程式環境的判斷,資料庫資料的遷移等問題,特別是資料庫的部份,大部份有點歷史的專案,其資料庫的 Schema 都會有些龐大,在轉換成 Container 會有些時間與難度,這時可以採用混合式的做法,Web Service 的部份轉換成 Container,資料庫的部份可直接延用舊有的方式,這樣可以在轉換的時間上取得一個平衡。

目前團隊的開發方式

做為現代化的工程師,使用 Docker 已是必要的技能,不管在開發、佈署都有莫大的幫助。

開發應用工程師,可使用 Docker 快速建立應用所需的服務,而管理服務的系統工程師,可使用 Docker 封裝相關服務,方便後續進行管理和調度,快速佈署相關服務,是現代工程師必學的利器。

Docker 需要學習和了解很多東西,如果對這些觀念沒有基礎的話就很容易採到坑,例如像是 Docker 的 Image 是唯讀層,啟動 Container 後會疊上可讀可寫層,把 Container 刪除後會把之前寫的資料刪除,因此就不適合直接在 Container 裡放有關於資料庫的有狀態資料,需另外建立 Volume ,掛載到系統層的對應的存放目錄,但如果不懂此觀念的人,有可能直接把有狀態的資料放進 Container,等 Container 刪除掉才發現資料不見。

因此要使用 Docker 做一些重要的事情前,一定先對它的架構和觀念清楚並多實驗,了解後才比較不容易採到坑。

當系統管理者對 Docker 用熟悉後,可更深入去學習 Kubernetes (K8S) 的應用,來自動化部屬、擴展級管理多個 Container。

文章撰寫:Mars
責任編稿:夏天

那些年 我在露天學會的事

露天工程師:
Docker已是必要技能,不管在開發、優化都有莫大的幫助

延伸閱讀

Leave a Reply

Your email address will not be published. Required fields are marked *