Sevice Computing:玩轉 Docker 容器技術

容器概述

容器是一種輕量級、可移植、自包含的軟件打包技術,使應用程序可以在幾乎任何地方以相同的方式運行。開發人員在自己筆記本上創建並測試好的容器,無需任何修改就能夠在生產系統的虛擬機、物理服務器或公有云主機上運行。

容器由兩部分組成:

  1. 應用程序本身
  2. 依賴:比如應用程序需要的庫或其他軟件

容器在 Host 操作系統的用戶空間中運行,與操作系統的其他進程隔離。這一點顯著區別於的虛擬機。

Docker 的核心組件包括:

  1. Docker 客戶端 - Client
    最常用的 Docker 客戶端是 docker 命令。通過 docker 我們可以方便地在 Host 上構建和運行容器。

  2. Docker 服務器 - Docker daemon
    Docker daemon 是服務器組件,以 Linux 後臺服務的方式運行。

  3. Docker 鏡像 - Image
    可將 Docker 鏡像看着只讀模板,通過它可以創建 Docker 容器。

  4. Registry
    Registry 是存放 Docker 鏡像的倉庫,Registry 分私有和公有兩種。

  5. Docker 容器 - Container
    Docker 容器就是 Docker 鏡像的運行實例。

第一、二章 安裝配置運行第一個容器

搭建實驗環境

環境選擇

容器需要管理工具、runtime 和操作系統,我們的選擇如下:

  1. 管理工具 - Docker Engine
    因爲 Docker 最流行使用最廣泛。

  2. runtime - runc
    Docker 的默認 runtime

  3. 操作系統 - Ubuntu

安裝 Docker

配置 Docker 的 apt 源

  1. 安裝包,允許 apt 命令 HTTPS 訪問 Docker 源。
    在這裏插入圖片描述
    在這裏插入圖片描述

  2. 添加 Docker 官方的 GPG

在這裏插入圖片描述

  1. 將 Docker 的源添加到 /etc/apt/sources.list

在這裏插入圖片描述這裏我先開始以爲是一行命令所以輸在了一起,但是這樣會報錯,像如下圖所示這樣一行一行分開輸入就可以了。
在這裏插入圖片描述
安裝 Docker
在這裏插入圖片描述
在這裏插入圖片描述

運行第一個容器

環境就緒,馬上運行第一個容器,執行命令:
在這裏插入圖片描述
由於 Docker Hub 的服務器在國外,下載鏡像會比較慢。幸好 DaoCloud 爲我們提供了免費的國內鏡像服務。

  1. 在 daocloud.io 免費註冊一個用戶。
    在這裏插入圖片描述

  2. 登錄後,點擊頂部菜單“加速器”。
    在這裏插入圖片描述

  3. copy “加速器”命令並在 host 中執行(你的命令可能跟我的會稍有不同)。
    在這裏插入圖片描述
    在這裏插入圖片描述

  4. 重啓 Docker deamon,即可體驗飛一般的感覺。
    在這裏插入圖片描述

docker的常用操作


容器啓動過程如下:
在這裏插入圖片描述

  • Docker 客戶端執行 docker run 命令。
  • Docker daemon 發現本地沒有 httpd 鏡像。
  • daemon 從 Docker Hub 下載鏡像。
  • 下載完成,鏡像 httpd 被保存到本地。
  • Docker daemon 啓動容器。

docker images 可以查看到 httpd 已經下載到本地。
docker ps 或者 docker container ls 顯示容器正在運行。
在這裏插入圖片描述

第三章 鏡像

鏡像是 Docker 容器的基石,容器是鏡像的運行實例,有了鏡像才能啓動容器。

hello-world - 最小的鏡像

hello-world 是 Docker 官方提供的一個鏡像,通常用來驗證 Docker 是否安裝成功。
我們先通過 docker pull 從 Docker Hub 下載它。
在這裏插入圖片描述
用 docker images 命令查看鏡像的信息。
在這裏插入圖片描述
通過 docker run 運行。
在這裏插入圖片描述

base 鏡像

hello-world 雖然是一個完整的鏡像,但它並沒有什麼實際用途。通常來說,我們希望鏡像能提供一個基本的操作系統環境,用戶可以根據需要安裝和配置軟件。這樣的鏡像我們稱作 base 鏡像。

base 鏡像有兩層含義:

  1. 不依賴其他鏡像,從 scratch 構建。
  2. 其他鏡像可以之爲基礎進行擴展。
    所以,能稱作 base 鏡像的通常都是各種 Linux 發行版的 Docker 鏡像,比如 Ubuntu, Debian, CentOS 等。

我們以 CentOS 爲例考察 base 鏡像包含哪些內容。
下載鏡像:
在這裏插入圖片描述
查看鏡像信息以及後面的運行操作都和上一個最小鏡像的操作類似。

構建鏡像

某些情況下我們也不得不自己構建鏡像,比如:

  1. 找不到現成的鏡像,比如自己開發的應用程序。

  2. 需要在鏡像中加入特定的功能,比如官方鏡像幾乎都不提供 ssh。

所以本節我們將介紹構建鏡像的方法。同時分析構建的過程也能夠加深我們對前面鏡像分層結構的理解。

Docker 提供了兩種構建鏡像的方法:

  1. docker commit 命令
  2. Dockerfile 構建文件

舉個例子:在 ubuntu base 鏡像中安裝 vi 並保存爲新鏡像。

  1. 第一步, 運行容器
    在這裏插入圖片描述
    -it 參數的作用是以交互模式進入容器,並打開終端。cfcf30326357 是容器的內部 ID。
  2. 安裝 vi
    確認 vi 沒有安裝後安裝vi。
    在這裏插入圖片描述
  3. 保存爲新鏡像
    在新窗口中查看當前運行的容器。
    在這裏插入圖片描述
    nifty_ellis 是 Docker 爲我們的容器隨機分配的名字。
    執行 docker commit 命令將容器保存爲鏡像。
    (這裏因爲中間實驗中斷了一下電腦重啓過,所以容器隨機分配的名字變爲infallible_villani)
    在這裏插入圖片描述
    新鏡像命名爲 ubuntu-with-vi。
    查看新鏡像的屬性。
    在這裏插入圖片描述
    從 size 上看到鏡像因爲安裝了軟件而變大了。
    從新鏡像啓動容器,驗證 vi 已經可以使用。
    在這裏插入圖片描述

下面是鏡像的常用操作子命令:

  • images 顯示鏡像列表
  • history 顯示鏡像構建歷史
  • commit 從容器創建新鏡像
  • build 從 Dockerfile 構建鏡像
  • tag 給鏡像打 tag
  • pull 從 registry 下載鏡像
  • push 將 鏡像 上傳到 registry
  • rmi 刪除 Docker host 中的鏡像
  • search 搜索 Docker Hub 中的鏡像

第四章 容器

運行容器

docker run 是啓動容器的方法。在討論 Dockerfile 時我們已經學習到,可用三種方式指定容器啓動時執行的命令:

  • CMD 指令。
  • ENDPOINT 指令。
  • 在 docker run 命令行中指定。
    在這裏插入圖片描述
    容器啓動時執行 pwd,返回的 / 是容器中的當前目錄。 執行 docker ps 或 docker container ls 可以查看 Docker host 中當前運行的容器,但是卻顯示沒有容器,用 docker ps -a 或 docker container ls -a 看看。-a 會顯示所有狀態的容器,可以看到,之前的容器已經退出了,狀態爲Exited。

因爲容器的生命週期依賴於啓動時執行的命令,只要該命令不結束,容器也就不會退出。

理解了這個原理,我們就可以通過執行一個長期運行的命令來保持容器的運行狀態。例如執行下面的命令:
docker run ubuntu /bin/bash -c 'while true ; do sleep 1; done"

while 語句讓 bash 不會退出。我們可以打開另一個終端查看容器的狀態:
在這裏插入圖片描述
可見容器仍處於運行狀態。不過這種方法有個缺點:它佔用了一個終端。

我們可以加上參數 -d 以後臺方式啓動容器。
在這裏插入圖片描述
容器啓動後回到了 docker host 的終端。這裏看到 docker 返回了一串字符,這是容器的 ID。通過 docker ps 查看容器,對於容器的後續操作,我們需要通過 “長ID”、“短ID” 或者 “名稱” 來指定要操作的容器。比如下面停止一個容器:
在這裏插入圖片描述

工具類容器

工具類容器通常給能我們提供一個臨時的工作環境,通常以 run -it 方式運行,比如:
在這裏插入圖片描述
運行 busybox,run -it 的作用是在容器啓動後就直接進入。我們這裏通過 wget 驗證了在容器中訪問 internet 的能力。執行 exit 退出終端,同時容器停止。

工具類容器多使用基礎鏡像,例如 busybox、debian、ubuntu 等。

MySQL與容器化

拉取 MySQL 鏡像
在這裏插入圖片描述
在這裏插入圖片描述
使用MySQL容器

因爲前面佔用了這個地址,所以這裏會報下面的錯。
在這裏插入圖片描述
在這裏插入圖片描述
解決辦法是先停掉這個進程。然後再重新執行這個命令就可以了。
在這裏插入圖片描述

容器運行小結

容器運行相關的知識點:

  1. 當 CMD 或 Entrypoint 或 docker run 命令行指定的命令運行結束時,容器停止。

  2. 通過 -d 參數在後臺啓動容器。

  3. 通過 exec -it 可進入容器並執行命令。

指定容器的三種方法:

  1. 短ID。

  2. 長ID。

  3. 容器名稱。 可通過 --name 爲容器命名。重命名容器可執行docker rename。

容器按用途可分爲兩類:

  1. 服務類的容器。

  2. 工具類的容器。

更多關於容器操作的概念和其中的關係見這篇博客和其系列博客

第五章 網絡

Docker 安裝時會自動在 host 上創建三個網絡,我們可用 docker network ls 命令查看:

在這裏插入圖片描述

none 網絡

none 網絡就是什麼都沒有的網絡。掛在這個網絡下的容器除了 lo,沒有其他任何網卡。容器創建時,可以通過 --network=none 指定使用 none 網絡。

在這裏插入圖片描述
封閉意味着隔離,一些對安全性要求高並且不需要聯網的應用可以使用 none 網絡。比如某個容器的唯一用途是生成隨機密碼,就可以放到 none 網絡中避免密碼被竊取。當然大部分容器是需要網絡的。

host 網絡

連接到 host 網絡的容器共享 Docker host 的網絡棧,容器的網絡配置與 host 完全一樣。可以通過 --network=host 指定使用 host 網絡。
在這裏插入圖片描述
直接使用 Docker host 的網絡最大的好處就是性能,如果容器對網絡傳輸效率有較高要求,則可以選擇 host 網絡。當然不便之處就是犧牲一些靈活性,比如要考慮端口衝突問題,Docker host 上已經使用的端口就不能再用了。

備制支持 ifconfig 和 ping 命令的 ubuntu 容器

在這裏插入圖片描述
安裝所需的包
在這裏插入圖片描述
在這裏插入圖片描述

第六章存儲

Docker 爲容器提供了兩種存放數據的資源:

  1. 由 storage driver 管理的鏡像層和容器層。

  2. Data Volume。

分層結構使鏡像和容器的創建、共享以及分發變得非常高效,而這些都要歸功於 Docker storage driver。正是 storage driver 實現了多層數據的堆疊併爲用戶提供一個單一的合併之後的統一視圖。

Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實現分層的架構,同時又有各自的特性。對於 Docker 用戶來說,具體選擇使用哪個 storage driver 是一個難題,因爲:

  1. 沒有哪個 driver 能夠適應所有的場景。

  2. driver 本身在快速發展和迭代。

不過 Docker 官方給出了一個簡單的答案:
優先使用 Linux 發行版默認的 storage driver。

Docker 安裝時會根據當前系統的配置選擇默認的 driver。默認 driver 具有最好的穩定性,因爲默認 driver 在發行版上經過了嚴格的測試。

對於某些容器,直接將數據放在由 storage driver 維護的層中是很好的選擇,比如那些無狀態的應用。無狀態意味着容器沒有需要持久化的數據,隨時可以從鏡像直接創建。

比如 busybox,它是一個工具箱,我們啓動 busybox 是爲了執行諸如 wget,ping 之類的命令,不需要保存數據供以後使用,使用完直接退出,容器刪除時存放在容器層中的工作數據也一起被刪除,這沒問題,下次再啓動新容器即可。

但對於另一類應用這種方式就不合適了,它們有持久化數據的需求,容器啓動時需要加載已有的數據,容器銷燬時希望保留產生的新數據,也就是說,這類容器是有狀態的。

這就要用到 Docker 的另一種存儲機制:Data Volume。

容器監控與與日誌

檢查docker的狀態
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章