小白學(xué)Docker<一>

Docker概覽

Docker是一個(gè)用于開(kāi)發(fā)、交付和運(yùn)行應(yīng)用的開(kāi)放平臺(tái),Docker被設(shè)計(jì)用于更快地交付應(yīng)用。Docker可以將應(yīng)用程序和基礎(chǔ)設(shè)施層隔離,并且可以將基礎(chǔ)設(shè)施當(dāng)作程序一樣進(jìn)行管理。使用Docker,可以更快地打包代碼、測(cè)試以及部署,并且可以減少?gòu)木帉?xiě)到部署運(yùn)行代碼的周期。Docker將內(nèi)核容器特性(LXC)、工作流和工具集成,以幫助管理和部署應(yīng)用。

什么是Docker

核心是,Docker了一種在安全隔離的容器中運(yùn)用近乎所有應(yīng)用的方式,這種隔離性和安全性允許你在同一個(gè)主機(jī)上同時(shí)運(yùn)行多個(gè)容器,而容器的這種輕量級(jí)特性,無(wú)需消耗運(yùn)用hpervisor所需的額外負(fù)載,意味著你可以節(jié)省更多的硬件資源。

基于容器虛擬化的工具或平臺(tái)可提供:

  • 將應(yīng)用(包括支撐組件)放入Docker容器中

  • 分發(fā)和交付這些容器給團(tuán)隊(duì),便于后續(xù)的開(kāi)發(fā)和測(cè)試

  • 將容器部署到生產(chǎn)環(huán)境中,生產(chǎn)環(huán)境可以是本地的數(shù)據(jù)中心,也可以在云端。

Docker 是容器管理工具 Docker 是一個(gè)輕量級(jí)、便攜式、與外界隔離的容器,也是一個(gè)可以在容器中很方便地構(gòu)建、傳輸、運(yùn)行應(yīng)用的引擎。和傳統(tǒng)的虛擬化技術(shù)不同的是,Docker 引擎并不虛擬出一臺(tái)虛擬機(jī),而是直接使用宿主機(jī)的內(nèi)核和硬件,直接在宿主機(jī)上運(yùn)行容器內(nèi)應(yīng)用。也正是得益于此,Docker 容器內(nèi)運(yùn)行的應(yīng)用和宿主機(jī)上運(yùn)行的應(yīng)用性能差距幾乎可以忽略不計(jì)。 但是 Docker 本身并不是一個(gè)容器系統(tǒng),而是一個(gè)基于原有的容器化工具 LXC 用來(lái)創(chuàng)建虛擬環(huán)境的工具。類(lèi)似 LXC 的工具已經(jīng)在生產(chǎn)環(huán)境中使用多年,Docker 則基于此提供了更加友好的鏡像管理工具和部署工具。

Docker 不是虛擬化引擎 Docker 第一次發(fā)布的時(shí)候,很多人都拿 Docker 和虛擬機(jī) VMware、KVM 和 VirtualBox 比較。盡管從功能上看,Docker 和虛擬化技術(shù)致力于解決的問(wèn)題都差不多,但是 Docker 卻是采取了另一種非常不同的方式。虛擬機(jī)是虛擬出一套硬件,虛擬機(jī)的系統(tǒng)進(jìn)行的磁盤(pán)操作,其實(shí)都是在對(duì)虛擬出來(lái)的磁盤(pán)進(jìn)行操作。當(dāng)運(yùn)行 CPU 密集型的任務(wù)時(shí),是虛擬機(jī)把虛擬系統(tǒng)里的 CPU 指令“翻譯”成宿主機(jī)的CPU指令并進(jìn)行執(zhí)行。兩個(gè)磁盤(pán)層,兩個(gè)處理器調(diào)度器,兩個(gè)操作系統(tǒng)消耗的內(nèi)存,所有虛擬出的這些都會(huì)帶來(lái)相當(dāng)多的性能損失,一臺(tái)虛擬機(jī)所消耗的硬件資源和對(duì)應(yīng)的硬件相當(dāng),一臺(tái)主機(jī)上跑太多的虛擬機(jī)之后就會(huì)過(guò)載。而 Docker 就沒(méi)有這種顧慮。Docker 運(yùn)行應(yīng)采取的是“容器”的解決方案:使用 namespace 和CGroup 進(jìn)行資源限制,和宿主機(jī)共享內(nèi)核,不虛擬磁盤(pán),所有的容器磁盤(pán)操作其實(shí)都是對(duì) /var/lib/docker/ 的操作。簡(jiǎn)言之,Docker 其實(shí)只是在宿主機(jī)中運(yùn)行了一個(gè)受到限制的應(yīng)用程序。 從上面不難看出,容器和虛擬機(jī)的概念并不相同,容器也并不能取代虛擬機(jī)。在容器力所不能及的地方,虛擬機(jī)可以大顯身手。例如:宿主機(jī)是 Linux,只能通過(guò)虛擬機(jī)運(yùn)行Windows,Docker 便無(wú)法做到。再例如,宿主機(jī)是 Windows,Windows 并不能直接運(yùn)行Docker,Windows上的 Docker 其實(shí)是運(yùn)行在 VirtualBox 虛擬機(jī)里的。

Docker 使用層級(jí)的文件系統(tǒng) 前面提到過(guò),Docker 和現(xiàn)有容器技術(shù) LXC 等相比,優(yōu)勢(shì)之一就是 Docker 提供了鏡像管理。對(duì)于 Docker 而言,鏡像是一個(gè)靜態(tài)的、只讀的容器文件系統(tǒng)的快照。然而不僅如此,Docker 中所有的磁盤(pán)操作都是對(duì)特定的Copy-On-Write文件系統(tǒng)進(jìn)行的。下面通過(guò)一個(gè)例子解釋一下這個(gè)問(wèn)題。 例如我們要建立一個(gè)容器運(yùn)行 JAVA Web 應(yīng)用,那么我們應(yīng)該使用一個(gè)已經(jīng)安裝了 JAVA 的鏡像。在 Dockerfile(一個(gè)用于生成鏡像的指令文件)中,應(yīng)該指明“基于 JAVA 鏡像”,這樣 Docker 就會(huì)去Docker Hub Registry 上下載提前構(gòu)建好的 JAVA 鏡像。然后再 Dockerfile 中指明下載并解壓 Apache Tomcat 軟件到 /opt/tomcat 文件夾中。這條命令并不會(huì)對(duì)原有的 JAVA 鏡像產(chǎn)生任何影響,而僅僅是在原有鏡像上添加了一個(gè)改動(dòng)層。當(dāng)一個(gè)容器啟動(dòng)時(shí),容器內(nèi)的所有改動(dòng)層都會(huì)啟動(dòng),容器會(huì)從第一層中運(yùn)行 /usr/bin/java 命令,并且調(diào)用另外一層中的 /opt/tomcat/bin 命令。實(shí)際上,Dockerfile 中每一條指令都會(huì)產(chǎn)生一個(gè)新的改動(dòng)層,即便只有一個(gè)文件被改動(dòng)。如果用過(guò) Git 就能更清楚地認(rèn)識(shí)這一點(diǎn),每條指令就像是每次 commit,都會(huì)留下記錄。但是對(duì)于 Docker 來(lái)說(shuō),這種文件系統(tǒng)提供了更大的靈活性,也可以更方便地管理應(yīng)用程序。 我們Spantree的團(tuán)隊(duì)有一個(gè)自己維護(hù)的含有 Tomcat 的鏡像。發(fā)布新版本也非常簡(jiǎn)單:使用 Dockerfile將新版本拷貝進(jìn)鏡像從而創(chuàng)建一個(gè)新鏡像,然后給新鏡像貼上版本的標(biāo)簽。不同版本的鏡像的不同之處僅僅是一個(gè) 90 MB 大小的 WAR 文件,他們所基于的主鏡像都是相同的。如果使用虛擬機(jī)去維護(hù)這些不同的版本的話(huà),還要消耗掉很多不同的磁盤(pán)去存儲(chǔ)相同的系統(tǒng),而使用 Docker 就只需要很小的磁盤(pán)空間。即便我們同時(shí)運(yùn)行這個(gè)鏡像的很多實(shí)例,我們也只需要一個(gè)基礎(chǔ)的 JAVA / TOMCAT 鏡像。

Docker 可以節(jié)約時(shí)間 很多年前我在為一個(gè)連鎖餐廳開(kāi)發(fā)軟件時(shí),僅僅是為了描述如何搭建環(huán)境都需要寫(xiě)一個(gè) 12 頁(yè)的 Word 文檔。例如本地 Oracle 數(shù)據(jù)庫(kù),特定版本的 JAVA,以及其他七七八八的系統(tǒng)工具和共享庫(kù)、軟件包。整個(gè)搭建過(guò)程浪費(fèi)掉了我們團(tuán)隊(duì)每個(gè)人幾乎一天的時(shí)間,如果用金錢(qián)衡量的話(huà),花掉了我們上萬(wàn)美元的時(shí)間成本。雖然客戶(hù)已經(jīng)對(duì)這種事情習(xí)以為常,甚至認(rèn)為這是引入新成員、讓成員適應(yīng)環(huán)境、讓自己的員工適應(yīng)我們的軟件所必須的成本,但是相比較起來(lái),我們寧愿把更多的時(shí)間花在為客戶(hù)構(gòu)建可以增進(jìn)業(yè)務(wù)的功能上面。 如果當(dāng)時(shí)有 Docker,那么構(gòu)建環(huán)境就會(huì)像使用自動(dòng)化搭建工具 Puppet / Chef / Salt / Ansible 一樣簡(jiǎn)單,我們也可以把整個(gè)搭建時(shí)間周期從一天縮短為幾分鐘。但是和這些工具不同的地方在于,Docker 可以不僅僅可以搭建整個(gè)環(huán)境,還可以將整個(gè)環(huán)境保存成磁盤(pán)文件,然后復(fù)制到別的地方。需要從源碼編譯 Node.js 嗎?Docker 做得到。Docker不僅僅可以構(gòu)建一個(gè) Node.js 環(huán)境,還可以將整個(gè)環(huán)境做成鏡像,然后保存到任何地方。當(dāng)然,由于 Docker 是一個(gè)容器,所以不用擔(dān)心容器內(nèi)執(zhí)行的東西會(huì)對(duì)宿主機(jī)產(chǎn)生任何的影響。 現(xiàn)在新加入我們團(tuán)隊(duì)的人只需要運(yùn)行docker-compose up命令,便可以喝杯咖啡,然后開(kāi)始工作了。

Docker 可以節(jié)省開(kāi)銷(xiāo) 當(dāng)然,時(shí)間就是金錢(qián)。除了時(shí)間外,Docker 還可以節(jié)省在基礎(chǔ)設(shè)施硬件上的開(kāi)銷(xiāo)。高德納和麥肯錫的研究表明,數(shù)據(jù)中心的利用率在 6% - 12% 左右。不僅如此,如果采用虛擬機(jī)的話(huà),你還需要被動(dòng)地監(jiān)控和設(shè)置每臺(tái)虛擬機(jī)的 CPU 硬盤(pán)和內(nèi)存的使用率,因?yàn)椴捎昧遂o態(tài)分區(qū)(static partitioning)所以資源并不能完全被利用。而容器可以解決這個(gè)問(wèn)題:容器可以在實(shí)例之間進(jìn)行內(nèi)存和磁盤(pán)共享。你可以在同一臺(tái)主機(jī)上運(yùn)行多個(gè)服務(wù)、可以不用去限制容器所消耗的資源、可以去限制資源、可以在不需要的時(shí)候停止容器,也不用擔(dān)心啟動(dòng)已經(jīng)停用的程序時(shí)會(huì)帶來(lái)過(guò)多的資源消耗。凌晨三點(diǎn)的時(shí)候只有很少的人會(huì)去訪(fǎng)問(wèn)你的網(wǎng)站,同時(shí)你需要比較多的資源執(zhí)行夜間的批處理任務(wù),那么可以很簡(jiǎn)單的便實(shí)現(xiàn)資源的交換。 虛擬機(jī)所消耗的內(nèi)存、硬盤(pán)、CPU 都是固定的,一般動(dòng)態(tài)調(diào)整都需要重啟虛擬機(jī)。而用 Docker 的話(huà),你可以進(jìn)行資源限制,得益于 CGroup,可以很方便動(dòng)態(tài)調(diào)整資源限制,讓然也可以不進(jìn)行資源限制。Docker 容器內(nèi)的應(yīng)用對(duì)宿主機(jī)而言只是兩個(gè)隔離的應(yīng)用程序,并不是兩個(gè)虛擬機(jī),所以宿主機(jī)也可以自行去分配資源。

Docker介紹:http://www.lupaworld.com/article-243555-1.html

Docker介紹:http://www.docker.org.cn/book/docker/what-is-docker-16.html

Docker官方文檔:https://docs.docker.com/engine/understanding-docker/

Docker中文文檔:http://git.oschina.net/widuu/chinese_docker

Docker介紹:https://segmentfault.com/a/1190000002609286

2 Docker的安裝

Docker的安裝是比較簡(jiǎn)單的。
對(duì)于Linux用戶(hù)可以借助其發(fā)?版的Linux包管理工具安裝,對(duì)于Windows和
MAC用戶(hù)相對(duì)麻煩一些,文中下以Windows7系統(tǒng)為例,講述安裝過(guò)程。
筆者強(qiáng)烈建議大家使用Linux系統(tǒng)進(jìn)入本章的學(xué)習(xí),第一是比較符合目前
Docker的市場(chǎng)趨勢(shì),第一Docker本身就是基于Linux的LXC技術(shù)。

CentOS 7.0下Docker的安裝

  1. 查看內(nèi)核版本(Docker需要64位版本,同時(shí)內(nèi)核版本在3.10以上,如果版
    本低于3.10,需要升級(jí)內(nèi)核):uname -r

  2. 更新yum包:yum update

  3. 添加yum倉(cāng)庫(kù):

    sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
    [dockerrepo]
    name=Docker Repository
    baseurl=https://yum.dockerproject.org/repo/main/centos/7/
    enabled=1
    gpgcheck=1
    gpgkey=https://yum.dockerproject.org/gpg
    EOF
    
    1. 安裝Docker:yum install docker-engine

    2. 啟動(dòng)Docker: service docker start

    3. 使用Docker國(guó)內(nèi)鏡像(為Docker鏡像下載提速,非必須)

      curl -sSL https://get.daocloud.io/daotools/set_mirror.sh |
      sh -s http://fe8a7d6e.m.daocloud.io
      

      參考:

      官方文檔:https://docs.docker.com/engine/installation/linux/centos/

    CentOS 6.5下Docker的安裝

    Docker容器最早受到RHEL完善的支持是從最近的CentOS 7.0開(kāi)始的,官方說(shuō)明是只能運(yùn)行于64位架構(gòu)平臺(tái),內(nèi)核版本為2.6.32-431及以上(即 >=CentOS 6.5,運(yùn)行docker時(shí)實(shí)際提示3.10.0及以上)。 需要注意的是CentOS 6.5與7.0的安裝是有一點(diǎn)點(diǎn)不同的,CentOS 6.x上Docker的安裝包叫docker-io,并且來(lái)源于Fedora epel庫(kù),這個(gè)倉(cāng)庫(kù)維護(hù)了大量的沒(méi)有包含在發(fā)行版中的軟件,所以先要安裝EPEL,而CentOS 7.x的Docker直接包含在官方鏡像源的Extras倉(cāng)庫(kù)(CentOS-Base.repo下的[extras]節(jié)enable=1啟用)。

    下面就CentOS 6.5講解Docker的安裝過(guò)程,以下是軟件版本:

    Linux版本 Docker版本
    CentOS 6.5 X64(只能X64) 1.7.1

    升級(jí)內(nèi)核

    查看內(nèi)核版本:uname -r

    結(jié)果: 2.6.32-431.el6.x86_64 ,不滿(mǎn)足上文的需求,故此需要升級(jí)內(nèi)
    核。

    升級(jí)步驟:

    1. 導(dǎo)入公鑰數(shù)字證書(shū):rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

    2. 安裝ELRepo:rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm

    3. 安裝kernel長(zhǎng)期版本:yum --enablerepo=elrepo-kernel install kernel-lt -y

      lt表示long-term的意思,長(zhǎng)期維護(hù)版本,也可以將kernel-lt改為kernel
      -ml,安裝主線(xiàn)版本

    4. 編輯grub.conf文件,修改Grub引導(dǎo)順序,確認(rèn)剛安裝好的內(nèi)核在哪個(gè)位置,然后設(shè)置default值(從0開(kāi)始),一般新安裝的內(nèi)核在第一個(gè)位置,所以設(shè)置default=0。

      vim /etc/grub.conf 
      
      # 以下是/etc/grub.conf的內(nèi)容
      default=0 # 修改該值即可
      timeout=5
      splashimage=(hd0,0)/grub/splash.xpm.gz
      hiddenmenu
      title CentOS (3.10.103-1.el6.elrepo.x86_64)
      
    5. 重啟并查看內(nèi)核版本,將會(huì)發(fā)現(xiàn)內(nèi)核已經(jīng)更新。

    安裝Docker

    1. 禁用selinux,因?yàn)閟elinux和LXC有沖突,故而需要禁用

      vim /etc/selinux/config的內(nèi)容
      # 以下是/etc/selinux/config的內(nèi)容
      # enforcing - SELinux security policy is enforced.
      # permissive - SELinux prints warnings instead of enfo
      rcing.
      # disabled - No SELinux policy is loaded.
      SELINUX=disabled # 將SELINUX設(shè)為disabled,注意修改后最好重啟
      下機(jī)器。
      
    2. 安裝 Fedora EPEL

      yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_
      64/epel-release-6-8.noarch.rpm
      
    3. 安裝Docker

      yum install -y docker-io
      
    4. 以守護(hù)模式運(yùn)行Docker

      docker -d
      
    5. 如果不報(bào)錯(cuò),那就是啟動(dòng)成功了,如果報(bào)以下異常:

      docker: relocation error: docker: symbol dm_task_get_info_
      with_deferred_remove, version Base not defined in file lib
      devmapper.so.1.02 with link time reference
      INFO[0000] Listening for HTTP on unix (/var/run/docker.soc
      k)
      

      執(zhí)行以下內(nèi)容:

      yum upgrade device-mapper-libs
      
    6. 將Docker開(kāi)機(jī)啟動(dòng)

      chkconfig docker on
      
    7. 重啟機(jī)器

    其他平臺(tái)的安裝

    請(qǐng)參考:https://docs.docker.com/engine/installation/

    參考文檔

    Windows:https://docs.docker.com/engine/installation/windows/
    MAC: https://docs.docker.com/engine/installation/mac/
    CentOS:https://docs.docker.com/engine/installation/linux/centos/

3.Docker的常用命令

準(zhǔn)備工作

  1. 對(duì)于Window用戶(hù),請(qǐng)點(diǎn)擊Kitematic左下方的DOCKER CLI按鈕,在彈
    出的命令窗體內(nèi)輸入命令,不要在CMD中測(cè)試Docker命令。

  2. 下載鏡像,以kitematic/hello-world-nginx為例:

    docker pull kitematic/hello-world-nginx
    

    常用命令測(cè)試一覽表

    命令 解釋
    docker images 列表本地所有鏡像
    docker search 關(guān)鍵詞 在Docker Hub中搜索鏡像
    docker pull 鏡像名稱(chēng) 下載Docker鏡像
    docker rmi 鏡像id 刪除Docker鏡像。加參數(shù)-f表示強(qiáng)制刪除。
    docker run 鏡像名稱(chēng) 啟動(dòng)Docker鏡像
    docker ps 列表所有運(yùn)行中的Docker容器。該命令參數(shù)比較多,-a:列表所有容器;-f:過(guò)濾;-q 只列表容器的id。
    docker version 查看Docker版本信息
    docker info 查看Docker系統(tǒng)信息,例如:CPU、內(nèi)存、容器個(gè)數(shù)等等
    docker kill 容器id 強(qiáng)行停止一個(gè)容器
    docker start /stop / restart 容器id 啟動(dòng)、停止、重啟指定容器
    docker build -t 標(biāo)簽名稱(chēng) 目錄 構(gòu)建Docker鏡像,-t 表示指定一個(gè)標(biāo)簽
    docker tag 為鏡像打標(biāo)簽

    更多命令,請(qǐng)輸入 --help 參數(shù)查詢(xún);如果想看docker命令可輸入 docker
    --help ;如果想查詢(xún) docker run 命令的用法,可輸入 docker run --
    help 。

    docker run

    docker run 應(yīng)該是我們最常用的命令了,這邊講解一下,便于大家入門(mén)。

    參數(shù) 解釋
    -d 后臺(tái)
    -P 隨機(jī)端口映射
    -p 指定端口映射格式:

ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort |

測(cè)試:

  1. 啟動(dòng)測(cè)試鏡像 docker pull kitematic/hello-world-nginx

    docker run -d -p 91:80 kitematic/hello-world-nginx
    

    這邊解釋下docker run的兩個(gè)參數(shù):

    -d # 后臺(tái)運(yùn)行
    -p 宿主機(jī)端口:容器端口 # 開(kāi)放容器端口到宿主機(jī)端口
    

    訪(fǎng)問(wèn):http://localhost:91 測(cè)試,這里的localhost指的是宿主機(jī)的主機(jī)名

TIPS

  1. 目前網(wǎng)上很多教程還是boot2docker(項(xiàng)目地
    址:https://github.com/boot2docker/boot2docker),該項(xiàng)目已廢
    棄了,筆者不建議使用。
  2. 如果安裝不成功,請(qǐng)按照提示解決一下,譬如開(kāi)啟VT技術(shù)等等。
    Docker的提示是做得非常好的。
  3. 對(duì)于Winodws用戶(hù),建議點(diǎn)擊Kitematic左下?的DOCKER CLI,在
    彈出來(lái)的控制臺(tái)輸入Docker命令,而不要直接在CMD中輸入命令。

參考文檔:

http://my.oschina.net/denglz/blog/487332
https://segmentfault.com/a/1190000000733628
http://www.oschina.net/translate/nstalling-dockerio-on-centos-64-64-bit
https://segmentfault.com/a/1190000000735011
http://www.server110.com/docker/201411/11122.html
http://dockone.io/article/152

http://www.open-open.com/lib/view/open1422492851548.html
Docker常用命令:http://www.infoq.com/cn/articles/docker-command-line-quest/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容