0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Docker和傳統(tǒng)虛擬化方式的不同之處

馬哥Linux運維 ? 來源:lp ? 2019-04-16 13:40 ? 次閱讀

0 快速入門

Docker 最初 dotCloud 公司內(nèi)部的一個業(yè)余項目

Docker 基于 Go 語言

Docker 項目的目標(biāo)是實現(xiàn)輕量級的操作系統(tǒng)虛擬化解決方案

Docker 的基礎(chǔ)是 Linux 容器(LXC)等技術(shù)

Docker 容器的啟動可以在秒級實現(xiàn),這相比傳統(tǒng)的虛擬機方式要快得多

Docker 對系統(tǒng)資源的利用率很高,一臺主機上可以同時運行數(shù)千個 Docker 容器

下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處,可見容器是在操作系統(tǒng)層面上實現(xiàn)虛擬化,直接復(fù)用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實現(xiàn)。

容器除了運行其中應(yīng)用外,基本不消耗額外的系統(tǒng)資源,使得應(yīng)用的性能很高,同時系統(tǒng)的開銷盡量小。傳統(tǒng)虛擬機方式運行 10 個不同的應(yīng)用就要起 10 個虛擬機,而Docker 只需要啟動 10 個隔離的應(yīng)用即可。

主要優(yōu)勢為:

更快速的交付和部署 - 容器成為了最小單位

更高效的虛擬化 - 內(nèi)核級虛擬化

更輕松的遷移和拓展

更簡單的管理

1 安裝

官方網(wǎng)站提供了Mac,Linux和Windows版本的安裝教程。我們只要跟著官方文檔即可,這里不再贅述。

不過需要提一下Kitematic這個圖形化工具(官方給出的定義是 Visual Docker Container Management on Mac & Windows),對于熟悉和了解 Docker 是很好的幫助,大家可以體驗一下。

守護進(jìn)程

運行 Docker 守護進(jìn)程時,可以用-H來改變綁定接口的方式,比如

sudo /usr/bin/docker -d -H tcp://0.0.0.0:2375,

如果不想每次都輸入這么長的命令,需要加入以下環(huán)境變量

export DOCKER_HOST="tcp://0.0.0.0:2375"

圖形用戶界面

雖然我們可以用命令來控制 docker,但是如果能有一個 web 管理界面,操作什么的會方便很多,比較常見的有

Shipyard

Potainer

2 基本概念

基本概念主要有三個:

鏡像(Image)

一個只讀的模板,鏡像可以用來創(chuàng)建 Docker 容器

用戶基于鏡像來運行自己的容器。鏡像是基于 Union 文件系統(tǒng)的層式結(jié)構(gòu)

可以簡單創(chuàng)建或更新現(xiàn)有鏡像,或者直接下載使用其他人的??梢岳斫鉃樯扇萜鞯摹涸创a』

容器(Container)

容器是從鏡像創(chuàng)建的運行實例,在啟動的時候創(chuàng)建一層可寫層作為最上層(因為鏡像是只讀的)

可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺

可以把容器看做是一個簡易版的 Linux 環(huán)境(包括root用戶權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)和運行在其中的應(yīng)用程序

倉庫(Registry)

集中存放鏡像文件的場所,可以是公有的,也可以是私有的

最大的公開倉庫是Docker Hub

國內(nèi)的公開倉庫包括Docker Pool等

當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了

Docker 倉庫的概念跟 Git 類似,注冊服務(wù)器可以理解為 GitHub 這樣的托管服務(wù)

另外 Docker 采用的是客戶端/服務(wù)器架構(gòu),客戶端只需要向 Docker 服務(wù)器或守護進(jìn)程發(fā)出請求即可完成各類操作。那么問題來了,我們能用 Docker 來做什么呢?我們可以:

統(tǒng)一、優(yōu)化和加速本地開發(fā)和構(gòu)建流程

保證不同的環(huán)境中可以得到相同的運行結(jié)果

創(chuàng)建隔離環(huán)境用于測試

Docker 可以提供的隔離有:

文件系統(tǒng)隔離:每個容器都有自己的 root 文件系統(tǒng)

進(jìn)程隔離:每個容器都運行在自己的進(jìn)程環(huán)境中

網(wǎng)絡(luò)隔離:容器間的虛擬網(wǎng)絡(luò)接口和 IP 地址都是分開的

資源隔離和分組:使用 cgroups 將 CPU 和內(nèi)存之類的資源獨立分配給每個 Docker 容器

3 常用命令

查看 docker 狀態(tài)sudo docker info

查看系統(tǒng)中正在運行的容器的列表docker ps

加上-a可以列出所有容器

加上-l可以列出最后一次運行的容器

一個簡單的例子

接下來我們用一個簡單的例子來體驗下 docker

4 容器小介紹

容器是獨立運行的一個或一組應(yīng)用,以及它們的運行態(tài)環(huán)境。對應(yīng)的,虛擬機可以理解為模擬運行的一整套操作系統(tǒng)(提供了運行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用。

啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另外一個是將在終止?fàn)顟B(tài)(stopped)的容器重新啟動。因為 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創(chuàng)建容器(對于初級應(yīng)用來說后者更方便)。

當(dāng)利用 docker run 來創(chuàng)建容器時,Docker 在后臺運行的標(biāo)準(zhǔn)操作包括:

檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載

利用鏡像創(chuàng)建并啟動一個容器

分配一個文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層

從宿主主機配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去

從地址池配置一個 ip 地址給容器

執(zhí)行用戶指定的應(yīng)用程序

執(zhí)行完畢后容器被終止

可以利用docker start命令,直接將一個已經(jīng)終止的容器啟動運行。

5 運行容器

現(xiàn)在,我們來創(chuàng)建一個 ubuntu:14.04 的容器

docker run ubuntu:14.04 /bin/echo 'Hello wdx!'

(結(jié)果如下圖所示)

可以看到正確輸出了我們的 “Hello wdx!”

接下來,我們用docker run -t -i ubuntu:14.04 /bin/bash可以啟動一個 bash 終端用來交互。參數(shù)的意思是:

-t選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上

-i則讓容器的標(biāo)準(zhǔn)輸入保持打開

我們可以輸入一些命令來測試

容器的核心為所執(zhí)行的應(yīng)用程序,所需要的資源都是應(yīng)用程序運行所必需的。除此之外,并沒有其它的資源。我們用ps或top在偽終端中查看進(jìn)程信息,可以看到只有我們運行的進(jìn)程,沒有其他花里胡哨的(上圖最后一條命令)

試一試如下命令

cat /etc/hosts

ip a

ps -aux

cd ~ && echo "hello wdx" > hello.txt && cat hello.txt

(細(xì)心的同學(xué)可能會發(fā)現(xiàn)這里的輸出暗藏玄機)

操作完成后,輸入exit便可以退出這個 ubuntu 容器。退出之后這個容器依然存在,我們可以用docker ps -l來看看:

每個容器有一個 Container ID 和 Name,我們一般就是通過這倆來定位一個容器的。

6 鏡像

我們可以使用docker pull命令從倉庫中獲取所需要的鏡像。比如說

sudo docker pull ubuntu:12.04,

相當(dāng)于

sudo docker pull registry.hub.docker.com/ubuntu:12.04,

即從注冊服務(wù)器registry.hub.docker.com中的ubuntu倉庫來下載標(biāo)記為12.04的鏡像。

如果想從其他倉庫注冊服務(wù)器下載,需要輸入完成的地址,例如:

sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04

下載完成之后就可以使用該鏡像了,比如下面的語句就會創(chuàng)建容器,其中運行bash:

sudo docker run -t -i ubuntu:12.04 /bin/bash

可以使用dokcer images來顯示本地已有的鏡像,如下

具體字段的意思一目了然,這里不再贅述。然后我們來運行官方例子whalesay鏡像。

7 運行鏡像

打開瀏覽器,進(jìn)入Docker Hub

搜索whalesay這個鏡像,就可以看到結(jié)果,點進(jìn)去可以看到詳細(xì)內(nèi)容(基于 Ubuntu)

然后我們來運行一下,使用命令

docker run docker/whalesay cowsay boo

其中cowsay是要運行的命令,后面的boo是參數(shù)。

Docker 會先在本地查找有沒有鏡像,如果沒有就從倉庫中下載,具體的運行結(jié)果是:

也可以讓鯨魚說不同的話,比如:

8 制作鏡像

如果想要制作自己的鏡像,需要自己寫 Dockerfile。具體步驟如下

創(chuàng)建一個文件夾mkdir wdxtub; cd wdxtub,構(gòu)造鏡像所需的所有東西都會放在這個文件夾中

創(chuàng)建一個名為Dockerfile的文件gedit Dockerfile

添加第一句話FROM docker/whalesay:latest,表示我們的鏡像以whalesay為基礎(chǔ)

添加需要運行的命令,如RUN apt-get -y update && apt-get install -y fortunes(fortunes這個程序會輸出名言警句)

通過CMD指定鏡像載入之后需要執(zhí)行的命令,如CMD /usr/games/fortune -a | cowsay

保存并關(guān)閉 Dockerfile

使用sudo docker build -t wdx-whale .來構(gòu)造鏡像,簡單來說就是用 Dockerfile 中的內(nèi)容按步驟構(gòu)造

使用docker images應(yīng)該就可以看到我們新創(chuàng)建的鏡像

然后我們就可以運行一下看看

docker run wdx-whale

還有更賤的(感覺可以玩一天)

如果想要把自己的鏡像上傳到網(wǎng)上,就需要注冊一個 Docker Hub 帳號,然后點擊 Create Repository,這里我創(chuàng)建了一個名為wdxtub/demo的公用倉庫。

接下來我們需要打上 tag,目前docker images的情況是:

記住我們的 IMAGE ID 26ac9649d7da。用以下命令打 tag

docker tag 26ac9649d7da wdxtub/wdx-whale:latest,

然后再docker images一次:

然后用這個命令登錄

docker login --username=yourhubusername --email=yourmail@company.com,

對于我來說就是

docker login --username=wdxtub --email=dacrocodilee@gmail.com

成功之后大概是這樣:

然后就可以 push 上去了docker push wdxtub/wdx-whale,像下面這樣

為了測試 pull 自己的鏡像,我們先把本地上的 whale 鏡像刪掉:

docker rmi -f wdxtub/wdx-whale; docker rmi -f wdx-whale

(如果有其他的用不著的也都刪掉),最后剩下(上課要用的鏡像):

接著來運行一下

docker run wdxtub/wdx-whale

9 管理鏡像

我們可以把鏡像導(dǎo)出到本地文件,使用docker save命令即可,比如針對我現(xiàn)在有的鏡像wdxtub/wdx-whale(id:26ac9649d7da),可以這樣:

docker save -o wdx-local-whale.tar wdxtub/wdx-whale。

如果要載入的話,使用下面的命令即可(會載入相關(guān)的元數(shù)據(jù)信息)

docker load --input wdx-local-whale.tar# 或者docker load < wdx-local-whale.tar

在刪除鏡像之前要先用docker rm刪掉依賴于這個鏡像的所有容器.

sudo docker rmi $(docker images -q -f "dangling=true")

鏡像的實現(xiàn)原理

Docker 鏡像是怎么實現(xiàn)增量的修改和維護的? 每個鏡像都由很多層次構(gòu)成,Docker 使用Union FS將這些不同的層結(jié)合到一個鏡像中去。

通常 Union FS 有兩個用途, 一方面可以實現(xiàn)不借助 LVM、RAID 將多個 disk 掛到同一個目錄下,另一個更常用的就是將一個只讀的分支和一個可寫的分支聯(lián)合在一起,Live CD 正是基于此方法可以允許在鏡像不變的基礎(chǔ)上允許用戶在其上進(jìn)行一些寫操作。 Docker 在 AUFS 上構(gòu)建的容器也是利用了類似的原理。

10 容器啟動

舉個例子,

后臺運行

更多的時候,需要讓 Docker在后臺運行而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機下。此時,可以通過添加 -d 參數(shù)來實現(xiàn)。

下面舉兩個例子來說明一下。

如果不使用 -d 參數(shù)運行容器

docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

容器會把輸出的結(jié)果(STDOUT)打印到宿主機上面

如果使用了 -d 參數(shù)運行容器

docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done",

則顯示是這樣:

使用docker logs containerid可以查看輸出,如:

使用 -d 參數(shù)啟動后會返回一個唯一的 id,也可以通過 docker ps 命令來查看容器信息。容器是否會長久運行,是和docker run指定的命令有關(guān),和 -d 參數(shù)無關(guān)

在使用 -d 參數(shù)時,容器啟動后會進(jìn)入后臺。 某些時候需要進(jìn)入容器進(jìn)行操作,有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。具體參考這里

11 終止與重新啟動

使用docker stop containerid來終止容器。終止?fàn)顟B(tài)的容器可以用docker ps -a命令看到。

另外,docker restart containerid命令會將一個運行態(tài)的容器終止,然后再重新啟動它。

12 導(dǎo)入導(dǎo)出與刪除

如果要導(dǎo)出本地某個容器,可以使用docker export containerid命令。

可以使用docker import從容器快照文件中再導(dǎo)入為鏡像,例如

cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0# 也可以通過指定 URL 或者某個目錄來導(dǎo)入,例如docker import http://example.com/exampleimage.tgz example/imagerepo

用戶既可以使用 docker load 來導(dǎo)入鏡像存儲文件到本地鏡像庫,也可以使用docker import 來導(dǎo)入一個容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導(dǎo)入時可以重新指定標(biāo)簽等元數(shù)據(jù)信息。

可以使用docker rm來刪除一個處于終止?fàn)顟B(tài)的容器。如果要刪除一個運行中的容器,可以添加 -f 參數(shù)。Docker 會發(fā)送 SIGKILL 信號給容器。

用docker ps -a命令可以查看所有已經(jīng)創(chuàng)建的包括終止?fàn)顟B(tài)的容器,如果數(shù)量太多要一個個刪除可能會很麻煩,用docker rm $(docker ps -a -q)可以全部清理掉。

注意:這個命令其實會試圖刪除所有的包括還在運行中的容器,不過就像上面提過的docker rm默認(rèn)并不會刪除運行中的容器。

13 倉庫

倉庫(Repository)是集中存放鏡像的地方。

一個容易混淆的概念是注冊服務(wù)器(Registry)。實際上注冊服務(wù)器是管理倉庫的具體服務(wù)器,每個服務(wù)器上可以有多個倉庫,而每個倉庫下面有多個鏡像。從這方面來說,倉庫可以被認(rèn)為是一個具體的項目或目錄。例如對于倉庫地址dl.dockerpool.com/ubuntu 來說,dl.dockerpool.com 是注冊服務(wù)器地址,ubuntu是倉庫名。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207920
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122747
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    446

    瀏覽量

    11738

原文標(biāo)題:架構(gòu)師分享 Docker 新手入門完全指南

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言指針和引用的不同之處及使用場合

    指針和引用的不同之處是什么?
    發(fā)表于 06-14 09:14 ?235次閱讀
    C語言指針和引用的<b class='flag-5'>不同之處</b>及使用場合

    STM32板與FPGA有哪些不同之處

    STM32板與FPGA有哪些不同之處呢?
    發(fā)表于 10-09 09:00

    GD32和STM32有哪些不同之處

    什么是GD32?GD32和STM32有哪些不同之處?
    發(fā)表于 10-19 10:07

    USART與USAR有哪些不同之處

    USART是什么?USAR又是什么?USART與USAR有哪些不同之處呢?
    發(fā)表于 12-13 08:08

    Docker監(jiān)控實戰(zhàn)分析

    的「輕」也只是相對于傳統(tǒng)虛擬機而已。傳統(tǒng)虛擬機和 Docker 的對比如圖: 從圖中可以看出 Dock
    發(fā)表于 10-13 17:05 ?2次下載
    <b class='flag-5'>Docker</b>監(jiān)控實戰(zhàn)分析

    LDO-DCDC-Charge-Pump的原理比較與不同之處

    LDO-DCDC-Charge-Pump的原理比較與不同之處
    發(fā)表于 11-27 14:22 ?40次下載

    什么是 Docker?Docker傳統(tǒng)虛擬機有什么區(qū)別?

    Docker 容器將軟件以及它運行安裝所需的一切文件(代碼、運行時、系統(tǒng)工具、系統(tǒng)庫)打包到一起,這就保證了不管是在什么樣的運行環(huán)境,總是能以相同的方式運行。就好像 Java 虛擬機一樣,“一次編寫
    的頭像 發(fā)表于 03-16 14:28 ?5.2w次閱讀
    什么是 <b class='flag-5'>Docker</b>?<b class='flag-5'>Docker</b>與<b class='flag-5'>傳統(tǒng)</b>的<b class='flag-5'>虛擬</b>機有什么區(qū)別?

    容器、Docker、虛擬機的區(qū)別

    移植的系統(tǒng)。它不僅簡化了打包應(yīng)用的流程,也簡化了打包應(yīng)用的庫和依賴,甚至整個操作系統(tǒng)的文件系統(tǒng)能被打包成一個簡單的可移植的包,這個包可以被用來在任何其他運行Docker的機器上使用。 容器和虛擬機具有相似的資源隔離和分配方式,容
    的頭像 發(fā)表于 11-05 09:41 ?2872次閱讀

    如何區(qū)分虛擬機與Docker

    首先,大家需要明確一點,Docker容器不是虛擬機。 2014年,當(dāng)我第一次接觸Docker的時候,我把它比做一種輕量級的虛擬機。這樣做無可厚非,因為
    的頭像 發(fā)表于 02-14 11:36 ?994次閱讀
    如何區(qū)分<b class='flag-5'>虛擬</b>機與<b class='flag-5'>Docker</b>

    在AM335X平臺上運行ubuntu系統(tǒng)和docker容器

    下面的圖片比較了 Docker傳統(tǒng)虛擬方式不同之處。
    的頭像 發(fā)表于 04-04 09:50 ?1122次閱讀
    在AM335X平臺上運行ubuntu系統(tǒng)和<b class='flag-5'>docker</b>容器

    一種基于Docker的邊緣計算網(wǎng)關(guān)虛擬方法與流程

    本發(fā)明涉及一種基于docker的邊緣計算網(wǎng)關(guān)虛擬方法,更具體說,它涉及一種通過docker容器自動構(gòu)建網(wǎng)關(guān)邊緣計算服務(wù) 的方法。 隨著
    發(fā)表于 05-18 16:50 ?1次下載
    一種基于<b class='flag-5'>Docker</b>的邊緣計算網(wǎng)關(guān)<b class='flag-5'>虛擬</b><b class='flag-5'>化</b>方法與流程

    貼片Y電容內(nèi)部構(gòu)造是什么樣子的,和傳統(tǒng)插件Y電容有什么不同之處?

    傳統(tǒng)的Y電容主要是插件形式的,自從科雅推出JK-ET系列貼片Y電容以來,很多人搞不明白,貼片Y電容內(nèi)部構(gòu)造是什么樣子的,和傳統(tǒng)插件Y電容有什么不同之處?
    的頭像 發(fā)表于 08-27 10:29 ?1222次閱讀
    貼片Y電容內(nèi)部構(gòu)造是什么樣子的,和<b class='flag-5'>傳統(tǒng)</b>插件Y電容有什么<b class='flag-5'>不同之處</b>?

    噪音抑制與主動降噪:有何不同之處?

    噪音抑制與主動降噪:有何不同之處
    的頭像 發(fā)表于 11-30 17:29 ?529次閱讀
    噪音抑制與主動降噪:有何<b class='flag-5'>不同之處</b>?

    Docker虛擬機的區(qū)別

    Docker虛擬機是兩種不同的虛擬技術(shù),它們在實現(xiàn)方式、資源消耗、運行性能等方面存在許多差異。本文將會詳細(xì)介紹它們的區(qū)別。 一、實現(xiàn)
    的頭像 發(fā)表于 11-23 09:37 ?6817次閱讀

    智能制造與傳統(tǒng)制造有什么不同之處

    、生產(chǎn)方式、管理模式等方面存在很大的不同,這些不同之處正是智能制造的優(yōu)勢和特點。 二、設(shè)計理念的不同 傳統(tǒng)制造設(shè)計理念 傳統(tǒng)制造的設(shè)計理念主要側(cè)重于產(chǎn)品的功能性、穩(wěn)定性和成本效益。在設(shè)
    的頭像 發(fā)表于 06-07 15:36 ?1861次閱讀