您好,登錄后才能下訂單哦!
本篇內容介紹了“Docker容器概念是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
docker 與虛擬機(vm)對比:
虛擬機運行在虛擬硬件上, 應用運行在虛擬機內核上。而 docker daemon 是宿主機上的一個進程, 應用只是 docker daemon 的一個子進程, 換句話說, 應用直接運行在宿主機內核上。
虛擬機需要特殊硬件虛擬化技術支持, 因而只能運行在物理機上。docker 沒有硬件虛擬化, 因而可以運行在物理機、虛擬機, 甚至 docker 容器內(嵌套運行)。
因為沒有硬件虛擬化及多運行一個 Linux 內核的開銷, 應用運行在 docker 上比虛擬機上更輕、更快。
那么, 使用 docker 和直接在宿主機上運行一個程序有什么區別呢?答案是 docker 容器使用 cgroup 名字空間實現了 CPU, 內存, 網絡, 文件系統等資源隔離。了解 chroot 的同學可以認為 docker 就是一個更優雅的 chroot。
說到隔離, docker 容器的文件系統在哪里呢? 答案就是鏡像。
鏡像描述了 docker 容器運行的初始文件系統, 包含運行應用所需的所有依賴。即可以是一個完整的操作系統, 也可以僅包含應用所需的最小 bin/lib 文件集合。
一個問題: 假設一個 docker 容器文件系統大小為 10GiB, 創建 10 個容器需要多少磁盤空間?
100 GiB?錯,還是只要 10 GiB!因為 docker 鏡像和容器采用分層文件系統結構, 每個容器包含一層薄薄的可寫層, 只讀部分是共享的。
docker 鏡像存儲引擎有 aufs, devicemapper, overlay 等多種實現
鏡像是只讀的, 創建容器時只是在鏡像上面新建一個可寫層, 不需要復制整個文件系統, 因而可以實現毫秒級創建。
鏡像存儲在鏡像 hub。每個鏡像有一個 tag, 如 registry.hub.docker.com/library/ubuntu:14.04
。鏡像完整 tag 不僅包含鏡像名字, 還指明了鏡像從哪里來, 要到哪里去, 就像一個 URL。沒錯, registry.hub.docker.com
就是官方 docker 鏡像 hub 的地址。使用官方 library 鏡像時, 可省略前綴, 如以上鏡像 tag 可簡寫為 ubuntu:14.04
。
有了鏡像,如何創建容器?docker 不加載 kernel (不同于 vm), 也不執行 init (不同于 vm 和 lxc)。“你不執行應用, 空跑一個 kernel 或者 init 有什么意義?”,docker 說。docker 容器為運行應用而生, 要創建 docker 容器, 必須指定鏡像 tag 和啟動應用的命令行 (或者鏡像設置了默認命令行)。
so, 創建一個 docker 容器的命令行如下:
sudo docker create -ti --name test ubuntu:14.04 bash |
這只是創建了容器, 還沒有運行, 要運行容器, 執行:
sudo docker start test |
通常我們把這兩條命令合并成一條, 即 docker run
:
sudo docker run -dti --name test ubuntu:14.04 bash |
在宿主機上看一下我們剛剛運行的 bash
命令的進程樹:
$pstree -sa 21811 systemd --switched-root --system --deserialize 21 └─docker daemon ... ... └─bash |
沒錯, 它只是 docker daemon 的一個子進程.
attach 到容器內的應用, 本例中即為 bash 命令行:
sudo docker attach test |
ps -ef
看一下:
$sudo docker attach test root@47c90c3dcbfa:/# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 17:05 ? 00:00:00 bash root 18 1 0 17:11 ? 00:00:00 ps -ef |
加上 ps
自己, 容器中只有兩個進程。 bash
在容器內 PID 為 1, 即是容器主進程。主進程退出后, 容器即自動退出。還是那句話, 容器為運行應用而生, 應用都退出了, 容器留著還有什么用。
手動停止容器:
sudo docker stop test |
刪除容器:
sudo docker rm test |
注意: 刪除容器后在鏡像上創建的可寫層文件系統也將被刪除, 所以日志、配置、數據等需要持久保存的文件需要掛接到外部儲存。
俗話說前人栽樹, 后人乘涼, 我們通常是基于一個已有的鏡像創建應用鏡像。為了演示鏡像有多輕,我們可以從 0 開始創建一個鏡像。
創建一個文件夾 hello-lark
, 進入文件夾, 添加一個 Dockerfile
內容如下:
FROM scratch COPY Dockerfile hello.c hello / |
Dockerfile
描述如何創建鏡像:
FROM scratch
表示從 0 開始, 即從一個空白文件系統開始創建鏡像。
COPY Dockerfile hello.c hello /
表示將本地 Dockerfile
, hello.c
, hello
3 個文件復制到鏡像內根目錄下。
hello.c
和 hello
是我們的應用源碼及編譯后的二進制文件。
添加 hello.c
文件內容如下:
#include <stdio.h> int main(int argc, char* argv[]) { printf("Hello, Lark!\n"); return 0; } |
靜態編譯之:
gcc -static hello.c -o hello |
執行 docker build
創建鏡像:
$sudo docker build -t hello-lark:1.0 . Sending build context to Docker daemon 881.2 kB Step 1 : FROM scratch ---> Step 2 : COPY Dockerfile hello.c hello / ---> b52b3bd2799c Removing intermediate container bc5dcd332026 Successfully built b52b3bd2799c |
鏡像在本地倉庫打包和存儲, 不能直接看到實體文件。但是可以導出為一個 tar 包:
sudo docker save -o ../hello-lark.tar hello-lark:1.0 |
看看有多大:
$ll -h ../hello-lark.tar -rw-r--r-- 1 root root 870K Apr 12 13:41 ../hello-lark.tar |
僅有 870K, 差不多就是 hello
這個二進制文件的大小。
這個鏡像能跑嗎?我們馬上運行看看:
$time sudo docker run --name hello --rm hello-lark:1.0 /hello Hello, Lark! real 0m0.486s user 0m0.078s sys 0m0.016s |
可看到, 這條命令一共經歷了容器創建、運行、停止、銷毀 4 個過程,共耗時不到 0.5 秒。--rm
表示容器結束后自動刪除容器。
如果只是創建:
$time sudo docker create --name hello hello-lark:1.0 /hello 16449a07a0f1377336a879f8136ec7369e07520da1f4a7516128b8d3ba314008 real 0m0.075s user 0m0.064s sys 0m0.017s |
不到 0.1 秒。毫秒級創建絕非虛言。
當然, 只是 hello world 并沒有什么用, 我們打一個 busybox 進去, 鏡像大小只有 2MB, 然而已經具備一個基本的 linux shell 環境.
sudo docker run -ti --rm lark-box:1.0 sh |
簡單說: 標準化交付,微服務編排,提升資源利用率。
校準化交付
docker 將應用及其所有依賴打包到鏡像內, 包括二進制文件(包括底層基礎庫), 靜態配置文件, 環境變量等。剝離了應用對操作系統和環境的依賴, 松耦合 。只需要拉取鏡像, 啟動容器即可完成應用部署, 方便 。毫秒級創建銷毀容器,從而可以實現 快速部署、快速遷移、快速擴容縮容,一鍵快速回滾 (只依賴應用啟動時間)。docker 鏡像制定了應用交付標準, 開發人員對應用及其運行環境完全可控,并 有效避免各種環境問題踩坑。
微服務編排
單機部署多應用時,應用之間完全解耦,可以任意部署編排, 完美支持微服務編排的需求。多個 C 應用混布時, docker 化實現 C 依賴隔離, 避免依賴沖突。
提升資源利用率
docker 是輕量級的解決方案, 不做虛擬化, 不運行多余的 kernel 和 init 進程, 能有效提升資源利用率。
“Docker容器概念是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。