1. 程式人生 > >【幹貨】Docker的安裝、鏡像及容器容器

【幹貨】Docker的安裝、鏡像及容器容器

stat epo 立即生效 rmi jpg 創建 使用率 linux內核 情況

1、Docker概述
  • Docker是在Linux容器中運行應用的開源工具,是一種輕量級的虛擬機。器容器技術可以在一臺主機上輕松地為任何應用創建一個輕量級的、可移植的、自給自足的容器。通過這種容器打包應用程序,意味著簡化了重新部署、調試這些瑣碎的重復工作,極大地提高了工作效率。
  • 作為一種輕量級的虛擬化方式,Docker與傳統虛擬機相比具有顯著的優勢:
  • 1)、Docker容器很快,啟動和停止可以在秒級實現,比傳統虛擬機要快很多;
  • 2)、Docker核心解決的問題是利用容器來實現類似VM,從而以更加節省的硬件資源提供給用戶更多的計算資源,從而在保證應用性能的同時,減小了系統開銷,使得一臺主機上同時運行數千個Docker容器成為可能;
  • 3)、Docker容器操作方便,還可以通過Dockerfile配置文件支持靈活的自動化創建和部署。
  • Docker容器與傳統虛擬化的比較;
特性 Docker容器 虛擬機
啟動速度 秒級 分鐘級
計算能力損耗 幾乎無 損耗50%左右
性能 接近原生 弱於
系統支持量(單機) 上千個 幾十個
隔離性 資源限制 完全限制
  • Docker之所以擁有眾多優勢,跟操作系統虛擬化自身的特點是分不開的。傳統虛擬機需要有額外的虛擬機管理程序和虛擬機操作系統層。而Docker容器是直接在操作系統層面上實現的虛擬化。

技術分享圖片

2、Docker的核心概念及安裝

1)、鏡像(Image)

  • Docker的鏡像是創建容器的基礎,類似於虛擬機的快照,可以理解為是一個面向Docker容器引擎的只讀模板,比如:一個鏡像可以是一個完整的CentOS7操作系統環境。稱之為以個CentOS鏡像;可以是安裝了一個MySQL的應用程序,稱之為一個MySQL鏡像等等。
    -dovker提供了簡單的機制來創建和更新現有的鏡像,用戶也可以從網上下載已經做好的應用鏡像來直接使用。

2)、容器(Container)

  • Docker的容器是從鏡像創建的運行實例,它可以被啟動、停止和刪除。所創建的每一個容器都是互相隔離的、互不可見的,可以保證平臺的安全性。還可以吧容器看作是一個簡易版的Linux環境,Docker利用容器來運行和隔離應用。

3)、倉庫(Repository)

  • Docker倉庫是用來集中存放鏡像的地方,當創建了自己的鏡像之後,可以使用push命令將它上傳到公共倉庫或私有倉庫,這樣一來當下次要在另一臺機器上使用這個鏡像時,只需從倉庫上pull下來就可以了。

4)、安裝Docker

  • 這裏使用CentOS7系統,Docker自己的YUM源為例來進行相關安裝操作。

vim /etc/yum.repos.d/docker.repo #配置YUM倉庫

[docker-repo]
name=Docker Repository
baseurl=http://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=http://yum.dockerproject.org/gpg

yum install docker-engine -y #安裝Docker

systemctl start docker.service #開啟Docker

systemctl enable docker.service #開機自啟動

docker version #查看版本信息

  • 安裝好的Docker系統中有兩個程序:Docker服務端和Docker客戶端。其中Docker服務端是一個服務進程,管理著所有的容器。Docker客戶端則扮演者Docker服務端的遠程控制器,可以用來控制Docker的服務端進程。大部分情況下Docker服務端和Docker客戶端運行在一臺機器上。

技術分享圖片

3、Docker鏡像操作

  • Docker運行容器前需要本地存在對應的鏡像,如果不存在本地鏡像Docker就會嘗試從默認鏡像倉庫http://hub.docker.com下載。

1)、搜索鏡像

  • 在使用下載鏡像前,可以使用docker search命令搜索遠端官方倉庫中的共享鏡像。
命令格式:docker search 關鍵字
  • 搜索後會返還很多包含關鍵字的鏡像其中返回信息包括鏡像名稱(NAME)、描述(DESCRIPTION)、星級(STARS)、是否官方創建(OFFICIAL)、是否主動創建(AUTOMATED)。
  • 使用docker search命令只能查找鏡像,對鏡像的標簽無法查找,因此如果需要查找docker標簽,則需要從網頁上訪問鏡像倉庫http://hub.docker.com進行查找。

技術分享圖片

2)、獲取鏡像

  • 搜索到符合需求的鏡像,可以使用docker pull命令從網絡下載鏡像到本地使用。
命令格式:docker pull 倉庫名稱 [:標簽]
  • 對於docker來說,如果下載鏡像時不指定標簽,則默認會下載倉庫中最新版,因此也可通過制定標簽來下載指定版本,這裏的標簽(tag)就是用來區分鏡像版本的。鏡像文件整個下載過程是由由若幹層(Layer)組成,我們稱之為AUFS(文件聯合系統),是實現增量保存與更新的基礎,下載過程中會輸出鏡像的各層信息。

技術分享圖片

3)、查看鏡像信息

  • 用戶可以使用docker images 命令查看下載到本地的所有鏡像。
命令語法:docker images 倉庫名 :[標簽]
#REPOSITORY ---鏡像屬於的倉庫
#TAG ---鏡像的標簽信息,標記同一個倉庫中不同鏡像
#IMAGE ID ---鏡像的唯一ID號,唯一標識了該鏡像
#CREATED ---鏡像創建時間
#SIZE ---鏡像大小
  • 還可以根據鏡像的唯一標識ID號,獲取鏡像詳細信息。
docker inspect 鏡像ID號

技術分享圖片

  • 為了在後續工作中使用這個鏡像,使用docker tag命令來為本地的鏡像添加新的標簽。
docker tag 名稱 :[標簽] 性名稱 :[新標簽]

技術分享圖片

4)、刪除鏡像

  • 可以使用docker rmi命令刪除多余的鏡像。
命令格式:docker rmi 倉庫名稱:標簽
          docker rmi 鏡像ID號
  • 當一個鏡像有多個標簽的時候,docker rmi命令只是刪除該鏡像多個標簽中的指定標簽,不會影響鏡像文件。但當該鏡像只剩下一個標簽的時候,此時刪除該標簽的時候會徹底刪除該鏡像。
  • 當使用方法二刪除時,必須確保該鏡像沒有被容器使用才能進行,刪除時系統會先刪除掉指向該鏡像的所有標簽,然後刪除鏡像本身。如果該鏡像已經被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,在刪除鏡像。

技術分享圖片

5)、存出鏡像和載入鏡像

  • 當需要把一臺機器上的鏡像遷移到另一臺機器上的時候,需要將鏡像保存成本地文件,這一過程叫做存出鏡像。
命令格式:docker save -o 存儲文件名 存儲的鏡像   #會保存到當前文件夾
  • 別的機器通過拷貝的鏡像,將該鏡像導入到自己的鏡像庫中,這一過程叫做載入鏡像
格式命令:docker load < 存出的文件
          docker --input 存出的文件

6)、上傳文件

  • 本地存儲的鏡像文件越來越多,就要一個專門的地方存放這些鏡像---倉庫。目前比較方便的就是公共倉庫,默認上傳的是Docker hub官方倉庫,需要註冊賬號完成登錄後才能上傳。在上傳鏡像之前還需要對本地鏡像添加新的標簽,並使用docker login登錄,然後再使用docker push命令上傳。
命令格式:docker push 倉庫名稱 :標簽

Docker 容器操作

1)、容器的創建與啟動

  • 容器的創建就是將鏡像加載到容器的過程,新創建的容器處於停止狀態,不運行任何程序。需要在其中發起一個進程來啟動容器,該進程是容器的唯一進程。該進程結束時,容器也會完全停止。使用docker create 命令可以創建一個新的容器。
命令格式:docker create [選項] 鏡像 運行的程序      #創建容器後會返回一個唯一的ID
#-i 讓容器的輸入保持打開
#-t 讓Docker分配一個偽終端
  • 使用docker ps 命令查看所有容器的運行狀態,添加-a選項可以列出系統最近一次啟動的容器。
  • 啟動停止狀態的容器可以使用docker start命令
docker start 容器的ID/ 名稱             #容器啟動後,可以看到容器狀態一欄變為UP,表示容器他、已處於啟動狀態
  • 如果用戶想創建並啟動容器,可以直接執行docker run命令。需註意的是當後面的命令執行解說後,容器就會停止,和在本地直接執行命令幾乎沒有區別。
  • 有時候需要在後臺執行這個容器,就需要讓docker容器以守護態形式在後臺運行。可以在docker run命令之後添加-d選項啦實現。但需註意容器所運行的程序不能結束。
例如:執行下面的命令容器會持續在後臺運行
docker run -d httpd /usr/bin/bash -c "while true; do echo hello;done"

技術分享圖片

2)、容器的運行與終止

  • 如果需要終止運行的容器,可以使用docker stop 命令完成。
命令格式:docker stop 容器的ID/名稱         #當查看到STATUS狀態為Exited時,即狀態終止

技術分享圖片

3)、容器的進入

  • 當不進入容器時,讓容器執行任務,一條任務執行完成後容器會自動停止,為了避免繁瑣的情況,我們需要進入容器執行,且退出容器後,容器並不會停止。可以使用docker exec命令進入運行著的容器。
命令格式:docker exec -it 容器的ID/名稱 /bin/bash
-i 表示讓容器的輸入保持打開
-t 表示讓docker分配一個偽終端

技術分享圖片

4)、容器的導出與導入

  • 容器的導出為文件,可以使用docker export命令來實現。
  • 使用docker import命令可以將文件導入,成為鏡像。
命令格式:docker export 容器ID/名稱 &gt; 文件名
          cat 文件名 | docker import - 生成的鏡像名稱:標簽

5)、容器的刪除

  • 可以使用docker rm命令將一個已經處於停止狀態的容器刪除。
命令格式:docker rm 容器ID/名稱

技術分享圖片

Docker資源控制

1)、限制cpu使用速率

  • 在docker中可以通過--cpu-quota選項來限制cpu使用率,cpu的百分比是以1000為單位的。
docker run --cpu-quota 20000 e1e05c66ec9c #cpu的使用率限定為20%
#還可以通過Cgroup配置文件立即生效
echo 20000 > /sys/fs/cgroup/cpu/docker/e1e05c66ec9ced2d6290ebe8e3fdea27f439dcbeea70921ec5d9e5b0bcffaf11/cpu.cfs_quota_us

2)、多任務按比例分析CPU

  • 當有多個容器任務運行時,很難計算cpu的使用率,為了使容器合理使用cpu資源,可以通過--cpu-share選項設置cpu按比例共享資源,這種方式還可以實現cpu使用率的動態調整。
例如:運行按個容器A、B、C,占用CPU資源的比例為1:1:2
docker run --cpu-shares 1024 容器A
docker run --cpu-shares 1024 容器B
docker run --cpu-shares 2048 容器C

3)、限制cpu內核使用

如果服務器有16個核心,那麽cpu編號為0~15,使容器綁定第1~4個內核使用。
docker run --cpuset-cpus 0,1,2,3 容器名

4)、對內存使用的限制

  • 在docker中可以通過docker run -m 命令來限制內存使用量,相應的配置文件為/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes。需要註意的是,一旦容器cgroup使用的內存超過了限制的容量,Linux內核將會嘗試收回這些內存,如果仍舊沒法控制內存控制在限制範圍之內,進程就會被殺死。
例如:限制容器的內存為512m
docker run -m 512m 容器名 

5)、對blkio的限制

  • 如果是在一臺服務器上進行容器的混合部署,那麽會出現同時有幾個程序寫磁盤數據的情況,這時可以--device-write-iops選項來限制寫入的iops,相應的還有--device-read-bps選項可以限制讀取的iops,但是這種方法只能針對blkio限制的是設備(device),而不是分區,相應的配置文件/sys/fs/cgroup/blkio/docker/容器ID/blkioo.throttle.write_iops_device
例如:限制容器的/dev/sda1的寫入ipos為1MB
docker run --device-write-bps /dev/sda1:1mb 容器名 

【幹貨】Docker的安裝、鏡像及容器容器