亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
慕課專欄

目錄

索引目錄

跟 BAT 技術專家學 Docker + K8S

原價 ¥ 68.00

立即訂閱
04 小身材大能量:Docker 概覽
更新時間:2020-07-21 18:58:15
生活永遠不像我們想像的那樣好,但也不會像我們想像的那樣糟。——莫泊桑

這篇文章我們將來介紹一下 Docker 的基本情況,主要包括如下幾個部分:

  • Docker 是什么;
  • Docker v.s. 虛擬機;
  • Docker 的應用場景;
  • Docker 架構淺析。

1. Docker 是什么

相信有很多同學在平時的工作或者學習中應該都或多或少地使用過 Docker 了,那么 Docker 究竟是什么呢?有沒有一個準確的定義來定義 Docker 呢?我們不妨先來看一下官方是如何來定義 Docker 的。

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

簡單翻譯下就是:

Docker 是一個開源的平臺,我們可以用 Docker 來開發、部署和運行我們的應用程序。Docker 可以幫助我們將應用程序和底層基礎設施進行分離,以幫助我們更快的實現交付。通過 Docker 技術,我們可以像管理我們的應用一樣管理我們的基礎設施(比如基礎依賴等,這里的具體技術其實就是鏡像)。通過 Docker 技術,我們可以精簡我們的整個開發和交互流程。

這里面的幾個核心點包括:

  • 平臺(platform):官方將 Docker 定義為一個平臺,但是其實更準確的來說,Docker 其實是一個技術棧,包括 Docker 鏡像,可以類比為程序,是磁盤上面的靜態文件,可以通過 Docker 來啟動運行;Docker 容器,也就是 Docker 鏡像的運行時實例;Docker Daemon,用來管理機器上的鏡像、容器等。

  • 應用程序和底層基礎設施分離:傳統的軟件開發模式是我們先開發好我們的應用,然后在線上環境或者測試環境上先安裝應用的基礎依賴,比如像一些 C++ 的二進制文件會依賴一些操作系統的動態鏈接庫。

    依賴安裝完成之后,然后將應用程序部署上去。使用 Docker 的鏡像技術我們可以將這些依賴和應用程序都打包到鏡像中,然后測試或者正式上線的時候只需要將整個鏡像部署上去就可以了,不需要關心目標服務器上面的基礎環境,這也就是應用程序和基礎設施分離。也是精簡開發流程的核心的所在。

熟悉 Docker 的同學肯定會意識到這里對 Docker 的定義其實少了很多東西,確實是這樣的,比如 Docker 的隔離性和資源限制在定義里面都沒有體現出來。定義還是從一種更加宏觀的角度來介紹 Docker,也沒錯。

2. Docker v.s. 虛擬機

很多人學習 Docker 的過程中都會看到有人把 Docker 拿來和虛擬機做對比,也就是下面這張圖。左邊是 Docker 的架構,右邊是虛擬機的架構圖。我們可以看到 Docker 和虛擬機的主要區別有:

  • 所有的 Docker 應用共享一個宿主機操作系統,每個虛擬機有自己的操作系統;
  • 每個 Docker 應用通過 Docker 層和宿主機的操作系統交互,而虛擬機應用直接和操作系統交互。

圖片描述

但是上圖左邊的圖中的 Docker 的位置其實很不嚴謹,實際上 Docker 并不會像 Hypervisor 那樣對應用進程的隔離環境負責,也不會創建任何實體的容器,真正對環境負責的是宿主機操作系統本身。所以上圖中 Docker 的問題應該是處于靠邊的位置,因為通過 Docker 啟動的容器本質上和操作系統中運行的進程并沒有本質的區別。這個我們后面再細說。

3. Docker 的應用場景

應用交付

Docker 技術為應用交付領域帶來的最大的變化就是開發環境的一致性。傳統的開發方式需要開發者自己在本地進行開發,但是本地的開發環境和遠端的測試和正式環境還是存在差異,所以每次開發完成都需要反復比對環境的差異,包括操作系統以及操作系統里面的依賴軟件包是否齊全,非常的麻煩。

但是使用 Docker 鏡像,我們可以將所有的環境依賴都打包到鏡像中,然后通過鏡像來傳輸,這樣會更加地高效。

試想下面幾種場景:

  • 開發者在本地編寫代碼進行開發,然后通過 Docker 鏡像和其他協作者共享;
  • 使用 Docker 技術將應用 push 到測試環境,自動觸發自動化 test case;
  • 當開發者發現應用程序的 bug 時,可以在本地開發環境進行修復。修復完之后再將應用重新部署到測試環境進行測試驗證;
  • 當測試完成之后,需要給客戶的環境升級,只要把修復完的應用鏡像推送到客戶可以訪問的鏡像中心即可。

多版本混合部署

隨著產品的不斷更新換代,一臺服務器上部署同一個應用的多個版本在企業內部非常常見。但一臺服務器上部署同一個軟件的多個版本,文件路徑、端口等資源往往會發生沖突,造成多個版本無法共存的問題

如果用 docker,這個問題將非常簡單。由于每個容器都有自己獨立的文件系統,所以根本不存在文件路徑沖突的問題;對于端口沖突問題,只需要在啟動容器時指定不同的端口映射即可解決問題。

內部開發測試環境

傳統的開發測試環境都是由運維人員進行專門的環境配置而搭建出來的,而且需要運維人員進行專門維護。環境一旦出現問題,恢復起來也很麻煩。

借助于 Docker 技術,我們將應用程序需要的依賴都固化到 Docker 鏡像中,然后在對應的 Docker 容器中進行開發測試。就算環境出現問題,我們只要將當前容器刪除重新啟動即可恢復。

使用 Docker 鏡像來維護內部開發測試環境還有另一個好處就是 DevOps,傳統的應用開發部署要跨兩個團隊:開發團隊負責開發,運維團隊服務部署,一旦涉及到跨團隊合作就要牽扯到溝通成本。而且開發作為應用的 owner,實際上對其依賴環境會更加的熟悉才對。

通過 Docker 鏡像技術,開發人員在開發應用的過程中就將這些依賴固化到鏡像中。在環境部署環節,即使需要運維人員參與,也只是負責拉起 Docker。整個過程都會更加的高效。

Docker 的使用場景是非常多的,在這里我們主要討論幾種主要的應用場景。

4. Docker 架構淺析

很多人說 Docker 是簡單的 Server-Client 的架構,其實并不一定準確。Docker 的架構比較復雜,并不是純粹的只有 Server 和 Client。下圖是 Docker 架構的一個詳細的圖。幾個主要的組成部分有:

  • Docker Client;
  • Docker Daemon;
  • Docker Registry。

圖片描述

Docker Client

我們安裝完 Docker 包之后,直接使用敲命令:docker ,界面是有提示的,這個 docker 就是 docker client。

docker client 都是用來和 docker daemon 交互的。

Docker Daemon

docker daemon 是一個 docker 后臺運行的守護進程,我們的 docker client 的命令就是和 Docker Daemon 來進行交互的。

Docker daemon 啟動可以使用 service 或者 systemctl 操作.

service docker start
systemctl start docker.service

然后我們使用 ps 命令就能看到 docker daemon 進程了。

$ ps aux | grep dockerd
root     10214  1.2  0.0 1014252 23768 ?       Ssl  00:58   0:00 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2

然后我們查看和 client 交互的 socket 文件也存在了。

$ll /var/run/docker.sock
srw-rw---- 1 root root 0 Dec  3 00:58 /var/run/docker.sock

Docker Registry

Registry 中文一般翻譯為注冊中心,是用來存儲 Docker 鏡像的地方。Docker Registry 有多種不同的表現,比如 Docker Hub 就是一個公開的注冊中心,同時各大云廠商也提供了自己的注冊中心,比如阿里云、騰訊云等,甚至你可以搭建自己的私有注冊中心。

Docker 默認使用 Docker Hub,比如我們執行 docker pull <image-name> 時,Docker 默認去 Docker Hub 中尋找名字為 image-name 的鏡像。如果使用自己的 Registry 需要進行單獨的配置。

Docker Images

Image 一般中文稱之為鏡像。官方對鏡像的定義比較復雜,我一般使用類比的方式來理解鏡像。鏡像可以理解成計算機系統中的程序,也就是靜態的位于磁盤上面可以通過特定方式執行的文件(程序是操作系統可以識別的特定的二進制文件,Docker 鏡像是可以被 Docker Daemon 識別并執行的特定文件)。

鏡像和普通的可執行文件的區別在于鏡像是分層架構,每個鏡像一般都依賴于一個基礎鏡像。最基本的鏡像叫 scratch 鏡像。當然我們也可以構建自己的鏡像,然后發布到鏡像中心別人就也可以使用了。

Docker 鏡像的構建是通過一個 DSL 語言來編寫的,叫 Dockerfile。后文我們會細說,這里就先不贅述了。

Docker Container

Container 也就是容器。Docker 官方對容器的定義非常的優雅。

A container is a runnable instance of an image.

翻譯過來就是:

容器是鏡像的運行實例。

這個定義和進程的定義非常類似:進程是程序的運行實例。這樣我們就可以將鏡像類比為程序,容器類比為進程,這樣就更好理解了。

我們可以使用 Docker 的 CLI 命令或者 API 來創建、啟動、停止和刪除容器等操作。同時對于運行狀態的容器我們可以登錄進去,類似 ssh 命令等操作。

容器默認是和其他容器以及其宿主機隔離開的。具體的隔離策略可以進行自定義設置。

5. 總結

本篇文章先從宏觀角度介紹了 Docker 的定位和應用場景,然后又淺析了 Docker 的架構,學完本篇文章,對于完全的新手已經對 Docker 有一個基本的認識了。后面我們將循序漸進,不斷深入介紹 Docker 技術。

}
立即訂閱 ¥ 68.00

你正在閱讀課程試讀內容,訂閱后解鎖課程全部內容

千學不如一看,千看不如一練

手機
閱讀

掃一掃 手機閱讀

跟 BAT 技術專家學 Docker + K8S
立即訂閱 ¥ 68.00

舉報

0/150
提交
取消