Docker 的基本原理及快速入门
什么是docker
Docker 是一個開源項(xiàng)目,誕生于 2013 年初,最初是 dotCloud 公司內(nèi)部的一個業(yè)余項(xiàng)目。它基于 Google 公司推出的 Go 語言實(shí)現(xiàn)。 項(xiàng)目后來加入了 Linux 基金會,遵從了 Apache 2.0 協(xié)議,項(xiàng)目代碼在 GitHub 上進(jìn)行維護(hù)。
Docker 自開源后受到廣泛的關(guān)注和討論,以至于 dotCloud 公司后來都改名為 Docker Inc。Redhat 已經(jīng)在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產(chǎn)品中廣泛應(yīng)用。
Docker 項(xiàng)目的目標(biāo)是實(shí)現(xiàn)輕量級的操作系統(tǒng)虛擬化解決方案。 Docker 的基礎(chǔ)是 Linux 容器(LXC)等技術(shù)。在 LXC 的基礎(chǔ)上 Docker 進(jìn)行了進(jìn)一步的封裝,讓用戶不需要去關(guān)心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機(jī)一樣簡單。
下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處,可見容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實(shí)現(xiàn)。
為什么用docker
作為一種新興的虛擬化方式,Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢。
Docker 在如下幾個方面具有較大的優(yōu)勢:
- 更快速的交付和部署
Docker在整個開發(fā)周期都可以完美的輔助你實(shí)現(xiàn)快速交付。Docker允許開發(fā)者在裝有應(yīng)用和服務(wù)本地容器做開發(fā)。可以直接集成到可持續(xù)開發(fā)流程中。
例如:開發(fā)者可以使用一個標(biāo)準(zhǔn)的鏡像來構(gòu)建一套開發(fā)容器,開發(fā)完成之后,運(yùn)維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創(chuàng)建容器,快速迭代應(yīng)用程序,并讓整個過程全程可見,使團(tuán)隊(duì)中的其他成員更容易理解應(yīng)用程序是如何創(chuàng)建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節(jié)約開發(fā)、測試、部署的時間。
- 高效的部署和擴(kuò)容
Docker 容器幾乎可以在任意的平臺上運(yùn)行,包括物理機(jī)、虛擬機(jī)、公有云、私有云、個人電腦、服務(wù)器等。 這種兼容性可以讓用戶把一個應(yīng)用程序從一個平臺直接遷移到另外一個。
Docker的兼容性和輕量特性可以很輕松的實(shí)現(xiàn)負(fù)載的動態(tài)管理。你可以快速擴(kuò)容或方便的下線的你的應(yīng)用和服務(wù),這種速度趨近實(shí)時。
- 更高的資源利用率
Docker 對系統(tǒng)資源的利用率很高,一臺主機(jī)上可以同時運(yùn)行數(shù)千個 Docker 容器。容器除了運(yùn)行其中應(yīng)用外,基本不消耗額外的系統(tǒng)資源,使得應(yīng)用的性能很高,同時系統(tǒng)的開銷盡量小。傳統(tǒng)虛擬機(jī)方式運(yùn)行 10 個不同的應(yīng)用就要起 10 個虛擬機(jī),而Docker 只需要啟動 10 個隔離的應(yīng)用即可。
- 更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實(shí)現(xiàn)自動化并且高效的管理。
Docker引擎
docker引擎是一個c/s結(jié)構(gòu)的應(yīng)用,主要組件見下圖:
- Server是一個常駐進(jìn)程
- REST API 實(shí)現(xiàn)了client和server間的交互協(xié)議
- CLI 實(shí)現(xiàn)容器和鏡像的管理,為用戶提供統(tǒng)一的操作界面
Docker構(gòu)架
Docker使用C/S架構(gòu),Client 通過接口與Server進(jìn)程通信實(shí)現(xiàn)容器的構(gòu)建,運(yùn)行和發(fā)布。client和server可以運(yùn)行在同一臺集群,也可以通過跨主機(jī)實(shí)現(xiàn)遠(yuǎn)程通信。
核心概念
- 鏡像(image)
Docker 鏡像(Image)就是一個只讀的模板。例如:一個鏡像可以包含一個完整的操作系統(tǒng)環(huán)境,里面僅安裝了 Apache 或用戶需要的其它應(yīng)用程序。鏡像可以用來創(chuàng)建 Docker 容器,一個鏡像可以創(chuàng)建很多容器。Docker 提供了一個很簡單的機(jī)制來創(chuàng)建鏡像或者更新現(xiàn)有的鏡像,用戶甚至可以直接從其他人那里下載一個已經(jīng)做好的鏡像來直接使用。
鏡像(Image)就是一堆只讀層(read-only layer)的統(tǒng)一視角,也許這個定義有些難以理解,看看下面這張圖:
右邊我們看到了多個只讀層,它們重疊在一起。除了最下面一層,其它層都會有一個指針指向下一層。這些層是Docker內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),并且能夠在docker宿主機(jī)的文件系統(tǒng)上訪問到。統(tǒng)一文件系統(tǒng)(Union File System)技術(shù)能夠?qū)⒉煌膶诱铣梢粋€文件系統(tǒng),為這些層提供了一個統(tǒng)一的視角,這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統(tǒng)。
- 倉庫(repository)
倉庫(Repository)是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分。實(shí)際上,倉庫注冊服務(wù)器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標(biāo)簽(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是 Docker Hub,存放了數(shù)量龐大的鏡像供用戶下載。國內(nèi)的公開倉庫包括 時速云 、網(wǎng)易云 等,可以提供大陸用戶更穩(wěn)定快速的訪問。當(dāng)然,用戶也可以在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個私有倉庫。
當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機(jī)器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。
Docker 倉庫的概念跟 Git 類似,注冊服務(wù)器可以理解為 GitHub 這樣的托管服務(wù)。
- 容器(container)
Docker 利用容器(Container)來運(yùn)行應(yīng)用。容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的 Linux 環(huán)境(包括root用戶權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序。
容器的定義和鏡像幾乎一模一樣,也是一堆層的統(tǒng)一視角,唯一區(qū)別在于容器的最上面那一層是可讀可寫的。
一個運(yùn)行態(tài)容器被定義為一個可讀寫的統(tǒng)一文件系統(tǒng)加上隔離的進(jìn)程空間和包含其中的進(jìn)程。下面這張圖片展示了一個運(yùn)行中的容器。
正是文件系統(tǒng)隔離技術(shù)使得Docker成為了一個非常有潛力的虛擬化技術(shù)。一個容器中的進(jìn)程可能會對文件進(jìn)行修改、刪除、創(chuàng)建,這些改變都將作用于可讀寫層。
Docker安裝部署
docker安裝非常簡單,支持各種平臺,請到官網(wǎng)自行安裝下載docker下載
Docker常用命令
獲取鏡像
docker pull從倉庫獲取所需要的鏡像。
使用示例:
docker pull centos:centos6實(shí)際上相當(dāng)于 docker pull registry.hub.docker.com/centos:centos6
命令,即從注冊服務(wù)器 registry.hub.docker.com 中的 centos 倉庫來下載標(biāo)記為 centos6 的鏡像。
有時候官方倉庫注冊服務(wù)器下載較慢,可以從其他倉庫下載。 從其它倉庫下載時需要指定完整的倉庫注冊服務(wù)器地址。
查看鏡像列表#
docker images列出了所有頂層(top-level)鏡像。實(shí)際上,在這里我們沒有辦法區(qū)分一個鏡像和一個只讀層,所以我們
提出了top-level鏡像。只有創(chuàng)建容器時使用的鏡像或者是直接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
- 鏡像的標(biāo)記,比如 14.04
- 它的 ID 號(唯一)
- 創(chuàng)建時間
- 鏡像大小
利用 Dockerfile 來創(chuàng)建鏡像
docker build使用 docker commit 來擴(kuò)展一個鏡像比較簡單,但是不方便在一個團(tuán)隊(duì)中分享。我們可以使用
docker build 來創(chuàng)建一個新的鏡像。為此,首先需要創(chuàng)建一個 Dockerfile,包含一些如何創(chuàng)建鏡像的
指令。新建一個目錄和一個 Dockerfile。
Dockerfile 中每一條指令都創(chuàng)建鏡像的一層,例如:
FROM centos:centos6 MAINTAINER sandywei <sandy@hainiu.tech> # move all configuration files into containerRUN yum install -y httpd EXPOSE 80 CMD ["sh","-c","service httpd start;bash"]Dockerfile 基本的語法是
- 使用#來注釋
- FROM 指令告訴 Docker 使用哪個鏡像作為基礎(chǔ)
- 接著是維護(hù)者的信息
- RUN開頭的指令會在創(chuàng)建中運(yùn)行,比如安裝一個軟件包,在這里使用yum來安裝了一些軟件
更詳細(xì)的語法說明請參考?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 標(biāo)記來添加 tag,指定新的鏡像的用戶信息。 “.” 是 Dockerfile 所在的路徑(當(dāng)前目錄),
也可以替換為一個具體的 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細(xì)心的朋友可以看到最后一層的ID(5f9aa91b0c9e)和 image id 是一樣的
上傳鏡像
docker push用戶可以通過 docker push 命令,把自己創(chuàng)建的鏡像上傳到倉庫中來共享。例如,用戶在 Docker Hub 上完成注冊后,可以推送自己的鏡像到倉庫中。
運(yùn)行實(shí)例:
$ docker push hainiu/httpd:1.0創(chuàng)建容器
docker create <image-id>docker create 命令為指定的鏡像(image)添加了一個可讀寫層,構(gòu)成了一個新的容器。注意,這個容器并沒有運(yùn)行。
docker create 命令提供了許多參數(shù)選項(xiàng)可以指定名字,硬件資源,網(wǎng)絡(luò)配置等等。
運(yùn)行示例:
創(chuàng)建一個centos的容器,可以使用倉庫+標(biāo)簽的名字確定image,也可以使用image-id指定image。返回容器id
#查看本地images列表 $ docker images#用倉庫+標(biāo)簽 $ docker create -it --name centos6_container centos:centos6#使用image-id $ docker create -it --name centos6_container 6a77ab6655b9 bash b3cd0b47fe3db0115037c5e9cf776914bd46944d1ac63c0b753a9df6944c7a67#可以使用 docker ps查看一件存在的容器列表,不加參數(shù)默認(rèn)只顯示當(dāng)前運(yùn)行的容器 $ docker ps -a可以使用 -v 參數(shù)將本地目錄掛載到容器中。
$ docker create -it --name centos6_container -v /src/webapp:/opt/webapp centos:centos6這個功能在進(jìn)行測試的時候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,如果目錄不存在 Docker 會自動為你創(chuàng)建它。
啟動容器
docker start <container-id>Docker start命令為容器文件系統(tǒng)創(chuàng)建了一個進(jìn)程隔離空間。注意,每一個容器只能夠有一個進(jìn)程隔離空間。
運(yùn)行實(shí)例:
#通過名字啟動 $ docker start -i centos6_container#通過容器ID啟動 $ docker start -i b3cd0b47fe3d進(jìn)入容器
docker exec <container-id>在當(dāng)前容器中執(zhí)行新命令,如果增加 -it參數(shù)運(yùn)行bash 就和登錄到容器效果一樣的。
docker exec -it centos6_container bash停止容器#
docker stop <container-id>刪除容器#
docker rm <container-id>運(yùn)行容器
docker run <image-id>docker run就是docker create和docker start兩個命令的組合,支持參數(shù)也是一致的,如果指定容器
名字是,容器已經(jīng)存在會報錯,可以增加 --rm 參數(shù)實(shí)現(xiàn)容器退出時自動刪除。
運(yùn)行示例:
docker create -it --rm --name centos6_container centos:centos6查看容器列表
docker psdocker ps 命令會列出所有運(yùn)行中的容器。這隱藏了非運(yùn)行態(tài)容器的存在,如果想要找出這些容器,增加 -a 參數(shù)。
刪除鏡像
docker rmi <image-id>刪除構(gòu)成鏡像的一個只讀層。你只能夠使用docker rmi來移除最頂層(top level layer)
(也可以說是鏡像),你也可以使用-f參數(shù)來強(qiáng)制刪除中間的只讀層。
commit容器#
docker commit <container-id>將容器的可讀寫層轉(zhuǎn)換為一個只讀層,這樣就把一個容器轉(zhuǎn)換成了不可變的鏡像。
鏡像保存#
docker save <image-id>創(chuàng)建一個鏡像的壓縮文件,這個文件能夠在另外一個主機(jī)的Docker上使用。和export命令不同,這個命令
為每一個層都保存了它們的元數(shù)據(jù)。這個命令只能對鏡像生效。
使用示例:
#保存centos鏡像到centos_images.tar 文件 $ docker save -o centos_images.tar centos:centos6#或者直接重定向 $ docker save -o centos_images.tar centos:centos6 > centos_images.tar容器導(dǎo)出
docker export <container-id>創(chuàng)建一個tar文件,并且移除了元數(shù)據(jù)和不必要的層,將多個層整合成了一個層,只保存了當(dāng)前統(tǒng)一視角看到
的內(nèi)容。expoxt后的容器再import到Docker中,只有一個容器當(dāng)前狀態(tài)的鏡像;而save后的鏡像則不同,
它能夠看到這個鏡像的歷史鏡像。
inspect
docker inspect <container-id> or <image-id>docker inspect命令會提取出容器或者鏡像最頂層的元數(shù)據(jù)
轉(zhuǎn)自:海牛部落-青牛;http://hainiubl.com/topics/13。
總結(jié)
以上是生活随笔為你收集整理的Docker 的基本原理及快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度神经网络的分布式训练概述:常用方法和
- 下一篇: 【Python】监控视频中运动目标检测的