Docker容器引擎

目錄:

 

 

 

 

  •  
  • docker簡介
    1.docker與傳統虛擬機的區別
    2.Docker的使用場景
  • Docker的核心概念及版本
    1.鏡像
    2.容器
    3.倉庫
    4.docker版本
  • Docker鏡像操作 
  • 1.搜索鏡像
  • 2.獲取鏡像
  • 3.查看鏡像信息
  • 4.刪除鏡像
  • 5.存出鏡像和載入鏡像
  • 6.上傳鏡像
  • docker容器操作
    1.容器的創建與啓動
    2.容器的進入
    3.容器的導入與導出
    4.容器的刪除
  • Docker資源控制
    1..CPU限制
    2.對內存使用的限制
    3.對blkio(磁盤)的限制

 

 

 

docker簡介

   docjker是linux容器裏運行的開源小型輕量級虛擬機,概念來自於2000年,但2013才真正成熟,由Docker inc公司發表和推廣,現在加入Linux基金會,源碼在github.com/docker維護髮布,官方文檔www.docker.com

地位:
    近年來,最受追捧的新技術之一,在中國2015年開始盛行,各大公司都開始支持和推廣docker

理念:
    創建、運輸、處處運行,非常好用的便於移植的集裝箱式的容器虛擬化,一次封裝,到處運行

1.docker與傳統虛擬機的區別


   docker優點:
        輕量、快速啓動和停止(秒級)、併發性能強(一臺物理機並行啓動上千臺docker)、計算能力損耗小、資源限制
    docker不足:
        不適合配置大型安全環境,比如:數據庫

   Docker之所以擁有衆多優勢,與操作系統虛擬化自身的特點是分不開的。傳統虛擬機需要有額外的虛擬機管理程序和虛擬操作系統層,而Docker容器是直接在操作系統層面之上實現的虛擬化,如下圖:

2.Docker的使用場景

現在卡者需要能方便地創建運行在雲平臺上的應用,必須要脫離底層的硬件,同時還需要任何時間、地點可獲取這些資源,這正是Docker所能提供的。

Docker的容器技術可以在一條主句上輕鬆爲任何應用創建一個輕量級的、可移植的、自給自足的容器。通過這種容器打包應用程序,意味着簡化了重新部署、調試這些瑣碎的重複工作,極大地提高了工作效率。
 

Docker的核心概念及版本

1.鏡像:類似於vmware的快照,只讀不可寫,可以看成一個安裝某個應用程序的Linux環境,Docker的鏡像是創建容器的基礎
2. 容器:鏡像的運行實例,可以啓動、停止、刪除,容器之間是隔離的,互不可見,互不影響,保證各自的相對安全,類似於多臺vmware虛擬機。
 3.倉庫:統一集中保存鏡像的地方,分爲公有庫(dockerhub)和私有庫(自己創建)

4.docker的版本
    docker.io:Centos7默認支持,早期
    docker-ce: 社區版(免費)
    docker-ee: 企業版(收費)

安裝Docker

Docker支持在主流的操作系統平臺上進行使用,包括Windows系統、Linux系統及MacOS系統等。目前最新的RedHat RHEL、Centos及Ubuntu系統官方軟件源中都已經默認自帶了Docker包,可直接安裝使用,也可以用Docker自己的YUM源進行配置。

yum -y install docker 
systemctl start docker	\\啓動
systemctl enable docker \\設爲開機自動啓動
docker version		\\查看docker版本

Docker鏡像操作 

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

1.搜索鏡像

在使用下載鏡像前,可以使用docker search 命令搜索遠端官方倉庫中的共享鏡像

命令格式: docker  search  [關鍵詞]

如:搜索鏡像關鍵詞爲dhcp

[root@localhost ~]# docker search dhcp
INDEX       NAME                                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/networkboot/dhcpd                    Suitable for running a DHCP server for you...   46                   [OK]
docker.io   docker.io/joebiellik/dhcpd                     DHCP server running on Alpine Linux             15                   [OK]
docker.io   docker.io/gns3/dhcp                            A DHCP container for GNS3 using dnsmasq         3                    [OK]
docker.io   docker.io/instantlinux/dhcpd-dns-pxe           Serve DNS, DHCP and TFTP from a small Alpi...   2                    [OK]

INDEX       NAME     DESCRIPTION      STARS     OFFICIAL   AUTOMATED
    索引       鏡像名       描述                     星級          官方創建                自主創建

2.獲取鏡像

搜索到符合需求的鏡像,可以使用docker pull命令從網絡下載鏡像到本地使用

命令格式: docker pull 倉庫名稱[:標籤]

對於Docker鏡像來說,如果下載鏡像時不指定標籤,則默認會下載最新版本的鏡像,即選擇標籤爲latest;也可通過指定的標籤下載特定版本的某一鏡像。標籤就是用來區分鏡像版本的

如:下載名稱爲docker.io/networkboot/dhcpd的倉庫

[root@localhost ~]# docker pull docker.io/networkboot/dhcpd
//需要等待一些時間

從整個下載過程中可以看出,鏡像文件是由若干層組成,我們稱爲AUFS(聯合文件系統),是實現增量保存與更新的基礎,下載過程中會輸出鏡像的各層信息。鏡像下載到本地之後就可以使用該鏡像了。

用戶也可選擇從其他註冊服務器倉庫下載,這時需要在倉庫名稱前執行完整的倉庫註冊服務器地址。

3.查看鏡像信息

1)使用dockerimages命令查看下載到本地的所有鏡像

語法:docker images 倉庫名稱:[標籤]

[root@localhost ~]# docker images  //查看所有下載的鏡像
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/networkboot/dhcpd   latest              52cbff801df2        11 months ago       105 MB

 從查看的信息可以看到以下信息:

  • REPOSITORY :鏡像屬於的倉庫
  • TAG:鏡像的標籤信息,標記同一倉庫中的不同鏡像
  • IMAGE ID:鏡像的唯一ID號,唯一標識了該鏡像
  • CREATED:鏡像創建時間
  • VIRTUAL SIZE:鏡像大小

2)可以根據鏡像的唯一標識ID號,獲取鏡像的詳細信息

語法:docker inspect [鏡像ID號]

如:查看鏡像id爲” 52cbff801df2 “的詳細信息

[root@localhost ~]# docker inspect 52cbff801df2  
//詳細內容比較多這裏省略

鏡像的詳細信息中包括創建時間、系統版本、主機名、域名、用戶、卷、標籤、操作系統、設備ID等各種信息。

3)修改鏡像標籤

爲了在後續工作中經常使用這個鏡像,可以使用docker tag命令爲本地鏡像添加新的標籤。

語法:docker tag 名稱:[標籤]新名稱:[新標籤]

如:修改”docker.io/networkboot/dhcpd“鏡像名稱爲dhcp,鏡像標籤爲dhcp

[root@localhost ~]# docker tag docker.io/networkboot/dhcpd dhcp:dhcp
[root@localhost ~]# docker images  //查看驗證
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
dhcp                          dhcp                52cbff801df2        11 months ago       105 MB
docker.io/networkboot/dhcpd   latest              52cbff801df2        11 months ago       105 MB

4.刪除鏡像

刪除鏡像的操作有兩種:使用鏡像的標籤刪除鏡像,使用鏡像的ID刪除鏡像。

語法:docker rmi [名稱和標籤]
    或
    docker rmi [鏡像ID號]

如:刪除dhcp:dhcp鏡像

[root@localhost ~]# docker rmi dhcp:dhcp   //刪除dhcp:dhcp
Untagged: dhcp:dhcp
Untagged: docker.io/networkboot/dhcpd@sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477
[root@localhost ~]# docker images  //驗證
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/networkboot/dhcpd   latest              52cbff801df2        11 months ago 

 注:當一個鏡像有多個標籤是,docker rmi命令只是刪除該鏡像多個標籤中的指定標籤,不會影響鏡像文件。相當於只是刪除了鏡像的一個標籤而已但當該鏡像只剩下一個標籤的時候就要小心了,再使用刪除命令就會徹底刪除該鏡像

當使用docker rmi命令後面跟上鏡像的ID號時,必須確保該鏡像沒有被容器使用才能進行,刪除時系統會先刪除掉所有指向該鏡像的標籤,然後刪除該鏡像文件本身。如果該鏡像已經被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像。

5.存出鏡像和載入鏡像

1)存出鏡像

當需要把一臺機器上的鏡像遷移到另一臺機器上時,需要將鏡像保存成本地文件,這一過程叫做存出鏡像,可以使用docker save命令進行存出操作。之後就可以複製該文件到其他機器。

語法:docker save -o 存出鏡像爲本地文件

 如:存出本地的”docker.io/networkboot/dhcpd“鏡像文件爲dhcp

-o後面是存出文件的名稱

[root@localhost ~]# docker save -o dhcp docker.io/networkboot/dhcpd  
[root@localhost ~]# ls -l dhcp
-rw------- 1 root root 107891712 Feb 15 11:01 dhcp

2)載入鏡像 

將存出的鏡像從A機器複製到B機器,需要在B機器上使用該鏡像,就可以將該導出文件導入B機器的鏡像庫中,這一過程叫做載入鏡像。

語法:docker load --input 存出的文件或者docker load < 存出文件

 如:本地文件dhcp載入鏡像到本地本地鏡像庫中:

[root@localhost ~]# docker load --input dhcp
Loaded image: docker.io/networkboot/dhcpd:lates

或者

[root@localhost ~]# docker load < dhcp
Loaded image: docker.io/networkboot/dhcpd:latest

 6.上傳鏡像

需要註冊賬號,就不多說了

    網址:https://hub.docker.com/signup
    註冊成功後
     登錄:
     docker login
      用戶名
      密碼
      上傳鏡像:docker push docker/dhcp:centos7.3

docker容器操作

容器是Docker的另一個核心的概念,簡單來說,容器是鏡像的一個運行實例,是獨立運行的一個或一組應用及他們所必需的運行環境,包括文件系統、系統類庫、shell環境等。鏡像是隻讀模板,而容器會給這個只讀模板提供一個額外的可寫層。

1.容器的創建與啓動

1)創建容器

Docker的創建就是將鏡像加載到容器的過程,Docker的容器十分輕量級,用戶可以隨時創建或者刪除。新創建的容器默認處於停滯狀態,不運行任何程序,需要在其中發起一個進程來啓動容器,這個過程是該容器的唯一進程,所以當該進程結束的時候,容器自然也會停滯。停滯的容器可以重新啓動並保留原來的修改。可以使用“docker create”命令新建一個容器。

語法:docker create [選項]鏡像運行的程序

常用選項:-i:表示讓容器的輸入保持打開;-t表示讓Docker分配一個僞終端 

[root@localhost ~]# docker create -it dhcp:dhcp /bin/bash

如果創建容器命令出現報錯“WARNING:IPV4 forwarding is disable Networking will not work”這樣的信息。這時需要使用修改/usr/lib/sysctl.d/00-system.conf文件,在文件中添加一條“net.ipv4.ip_forward = 1”,然後重啓網絡服務即可。

2)創建完容器之後,可以使用“docker ps”命令查看容器的運行狀態。添加“-a”選項可以列出系統最近一次啓動的容器

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4f27cbe0f850        dhcp:dhcp           "/entrypoint.sh /b..."   4 minutes ago       Created                                 infallible_torvalds

輸出的信息顯示容器的ID號、加載的鏡像、運行的程序、創建時間、目前所處的狀態、端口映射、容器名稱等

其中狀態一欄爲“Created”則表示當前的容器是新創建的並處於停止狀態

3)啓動停止狀態的容器可以使用“docker start ”命令。

[root@localhost ~]# docker start 4f27cbe0f850
4f27cbe0f850
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4f27cbe0f850        dhcp:dhcp           "/entrypoint.sh /b..."   8 minutes ago       Up 45 seconds               
//可以看到爲up,表示啓動了

如果用戶想創建並啓動容器,可以直接執行“docker run”命令。等同於先執行“docker create”命令,再執行“docker start”命令,需要注意只要後面的命令運行結束,容器就會停止

[root@localhost ~]# docker  run networkboot/dhcpd /bin/bash -c ls
//指定一個終端,-c後面是執行的命令
bin
boot
dev
entrypoint.sh
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost ~]# docker ps -a   //查詢
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
e555cebe89ea        networkboot/dhcpd   "/entrypoint.sh /bin…"   47 seconds ago      Exited (0) 46 seconds ago                       heuristic_galileo
//查詢狀態時,Exited爲退出、停止狀態

當利用“docker run”命令來創建容器時,Docker在後臺的標準運行過程是這樣:

  • 檢查本地是否存在指定的鏡像,當鏡像不存在時,會從公有倉庫首先進行下載;
  • 利用鏡像創建並啓動一個容器;
  • 分配一個文件系統給容器;
  • 在只讀的鏡像層外面掛載一層可讀寫層;
  • 從宿主主機配置的網橋接口橋接一個虛擬機接口到容器中;
  • 分配一個地址池中的IP地址給容器;
  • 執行用戶指定的應用程序;
  • 執行完畢後容器將終止運行;

  優勢需要在後臺持續地運行這個容器,就需要讓docker容器在守護形式在後臺進行運行,可以在“docker run”命令之後添加“-d”選項來實現,但是需要注意容器所運行的程序不能結束。

docker run -d dhcp:dhcp /bin/bash -c "while true;do echo ok;done;"
//由鏡像創建容器並運行命令:作爲後臺進程,持續執行(注意:-d代表後臺守護進程)

2.容器的進入

需要進入容器進行相關操作時,可以使用“docker exec”命令進入運行着的容器

語法:docker exec-it 容器id /名稱/bin/bash

其中:-i表示讓容器的輸入保持打開,-t選項表示讓docker分配一個僞終端 //指定容器的ID,使用的shell進入容器中

如:進入id爲4f27cbe0f850的容器裏面

[root@localhost ~]# docker exec  -it 4f27cbe0f850 /bin/bash
root@4f27cbe0f850:/# 
exit //退出

3.容器的導入與導出

  用戶可以將任何一個Docker容器從一臺機器遷移到另一臺機器。在遷移過程中,首先需要將已經創建好的容器導出爲文件,可以使用“docker export”命令實現,無論這個容器是處於運行狀態還是停止狀態均可導出。導出之後可將導出文件傳輸到其他機器,通過相應的導入命令實現容器的遷移.

語法:docker export 容器id /名稱>文件名

 如:導出4f27cbe0f850容器文集爲centos7dhcp

[root@localhost ~]# docker ps -a  //查看
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4f27cbe0f850        dhcp:dhcp           "/entrypoint.sh /b..."   40 minutes ago      Up 32 minutes                           infallible_torvalds
[root@localhost ~]# docker export 4f27cbe0f850 >centos7dhcp
[root@localhost ~]# ls -l centos7dhcp  //查看
-rw-r--r-- 1 root root 87825920 Feb 15 12:06 centos7dhcp

導出的文件從A機器傳輸到B機器,之後使用“docker import”命令導入,成爲鏡像。

語法:cat文件名|docker import -生成的鏡像名稱:標籤

如:導入文件centos7dhcp成爲本地鏡像:

[root@localhost ~]# cat centos7dhcp | docker import - centos7:dhcp
sha256:645089167d002bf53b64b8f1cbb7a2ef73a688580f65b8635ad03afa3df3d906

4.容器的刪除

可以使用“docker rm”命令將一個已經終止狀態的容器進行刪除

語法:docker rm 容器id/名稱

如:刪除4f27cbe0f850的容器

[root@localhost ~]# docker stop 4f27cbe0f850  
4f27cbe0f850
[root@localhost ~]# docker rm 4f27cbe0f850   //刪除4f27cbe0f850容器
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

如果刪除一個正在運行的額容器,可以添加“-f”選項強制刪除,但是建議先將容器停止再進行刪除操作。

Docker默認的存儲目錄在/var/lib/docker,Docker的鏡像、容器、日誌等內容全部都存儲在此,可以單獨使用大容量的分區來存儲這些內容,並且一般選擇建立LVM邏輯卷,從而避免Docker運行過程中存儲目錄容量不足的問題。
 

Docker資源控制 

同一臺主機,運行多臺容器時,會產生搶佔主機硬件資源的現象,如果發生不公平事件會導致部分容器或服務停止運行,所以需要對容器配置資源限制。

Cgroup:(全稱control group),linux內核提供的限制所使用的物理資源的機制(docker之前用的LXC),CPU、內存、blkio(塊文件輸入和輸出)

1..CPU限制

1)查看CPU線程

[root@localhost ~]# cat /proc/stat 

2)多任務按比例分享cpu

當多個容器運行時,很難計算cpu的使用率,爲了使容器合理使用cpu資源,可以通過 --cpu--share選項設置cpu按比例共享cpu資源。

如:運行3個新建容器a,b,c佔用cpu資源的比例爲1:1:2,可以這樣寫

    docker run -tid --cpu-shares 1024 [鏡像a]
    docker run -tid --cpu-shares 1024 [鏡像b]
    docker run -tid --cpu-shares 2048 [鏡像c]

3)限制cpu內核使用

僅用第二和第四顆內核運行鏡像

格式:docker run -tid --cpuset-cpu 1,3 [鏡像名]

docker run -tid  --cpuset-cpus 1,3 centos7:dhcp3

那麼該容器內的進程只會在編號1,3的cpu上運行

2.對內存使用的限制

在docker中可以通過docker run -m 命令來限制容器的內存使用量。但需要注意,一旦容器cgroup使用的內存超過了限制的容量,Linux內核將會嘗試收回這些內存,如果仍舊沒法控制使用內存在限制範圍內,進程就會被殺死。

注:OOME(Out Of Memory Exception:內存異常 ),並且會開啓killing去殺掉一些進程

如:限制 centos7:dhcp4容器的內存上限爲512MB

docker run -tid -m 512MB centos7:dhcp4

3.對blkio(磁盤)的限制

如果在一臺服務器上進行容器混合部署,那麼會存在同時幾個進程寫磁盤數據的情況這時可以通過--device-write-iops選項來限制每秒寫io次數,來限制指定設備實的寫速度。這種方法是能限制設備,不能限制分區。

如:限制新建容器的/dev/sda的寫入速度爲1MB

格式:docker run  -tid  --device-write-bps /dev/sda:1MB [鏡像名]

 

 

發佈了42 篇原創文章 · 獲贊 5 · 訪問量 1374
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章