目錄:
- 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 [鏡像名]