Docker是否比虛擬機器更適合我們?

民工哥技術之路發表於2018-08-24

引言

相信很多技術同學在開發時都會使用虛擬機器,配置好一個開發環境,以後使用時只需要啟動虛擬機器就好了。但虛擬機器動輒幾個GB,大一點兒的甚至幾百個GB,而且只要其中任意的虛擬機器檔案損壞,整個虛擬機器就沒辦法啟動了。你可能說應該經常備份,這的確是個好主意。但有沒有更好的辦法呢?今天鋼哥就帶著大家瞭解一下Docker(容器),看看它是否比傳統的虛擬機器更適合我們。

什麼是容器?

顧名思義,容器就是用來裝東西的。我們平時喝水的杯子就是容器,只不過杯子這個“容器”是用來裝水的,而我們這裡的容器裝的是應用程式。

容器有什麼特點?

  • 自包含性:它打包了應用程式的所有依賴,可以直接執行;
  • 可移植性:容器可以在幾乎任何地方以相同的方式執行,這就確保了在開發、測試和生產環境都可以擁有完全一樣的執行環境;
  • 相互隔離性:多個容器間預設是相互隔離的,即使執行在同一臺主機上;
  • 輕量級特性:秒級啟動,佔用資源少;

容器與虛擬機器有什麼區別?

很多同學會覺得,容器能做的事虛擬機器也能做啊,到底有什麼區別呢?

虛擬機器的缺點

  • 佔用資源多;
  • 冗餘步驟多;
  • 啟動慢;

容器的優點

  • 佔用資源少;
  • 提及小;
  • 啟動快;

下面是 Docker 官網截圖(後文會解釋什麼是 Docker)

Docker是否比虛擬機器更適合我們?

從這張圖我們可以看出,傳統的虛擬機器非常重,每一個虛擬機器都是一臺獨立的作業系統。而 Docker 則不同,它會重用宿主機已有的系統資源,同時又完美地隔離了不同的容器,所以實現起來非常輕,也便於被標準化。有同學會說,這跟傳統虛擬機器也沒什麼本質差別啊,新的虛擬機器罷了。其實不然,正是這種“輕量級”的特性,使其有機會成為新的標準化的應用釋出方式。

上世紀五六十年代出現了集裝箱,看上去也沒什麼技術含量。但正是因為集裝箱是一種標準化的物流方式,從而全球的海陸空運輸、碼頭裝卸等都圍繞著集裝箱形成了整個一個高效的物流體系,最終改變了世界貿易,促成了全球化。

Google的 Kubernetes(K8)現在已經成為即成容器編排標準了,另外主流的容器編排工具還有 Docker Swarm 以及 Marathon/Mesos 。

什麼是Docker?

終於回到我們今天的正題了,究竟什麼是 Docker ?Docker 是使用 Go 語言開發的一種 Linux 容器封裝,提供簡單易用的使用介面,是目前最流行的 Linux 容器解決方案。

Docker 的使用場景

  • 建立一致的開發、測試、生產環境;
  • 建立資源隔離的執行時環境;
  • 建立多使用者的平臺即服務(PaaS)的基礎設施;
  • 建立軟體即服務(SaaS)的應用程式;
  • 高效能、超大規模宿主機部署;

Docker 是一個開源的商業產品,有兩個版本:社群版(Community Edition,縮寫為 CE)和企業版(Enterprise Edition,縮寫為 EE)。企業版包含了一些收費服務,個人開發者一般用不到。下面的介紹都針對社群版。

Docker 常用命令

檢視 Docker 版本

docker version

Docker是否比虛擬機器更適合我們?

拉取 Docker 映象

我們可以去 Docker Hub 站點拉取公共的 Docker 映象。比如:搜尋 nginx ,拉取官方的 nginx 映象。

docker pull nginx

Docker是否比虛擬機器更適合我們?

檢視 Docker 映象

docker images

Docker是否比虛擬機器更適合我們?

執行 Docker 映象

docker run -it -v /Users/kwang/docker:/usr/share/nginx/html/hello -p 80:80 -d nginx:latest

-i以互動模式執行容器,通常與 -t 同時使用; -t為容器重新分配一個偽輸入終端,通常與 -i 同時使用; -p本機埠:容器埠 對映; -d後臺執行,並返回容器ID; -v可以將本機目錄對映到容器內。比如這裡我就把我本機的/home/kwang/docker目錄對映到/usr/share/nginx/html/hello/目錄下;

我在/home/kwang/docker/目錄下建立了一個靜態頁面index.html,內容僅僅輸出hello world!。而/usr/share/nginx/html/目錄是容器內的 nginx 網頁根目錄,這樣設定的目的是為了演示目錄對映。

執行成功後,命令列返回一個 Docker 容器的 ID(這個ID是隨機生成的,所以你看到的肯定跟我的不一樣)。

Docker是否比虛擬機器更適合我們?

檢視執行中的 Docker 容器

docker ps -a

可以看到我們剛才的映象已經成功啟動起來了,並且本機0.0.0.0:80埠已經成功對映到容器裡的80埠了,該容器ID的前幾位是7fcac910ad6a

Docker是否比虛擬機器更適合我們?

開啟本機瀏覽器,輸入:http://localhost:80,可以看到nginx已經啟動好了

Docker是否比虛擬機器更適合我們?

如果更改瀏覽器地址:http://localhost/hello/,則可以看到我事先準備好的index.html。

Docker是否比虛擬機器更適合我們?

暫停執行中的 Docker 容器

docker stop 7fcac910ad6a

7fcac910ad6a是要暫停的容器ID,可以看到容器狀態已經變成Exited退出狀態了。

Docker是否比虛擬機器更適合我們?

啟動已暫停的 Docker 容器

docker start 7fcac910ad6a

刪除執行中的 Docker 容器

docker rm -f 7fcac910ad6a

-f引數是強行刪除。

以命令列模式進入容器

你可以用命令列模式進入到容器內部,就好像登入到一臺新的 Linux 一樣。

docker exec -it 9ca4f91d4027 bash

exec是在執行中的容器中執行一個命令,該命令需要接受兩個引數。第一個是容器ID(這裡是9ca4f91d4027),第二個引數是要執行的命令(這裡是bash)。執行完畢後,我們就以bash命令列模式進入到了容器內部。

Docker是否比虛擬機器更適合我們?

當然,你隨時可以用exit命令從容器中退出。

從執行中的 Docker 容器生成 Docker 映象

docker commit -m "kenny nginx" -a "kenny" 9ca4f91d4027 kenny/nginx:1.0

-m 是說明資訊 -a 是使用者資訊 kenny/nginx:1.0 分別是映象的使用者名稱、倉庫名和tag資訊

可以看到 Docker 映象已成功生成。

Docker是否比虛擬機器更適合我們?

基於 Dockerfile 生成 Docker 映象

我們可以建立一個名為Dockerfile的檔案,編輯內容如下:

# 基於哪個Docker映象生成新映象

FROM nginx:latest

# 構建者的基本資訊

MAINTAINER kenny.wang

# 在build這個映象時執行的操作

RUN apt-get update

# 拷貝本地檔案到映象中

COPY ./index.html /usr/share/nginx/html/

執行build命令生成 Docker 映象。

docker build -t="kenny/nginx:2.0" .

-t 用來指定使用者資訊、tag等 . 是當前目錄,用來尋找 Dockerfile

再次用docker images檢視,新的映象已成功生成。

Docker是否比虛擬機器更適合我們?

刪除 Docker 映象

docker rmi -f 83a85d2939a2

-f 表示強行刪除 83a85d2939a2 是 docker image id

將 Docker 映象儲存成 tar 檔案

docker save -o kenny_nginx.tar kenny/nginx:2.0

載入 Docker 映象

docker load -i kenny_nginx.tar

結語

Docker 是個好東西,以上僅僅是一些常用基本操作,但它就像通往新世界的大門,為大規模叢集化部署提供了可能

Docker是否比虛擬機器更適合我們?

相關文章