docker基本原理

寫的很不錯的文章,做個存檔

什麼是容器

容器是 種輕量級、可移植的爲應用程序提供了隔離的運行空間 。每一個容器內都包含一個獨享的完整用戶環境,而且 個容器內的環境變更不會影響其餘容器的運行環境,可使應用程序在幾乎任何地方以相同的方式運行,好比開發人員在本身的筆記本上建立井測試好的容器,無須任何修改就能在生產環境的虛擬機、物理服務器或公有云 機上運行在技術方面,容器是經過 系列系統級別的機制來實現的,好比經過 Linux Namespace進行空間隔離;經過文件系統的掛載點來決定容器能夠訪問哪些文件:經過 cgroups 來肯定每一個容器能夠利用多少資源:容器之間經過共享同 個系統內核來提高內存的使用率。php

什麼是docker

Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,聽從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。web

Docker 自開源後受到普遍的關注和討論,以致於 dotCloud 公司後來都更名爲 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中普遍應用。docker

Docker 項目的目標是實現輕量級的操做系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不須要去關心容器的管理,使得操做更爲簡便。用戶操做 Docker 的容器就像操做一個快速輕量級的虛擬機同樣簡單。shell

下面的圖片比較了 Docker 和傳統虛擬化方式的不一樣之處,可見容器是在操做系統層面上實現虛擬化,直接複用本地主機的操做系統,而傳統方式則是在硬件層面實現。ubuntu

virtualization

docker

爲何用docker

做爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具備衆多的優點。centos

Docker 在以下幾個方面具備較大的優點:安全

  • 更快速的交付和部署

Docker在整個開發週期均可以完美的輔助你實現快速交付。Docker容許開發者在裝有應用和服務本地容器作開發。能夠直接集成到可持續開發流程中。bash

例如:開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。服務器

  • 高效的部署和擴容

Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。網絡

Docker的兼容性和輕量特性能夠很輕鬆的實現負載的動態管理。你能夠快速擴容或方便的下線的你的應用和服務,這種速度趨近實時。

  • 更高的資源利用率

Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。

  • 更簡單的管理

使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。

Docker引擎

docker引擎是一個c/s結構的應用,主要組件見下圖:

docker engine components flow

 

 

 

  • Server是一個常駐進程
  • REST API 實現了client和server間的交互協議
  • CLI 實現容器和鏡像的管理,爲用戶提供統一的操做界面

Docker構架

Docker使用C/S架構,Client 經過接口與Server進程通訊實現容器的構建,運行和發佈。client和server能夠運行在同一臺集羣,也能夠經過跨主機實現遠程通訊。即客戶端經過與後 臺服務交互,來編譯、運行和發佈容器。 Docker的客戶端能夠鏈接到本機的 Docker 服務上,也能夠鏈接到遠程的 Docker 服務上Docker 客戶端是使用阻ST 接口來與後臺服務通訊的,它經過使用 UN Socket 鏈接或者網絡接口實現。

docker architecture

docker_host:docker主機

docker daemon:docker守護進程

containers:容器

images:鏡像

registry:倉庫

(1)Docker 後臺服務監昕 ST 接口的 求,管理 Docker 的對象,好比 Docker 的鏡像、容器、網絡和磁盤卷。一 Docker 後臺服務能夠和其餘 Docker 後臺服務進行通訊,從而對它們進行管理。
(2)Docker 客戶端( Docker Client )是咱們和 Docker 後臺服務交互的主要工具,在使用 docker run 命令時,客戶端把命令發送到 Docker 後臺服務,再由後臺服務執行該命令。 Docker 客戶端能夠鏈接多個後臺服務並與它們通訊。
(3)Docker 庫( Docker Regis )是用來存 Docker 鏡像的, Docker Hub Docker Cloud 是全部人都可以使用的公共的 Docke 倉庫 Docker 默認從 Docker Hub 下載鏡像,固然咱們也能夠本身搭建私有倉庫 。當咱們使用 Docker pull docker run 令時,就會從咱們配置的 docker倉庫下載鏡像, 使用 docker push 命令時,咱們的鏡像就會被推送到 Docker 倉庫中。
(4)Docker 對象( Docker Object )包括鏡像、容器、網絡、磁盤卷和插件等 咱們在使用Docker 時,就會建立和使用 Docker 對象

核心概念

  • 鏡像(image)

Docker 鏡像(Image)就是一個只讀的模板。例如:一個鏡像能夠包含一個完整的操做系統環境,裏面僅安裝了 Apache 或用戶須要的其它應用程序。鏡像能夠用來建立 Docker 容器,一個鏡像能夠建立不少容器。Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。

鏡像(Image)就是一堆只讀層(read-only layer)的統一視角,也許這個定義有些難以理解,看看下面這張圖:
image ufs

右邊咱們看到了多個只讀層,它們重疊在一塊兒。除了最下面一層,其它層都會有一個指針指向下一層。這些層是Docker內部的實現細節,而且可以在docker宿主機的文件系統上訪問到。統一文件系統(Union File System)技術可以將不一樣的層整合成一個文件系統,爲這些層提供了一個統一的視角,這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。

  • 倉庫(repository)

倉庫(Repository)是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。

倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括 時速雲 、網易雲 等,能夠提供大陸用戶更穩定快速的訪問。固然,用戶也能夠在本地網絡內建立一個私有倉庫。

當用戶建立了本身的鏡像以後就可使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時候,只須要從倉庫上 pull 下來就能夠了。

Docker 倉庫的概念跟 Git 相似,註冊服務器能夠理解爲 GitHub 這樣的託管服務。

  • 容器(container)

Docker 利用容器(Container)來運行應用。容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的、保證安全的平臺。能夠把容器看作是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。

容器的定義和鏡像幾乎如出一轍,也是一堆層的統一視角,惟一區別在於容器的最上面那一層是可讀可寫的。

container ufs

一個運行態容器被定義爲一個可讀寫的統一文件系統加上隔離的進程空間和包含其中的進程。下面這張圖片展現了一個運行中的容器。

container running

正是文件系統隔離技術使得Docker成爲了一個很是有潛力的虛擬化技術。一個容器中的進程可能會對文件進行修改、刪除、建立,這些改變都將做用於可讀寫層。

Docker安裝部署

docker安裝很是簡單,支持各類平臺,請到官網自行安裝下載docker下載

Docker經常使用命令

獲取鏡像

docker pull

從倉庫獲取所須要的鏡像。

使用示例:

docker pull centos:centos6

實際上至關於 docker pull registry.hub.docker.com/centos:centos6
命令,即從註冊服務器 registry.hub.docker.com 中的 centos 倉庫來下載標記爲 centos6 的鏡像。
有時候官方倉庫註冊服務器下載較慢,能夠從其餘倉庫下載。 從其它倉庫下載時須要指定完整的倉庫註冊服務器地址。

查看鏡像列表#

docker images

列出了全部頂層(top-level)鏡像。實際上,在這裏咱們沒有辦法區分一個鏡像和一個只讀層,因此咱們
提出了top-level鏡像。只有建立容器時使用的鏡像或者是直接pull下來的鏡像能被稱爲頂層(top-level)
鏡像,而且每個頂層鏡像下面都隱藏了多個鏡像層。

使用示例:

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE centos centos6 6a77ab6655b9 8 weeks ago 194.6 MB ubuntu latest 2fa927b5cdd3 9 weeks ago 122 MB

在列出信息中,能夠看到幾個字段信息

  • 來自於哪一個倉庫,好比 ubuntu
  • 鏡像的標記,好比 14.04
  • 它的 ID 號(惟一)
  • 建立時間
  • 鏡像大小

利用 Dockerfile 來建立鏡像

docker build

使用 docker commit 來擴展一個鏡像比較簡單,可是不方便在一個團隊中分享。咱們可使用
docker build 來建立一個新的鏡像。爲此,首先須要建立一個 Dockerfile,包含一些如何建立鏡像的
指令。新建一個目錄和一個 Dockerfile。

mkdir hainiu
cd hainiu
touch Dockerfile

Dockerfile 中每一條指令都建立鏡像的一層,例如:

FROM centos:centos6 MAINTAINER sandywei <sandy@hainiu.tech> # move all configuration files into container RUN yum install -y httpd EXPOSE 80 CMD ["sh","-c","service httpd start;bash"] 

Dockerfile 基本的語法是

  • 使用#來註釋
  • FROM 指令告訴 Docker 使用哪一個鏡像做爲基礎
  • 接着是維護者的信息
  • RUN開頭的指令會在建立中運行,好比安裝一個軟件包,在這裏使用yum來安裝了一些軟件

更詳細的語法說明請參考 Dockerfile

編寫完成 Dockerfile 後可使用 docker build 來生成鏡像。

$ docker build -t hainiu/httpd:1.0 . Sending build context to Docker daemon 2.048 kB Step 1 : FROM centos:centos6 ---> 6a77ab6655b9 Step 2 : MAINTAINER sandywei <sandy@hainiu.tech> ---> Running in 1b26493518a7 ---> 8877ee5f7432 Removing intermediate container 1b26493518a7 Step 3 : RUN yum install -y httpd ---> Running in fe5b6f1ef888 ..... Step 5 : CMD sh -c service httpd start ---> Running in b2b94c1601c2 ---> 5f9aa91b0c9e Removing intermediate container b2b94c1601c2 Successfully built 5f9aa91b0c9e

其中 -t 標記來添加 tag,指定新的鏡像的用戶信息。 「.」 是 Dockerfile 所在的路徑(當前目錄),
也能夠替換爲一個具體的 Dockerfile 的路徑。注意一個鏡像不能超過 127 層。

用docker images 查看鏡像列表

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE hainiu/httpd 1.0 5f9aa91b0c9e 3 minutes ago 292.4 MB centos centos6 6a77ab6655b9 8 weeks ago 194.6 MB ubuntu latest 2fa927b5cdd3 9 weeks ago 122 MB 

細心的朋友能夠看到最後一層的ID(5f9aa91b0c9e)和 image id 是同樣的

上傳鏡像

docker push

用戶能夠經過 docker push 命令,把本身建立的鏡像上傳到倉庫中來共享。例如,用戶在 Docker Hub 上完成註冊後,能夠推送本身的鏡像到倉庫中。

運行實例:

$ docker push hainiu/httpd:1.0

建立容器

docker create <image-id>

docker create 命令爲指定的鏡像(image)添加了一個可讀寫層,構成了一個新的容器。注意,這個容器並無運行。

docker create 命令提供了許多參數選項能夠指定名字,硬件資源,網絡配置等等。

運行示例:

建立一個centos的容器,可使用倉庫+標籤的名字肯定image,也可使用image-id指定image。返回容器id

#查看本地images列表
$ docker images

#用倉庫+標籤
$ docker create -it --name centos6_container centos:centos6 #使用image-id $ docker create -it --name centos6_container 6a77ab6655b9 bash b3cd0b47fe3db0115037c5e9cf776914bd46944d1ac63c0b753a9df6944c7a67 #可使用 docker ps查看一件存在的容器列表,不加參數默認只顯示當前運行的容器 $ docker ps -a

可使用 -v 參數將本地目錄掛載到容器中。

$ docker create -it --name centos6_container -v /src/webapp:/opt/webapp centos:centos6

這個功能在進行測試的時候十分方便,好比用戶能夠放置一些程序到本地目錄中,來查看容器是否正常工做。本地目錄的路徑必須是絕對路徑,若是目錄不存在 Docker 會自動爲你建立它。

啓動容器

docker start <container-id>

Docker start命令爲容器文件系統建立了一個進程隔離空間。注意,每個容器只可以有一個進程隔離空間。

運行實例:

#經過名字啓動 $ docker start -i centos6_container #經過容器ID啓動 $ docker start -i b3cd0b47fe3d

進入容器

docker exec <container-id>

在當前容器中執行新命令,若是增長 -it參數運行bash 就和登陸到容器效果同樣的。

docker exec -it centos6_container bash

中止容器#

docker stop <container-id>

刪除容器#

docker rm <container-id>

運行容器

docker run <image-id>

docker run就是docker create和docker start兩個命令的組合,支持參數也是一致的,若是指定容器
名字是,容器已經存在會報錯,能夠增長 --rm 參數實現容器退出時自動刪除。

運行示例:

docker create -it --rm --name centos6_container centos:centos6

查看容器列表

docker ps

docker ps 命令會列出全部運行中的容器。這隱藏了非運行態容器的存在,若是想要找出這些容器,增長 -a 參數。

刪除鏡像

docker rmi <image-id>

刪除構成鏡像的一個只讀層。你只可以使用docker rmi來移除最頂層(top level layer)
(也能夠說是鏡像),你也可使用-f參數來強制刪除中間的只讀層。

commit容器#

docker commit <container-id>

將容器的可讀寫層轉換爲一個只讀層,這樣就把一個容器轉換成了不可變的鏡像。

鏡像保存#

docker save <image-id>

建立一個鏡像的壓縮文件,這個文件可以在另一個主機的Docker上使用。和export命令不一樣,這個命令
爲每個層都保存了它們的元數據。這個命令只能對鏡像生效。

使用示例:

#保存centos鏡像到centos_images.tar 文件 $ docker save -o centos_images.tar centos:centos6 #或者直接重定向 $ docker save -o centos_images.tar centos:centos6 > centos_images.tar

容器導出

docker export <container-id>

建立一個tar文件,而且移除了元數據和沒必要要的層,將多個層整合成了一個層,只保存了當前統一視角看到
的內容。expoxt後的容器再import到Docker中,只有一個容器當前狀態的鏡像;而save後的鏡像則不一樣,
它可以看到這個鏡像的歷史鏡像。

inspect

docker inspect <container-id> or <image-id>

docker inspect命令會提取出容器或者鏡像最頂層的元數據

快照地址:地址

做者地址:青牛

相關文章
相關標籤/搜索