Docker核心技術(shù)(二)

鏡像

鏡像簡(jiǎn)介

Docker鏡像是什么战秋? 鏡像是一個(gè)Docker的可執(zhí)行文件璧亚,其中包括運(yùn)行應(yīng)用程序所需的所有代碼內(nèi)容、依賴庫(kù)脂信、環(huán)境變量和配置文件等癣蟋。通過(guò)鏡像可以創(chuàng)建一個(gè)或多個(gè)容器。

搜索狰闪、查看疯搅、獲取

搜索鏡像

#作用
搜索Docker Hub(鏡像倉(cāng)庫(kù))上的鏡像 
#命令格式: 
docker search [鏡像名稱] 
#命令演示: 
$ docker search ubuntu 
#NAME:名稱 
#DESCRIPTION:基本功能描述 
#STARS:下載次數(shù)
#OFFICIAL:官方 
#AUTOMATED:自動(dòng)的運(yùn)行

獲取鏡像

#作用:
下載遠(yuǎn)程倉(cāng)庫(kù)(如Docker Hub)中的鏡像 
#命令格式: 
docker pull [鏡像名稱] 
#命令演示: 
$ docker pull ubuntu 
$ docker pull nginx 
#注釋?zhuān)?
#獲取的鏡像在哪里? 
#/var/lib/docker 目錄下 #由于權(quán)限的原因我們需要切換root用戶 #那我們首先要重設(shè)置root用戶的密碼: 
:~$ sudo passwd root #這樣就可以設(shè)置root用戶的密碼了埋泵。 #之后就可以自由的切換到root用戶了 
:~$ su #輸入root用戶的密碼即可幔欧。 #當(dāng)然,如果想從root用戶切換回一般用戶秋泄,則可使用 su -val(一般用戶名) #而當(dāng)你再次切回到root用戶琐馆,則只需要鍵入exit,再次輸入exit則回到最初的用戶下 #操作下面的文件可以查看相關(guān)的鏡像信息 
:~$ vim /var/lib/docker/image/overlay2/repositories.json

查看鏡像

#作用:列出本地鏡像 
#命令格式: 
docker images [鏡像名稱] 
docker image ls [鏡像名稱] 
#命令演示: $ docker images #鏡像的ID唯一標(biāo)識(shí)了鏡像,如果ID相同,說(shuō)明是同一鏡像恒序。TAG信息來(lái)區(qū)分不同發(fā)行版本瘦麸,如果不指定具體標(biāo)記, 默認(rèn)使用latest標(biāo)記信息 
#docker images -a 列出所有的本地的images(包括已刪除的鏡像記錄) #REPOSITORY:鏡像的名稱 
#TAG :鏡像的版本標(biāo)簽 
#IMAGE ID:鏡像id 
#CREATED:鏡像是什么時(shí)候創(chuàng)建的 
#SIZE:大小

重命名、刪除

鏡像重命名

#作用:
對(duì)本地鏡像的NAME歧胁、TAG進(jìn)行重命名滋饲,并新產(chǎn)生一個(gè)命名后鏡像 
#命令格式: 
docker tag [老鏡像名稱]:[老鏡像版本][新鏡像名稱]:[新鏡像版本] 
#命令演示: 
$ docker tag nginx:latest panda-nginx:v1.0

刪除鏡像

#作用:
將本地的一個(gè)或多個(gè)鏡像刪除 
#命令格式: 
docker rmi [命令參數(shù)][鏡像ID] 
docker rmi [命令參數(shù)][鏡像名稱]:[鏡像版本] 
docker image rm [命令參數(shù)][鏡像] 
#命令演示: 
$docker rmi 3fa822599e10 
$docker rmi mysql:latest #注意: 如果一個(gè)image_id存在多個(gè)名稱厉碟,那么應(yīng)該使用 名稱:版本 的格式刪除鏡像 
#命令參數(shù)(OPTIONS): 
-f, --force 強(qiáng)制刪除

導(dǎo)出、導(dǎo)入

導(dǎo)出鏡像

將已經(jīng)下載好的鏡像屠缭,導(dǎo)出到本地箍鼓,以備后用。

#作用:
將本地的一個(gè)或多個(gè)鏡像打包保存成本地tar文件 #命令格式: 
docker save [命令參數(shù)][導(dǎo)出鏡像名稱][本地鏡像鏡像] #命令參數(shù)(OPTIONS): 
-o, --output string 指定寫(xiě)入的文件名和路徑 #導(dǎo)出鏡像
:~$ docker save -o nginx.tar nginx 

導(dǎo)入鏡像

#作用:
將save命令打包的鏡像導(dǎo)入本地鏡像庫(kù)中 #導(dǎo)入鏡像命令格式: 
$ docker load [命令參數(shù)][被導(dǎo)入鏡像壓縮文件的名稱] $ docker load < [被導(dǎo)入鏡像壓縮文件的名稱] 
$ docker load --input [被導(dǎo)入鏡像壓縮文件的名稱] #命令參數(shù)(OPTIONS): 
-i, --input string指定要打入的文件呵曹,如沒(méi)有指定款咖,默認(rèn)是STDIN 
#為了更好的演示效果,我們先將nginx的鏡像刪除掉 docker rmi nginx:v1.0 
docker rmi nginx 
#導(dǎo)入鏡像文件: 
$ docker load < nginx.tar
#注意:
如果發(fā)現(xiàn)導(dǎo)入的時(shí)候沒(méi)有權(quán)限需要使用chmod命令修改鏡像文件的權(quán)限 

歷史奄喂、創(chuàng)建

查看鏡像歷史

#作用:
查看本地一個(gè)鏡像的歷史(歷史分層)信息 #查看鏡像命令格式: 
docker history [鏡像名稱]:[鏡像版本] docker history [鏡像ID] #我們獲取到一個(gè)鏡像铐殃,想知道他默認(rèn)啟動(dòng)了哪些命令或者都封裝了哪些系統(tǒng)層,那么我們可以使用docker history這條命令來(lái)獲取我們想要的信息 
$ docker history sswang-nginx:v1.0 
#IMAGE:編號(hào) 
#CREATED:創(chuàng)建的 
#CREATED BY :基于那些命令創(chuàng)建的 
#SIZE:大小 
#COMMENT:評(píng)論

鏡像詳細(xì)信息

#作用:
查看本地一個(gè)或多個(gè)鏡像的詳細(xì)信息 
#命令格式: 
$ docker image inspect [命令參數(shù)] [鏡像名稱]:[鏡像版本] 
$ docker inspect [命令參數(shù)] [鏡像ID] #查看鏡像詳細(xì)信息: 
$ docker inspect nginx 

根據(jù)模板創(chuàng)建鏡像

#登錄系統(tǒng)模板鏡像網(wǎng)站:
#https://download.openvz.org/template/precreated/ #找到一個(gè)鏡像模板進(jìn)行下載跨新,比如說(shuō)ubuntu-16.04-x86_64.tar.gz富腊,地址為:
#https://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz 
#命令格式:
cat 模板文件名.tar | docker import - [自定義鏡像名] 
#演示效果: 
$ cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu-mini

總結(jié)

4.png

容器管理

docker容器技術(shù)指Docker是一個(gè)由GO語(yǔ)言寫(xiě)的程序運(yùn)行的“容器”(Linux containers, LXCs)

containers的中文解釋是集裝箱域帐。

Docker則實(shí)現(xiàn)了一種應(yīng)用程序級(jí)別的隔離赘被,它改變我們基本的開(kāi)發(fā)、操作單元肖揣,由直接操作虛擬主機(jī)(VM),轉(zhuǎn)換到操作程序運(yùn)行的“容器”上來(lái)民假。

容器簡(jiǎn)介

容器是什么?

容器(Container):容器是一種輕量級(jí)许饿、可移植阳欲、并將應(yīng)用程序進(jìn)行的打包的技術(shù),使應(yīng)用程序可以在幾乎任何
地方以相同的方式運(yùn)行

  • Docker將鏡像文件運(yùn)行起來(lái)后陋率,產(chǎn)生的對(duì)象就是容器球化。容器相當(dāng)于是鏡像運(yùn)行起來(lái)的一個(gè)實(shí)例。
  • 容器具備一定的生命周期瓦糟。
  • 另外筒愚,可以借助docker ps命令查看運(yùn)行的容器,如同在linux上利用ps命令查看運(yùn)行著的進(jìn)程那樣菩浙。

我們就可以理解容器就是被封裝起來(lái)的進(jìn)程操作,只不過(guò)現(xiàn)在的進(jìn)程可以簡(jiǎn)單也可以復(fù)雜,復(fù)雜的話可以運(yùn)行1個(gè)操作系統(tǒng).簡(jiǎn)單的話可以運(yùn)行1個(gè)回顯字符串.

容器與虛擬機(jī)的相同點(diǎn)

  • 容器和虛擬機(jī)一樣巢掺,都會(huì)對(duì)物理硬件資源進(jìn)行共享使用。
  • 容器和虛擬機(jī)的生命周期比較相似(創(chuàng)建劲蜻、運(yùn)行陆淀、暫停、關(guān)閉等等)先嬉。
  • 容器中或虛擬機(jī)中都可以安裝各種應(yīng)用轧苫,如redis、mysql疫蔓、nginx等含懊。也就是說(shuō)身冬,在容器中的操作,如同在一個(gè)虛擬機(jī)(操作系統(tǒng))中操作一樣岔乔。
  • 同虛擬機(jī)一樣酥筝,容器創(chuàng)建后,會(huì)存儲(chǔ)在宿主機(jī)上:linux上位于/var/lib/docker/containers下

容器與虛擬機(jī)的不同點(diǎn)

注意:容器并不是虛擬機(jī)雏门,但它們有很多相似的地方

  • 虛擬機(jī)的創(chuàng)建嘿歌、啟動(dòng)和關(guān)閉都是基于一個(gè)完整的操作系統(tǒng)。一個(gè)虛擬機(jī)就是一個(gè)完整的操作系統(tǒng)茁影。而容器直接運(yùn)
    行在宿主機(jī)的內(nèi)核上搅幅,其本質(zhì)上以一系列進(jìn)程的結(jié)合。
  • 容器是輕量級(jí)的呼胚,虛擬機(jī)是重量級(jí)的。
    首先容器不需要額外的資源來(lái)管理息裸,虛擬機(jī)額外更多的性能消耗蝇更;
    其次創(chuàng)建、啟動(dòng)或關(guān)閉容器呼盆,如同創(chuàng)建年扩、啟動(dòng)或者關(guān)閉進(jìn)程那么輕松,而創(chuàng)建访圃、啟動(dòng)厨幻、關(guān)閉一個(gè)操作系統(tǒng)就沒(méi)那么方便了。
  • 也因此腿时,意味著在給定的硬件上能運(yùn)行更多數(shù)量的容器况脆,甚至可以直接把Docker運(yùn)行在虛擬機(jī)上。

查看批糟、創(chuàng)建格了、啟動(dòng)

查看容器

#作用顯示docker容器列表 
#命令格式: 
docker ps 
#命令演示: 
$ docker ps 
#CONTAINER ID 容器ID 
#IMAGE 基于那個(gè)鏡像 
#COMMAND 運(yùn)行鏡像使用了哪些命令? #CREATED多久前創(chuàng)建時(shí)間 
#STATUS 開(kāi)啟還是關(guān)閉 
#PORTS端口號(hào) 
#NAMES容器名稱默認(rèn)是隨機(jī)的 
#注意: 
管理docker容器可以通過(guò)名稱徽鼎,也可以通過(guò)ID

ps是顯示正在運(yùn)行的容器
-a是顯示所有運(yùn)行過(guò)的容器盛末,包括已經(jīng)不運(yùn)行的容器

創(chuàng)建待啟動(dòng)容器

#作用:
利用鏡像創(chuàng)建出一個(gè)Created 狀態(tài)的待啟動(dòng)容器 #命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create [參數(shù)命令] 依賴鏡像 [容器內(nèi)命令] [命令參數(shù)] 
#命令參數(shù)(OPTIONS):
-t, --tty 分配一個(gè)偽TTY,也就是分配虛擬終端 
-i, --interactive 即使沒(méi)有連接否淤,也要保持STDIN打開(kāi)
--name 為容器起名悄但,如果沒(méi)有指定將會(huì)隨機(jī)產(chǎn)生一個(gè)名稱 
#命令參數(shù)(COMMAND\ARG): 
COMMAND 表示容器啟動(dòng)后,需要在容器中執(zhí)行的命令石抡,如ps檐嚣、ls 等命令 
ARG 表示執(zhí)行 COMMAND 時(shí)需要提供的一些參數(shù),如ps 命令的 aux汁雷、ls命令的-a等等
#創(chuàng)建容器(附上ls命令和a參數(shù))
docker create -it --name ubuntu-1 ubuntu ls -a 

啟動(dòng)容器

啟動(dòng)容器有三種方式

  • 啟動(dòng)待啟動(dòng)或已關(guān)閉容器
  • 基于鏡像新建一個(gè)容器并啟動(dòng)
  • 守護(hù)進(jìn)程方式啟動(dòng)docker

啟動(dòng)容器

#作用:
將一個(gè)或多個(gè)處于創(chuàng)建狀態(tài)或關(guān)閉狀態(tài)的容器啟動(dòng)起來(lái) #命令格式: 
docker start [容器名稱]或[容器ID] #命令參數(shù)(OPTIONS): 
-a, --attach 將當(dāng)前shell的 STDOUT/STDERR 連接到容器上 
-i, --interactive 將當(dāng)前shell的 STDIN連接到容器上
#啟動(dòng)上面創(chuàng)建的容器 
docker start -a ubuntu-1 

創(chuàng)建新容器并啟動(dòng)

#作用:
利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器 
#命令格式: 
docker run [命令參數(shù)] [鏡像名稱][執(zhí)行的命令] 命令參數(shù)(OPTIONS):
-t, --tty 分配一個(gè)偽TTY净嘀,也就是分配虛擬終端 
-i, --interactive 即使沒(méi)有連接报咳,也要保持STDIN打開(kāi)
--name 為容器起名,如果沒(méi)有指定將會(huì)隨機(jī)產(chǎn)生一個(gè)名稱 
-d, --detach 在后臺(tái)運(yùn)行容器并打印出容器ID 
--rm 當(dāng)容器退出運(yùn)行后挖藏,自動(dòng)刪除容器
#啟動(dòng)一個(gè)鏡像輸出內(nèi)容并刪除容器 
$ docker run --rm --name nginx1 nginx /bin/echo "hello docker"
#注意: 
docker run 其實(shí) 是兩個(gè)命令的集合體 docker create + docker start

守護(hù)進(jìn)程方式啟動(dòng)容器<常用的方式>

更多的時(shí)候暑刃,需要讓Docker容器在后臺(tái)以守護(hù)形式運(yùn)行。此時(shí)可以通過(guò)添加-d參數(shù)來(lái)實(shí)現(xiàn)

#命令格式: 
docker run -d [image_name] command ... #守護(hù)進(jìn)程方式啟動(dòng)容器: 
:~$ docker run -d nginx 

暫停與取消暫停與重啟

容器暫停

#作用:
暫停一個(gè)或多個(gè)處于運(yùn)行狀態(tài)的容器 
#命令格式: 
docker pause [容器名稱]或[容器ID] 
#暫停容器 
docker pause a229eabf1f32 

容器取消暫停

#作用:
取消一個(gè)或多個(gè)處于暫停狀態(tài)的容器膜眠,恢復(fù)運(yùn)行
#命令格式: 
docker unpause [容器名稱]或[容器ID] 
#恢復(fù)容器 
docker unpause a229eabf1f32 

重啟

#作用:
重啟一個(gè)或多個(gè)處于運(yùn)行狀態(tài)岩臣、暫停狀態(tài)、關(guān)閉狀態(tài)或者新建狀態(tài)的容器
該命令相當(dāng)于stop和start命令的結(jié)合 
#命令格式: 
docker restart [容器名稱]或[容器ID]
#命令參數(shù)(OPTIONS):
-t, --time int 重啟前宵膨,等待的時(shí)間架谎,單位秒(默認(rèn) 10s) 
#恢復(fù)容器 
docker restart -t 20 a229eabf1f32 12345678910

關(guān)閉、終止辟躏、刪除

關(guān)閉容器

在生產(chǎn)中谷扣,我們會(huì)以為臨時(shí)情況,要關(guān)閉某些容器捎琐,我們使用 stop 命令來(lái)關(guān)閉某個(gè)容器

#作用:
延遲關(guān)閉一個(gè)或多個(gè)處于暫停狀態(tài)或者運(yùn)行狀態(tài)的容器
#命令格式: 
docker stop [容器名稱]或[容器ID] 
#關(guān)閉容器: 
$ docker stop 8005c40a1d16 

中止容器

#作用:
強(qiáng)制并立即關(guān)閉一個(gè)或多個(gè)處于暫停狀態(tài)或者運(yùn)行狀態(tài)的容器 
#命令格式: 
docker kill [容器名稱]或[容器ID] 
#終止容器 
$ docker kill 8005c40a1d16 

刪除容器

刪除容器有三種方法: 正常刪除 -- 刪除已關(guān)閉的

強(qiáng)制刪除 -- 刪除正在運(yùn)行的

強(qiáng)制批量刪除 -- 刪除全部的容器

正常刪除容器

#作用:
刪除一個(gè)或者多個(gè)容器 
#命令格式: 
$ docker rm [容器名稱]或[容器ID]
#刪除已關(guān)閉的容器: 
$ docker rm 1a5f6a0c9443

Error response from daemon: You cannot remove a running container c7f5e7fe5aca00e0cb987d486dab3502ac93d7180016cfae9ddcc64e56149fc9. Stop the container before attempting removal or force remove
錯(cuò)誤響應(yīng)守護(hù)進(jìn)程:你不能刪除一個(gè)容器
c7f5e7fe5aca00e0cb987d486dab3502ac93d7180016cfae9ddcc64e56149fc9運(yùn)行会涎。
在嘗試拆卸或強(qiáng)制拆 卸之前,先停止容器瑞凑。

強(qiáng)制刪除運(yùn)行容器

#作用:
強(qiáng)制刪除一個(gè)或者多個(gè)容器 
#命令格式: 
docker rm -f [容器名稱]或[容器ID]
#刪除正在運(yùn)行的容器 
$ docker rm -f 8005c40a1d16

拓展批量關(guān)閉容器

#作用:
批量強(qiáng)制刪除一個(gè)或者多個(gè)容器 
#命令格式: 
$ docker rm -f $(docker ps -a -q)
#按照?qǐng)?zhí)行順序$()末秃, 獲取到現(xiàn)在容器的id然后進(jìn)行刪除

進(jìn)入、退出

進(jìn)入容器我們學(xué)習(xí)三種方法:

  • 創(chuàng)建容器的同時(shí)進(jìn)入容器
  • 手工方式進(jìn)入容器
  • 生產(chǎn)方式進(jìn)入容器

創(chuàng)建并進(jìn)入容器

#命令格式: 
docker run --name [container_name] -it [docker_image] /bin/bash 
#命令演示: 
$ docker run -it --name panda-nginx nginx /bin/bash 
#進(jìn)入容器后 root@7c5a24a68f96:/
# echo "hello world" hello world root@7c5a24a68f96:/
# exit exit 
#docker 容器啟動(dòng)命令參數(shù)詳解:
#--name:給容器定義一個(gè)名稱
#-i:則讓容器的標(biāo)準(zhǔn)輸入保持打開(kāi)籽御。
#-t:讓docker分配一個(gè)偽終端,并綁定到容器的標(biāo)準(zhǔn)輸入上 
#/bin/bash:執(zhí)行一個(gè)命令 

退出容器

#方法一: 
exit 
#方法二: 
Ctrl + D 

手工方式進(jìn)入容器

#命令格式: 
docker exec -it 容器id /bin/bash 
#效果演示: 
$ docker exec -it d74fff341687 /bin/bash 

生產(chǎn)方式進(jìn)入容器

我們生產(chǎn)中常用的進(jìn)入容器方法是使用腳本练慕,腳本內(nèi)容如下

#!/bin/bash 
#定義進(jìn)入倉(cāng)庫(kù)函數(shù) 
docker_in(){ 
    NAME_ID=$1
    PID=$(docker inspect --format {{.State.Pid}} $NAME_ID) 
    nsenter --target $PID --mount --uts --ipc --net --pid 
}
docker_in $1 

直接執(zhí)行的話是沒(méi)有執(zhí)行權(quán)限的所以需要賦值權(quán)限

#賦權(quán)執(zhí)行 
$ chmod +x docker_in.sh 
#進(jìn)入指定的容器,并測(cè)試
$ ./docker_in.sh b3fbcba852fd

注意:當(dāng)拷貝到linux下的時(shí)候會(huì)出現(xiàn)

-bash: ./docker_in.sh: /bin/bash^M: 解釋器錯(cuò)誤: 沒(méi)有那個(gè)文件或目錄這個(gè)問(wèn)題大多數(shù)是因?yàn)槟愕哪_本文件在windows下編輯過(guò)技掏。windows下铃将,每一行的結(jié)尾是\n\r,而在linux下文件的結(jié)尾是\n哑梳,那么你在windows下編輯過(guò)的文件在linux下打開(kāi)看的時(shí)候每一行的結(jié)尾就會(huì)多出來(lái)一個(gè)字符\r,用cat -A docker_in.sh時(shí)你可以看到這個(gè)\r字符被顯示為^M麸塞,這時(shí)候只需要?jiǎng)h除這個(gè)字符就可以了〗а茫可以使用命令 sed -i 's/\r$//' docker_in.sh

基于容器創(chuàng)建鏡像

方式一:

#命令格式: 
docker commit -m '改動(dòng)信息' -a "作者信息" [container_id][new_image:tag] 
#命令演示: 
#進(jìn)入一個(gè)容器侵歇,創(chuàng)建文件后并退出:
$ ./docker_in.sh d74fff341687 
$ mkdir /hello 
$ mkdir /world 
$ ls 
$ exit 
#創(chuàng)建一個(gè)鏡像: 
$ docker commit -m 'mkdir /hello /world ' -a "panda" d74fff341687 nginx:v0.2 
#查看鏡像: 
$ docker images 
#啟動(dòng)一個(gè)容器 
$ docker run -itd nginx:v0.2 /bin/bash
#進(jìn)入容器進(jìn)行查看 
$ ./docker_in.sh ae63ab299a84 
$ ls 

方式二:

#命令格式: 
docker export [容器id] > 模板文件名.tar
#命令演示: 
#創(chuàng)建鏡像: 
$ docker export ae63ab299a84 > nginx.tar
#導(dǎo)入鏡像: 
$ cat nginx.tar | docker import - panda-test

導(dǎo)出(export)導(dǎo)入(import)與保存(save)加載(load)的恩怨情仇

import與load的區(qū)別:

import可以重新指定鏡像的名字字柠,docker load不可以

export 與 保存 save 的區(qū)別:

1账锹、export導(dǎo)出的鏡像文件大小淳蔼,小于 save保存的鏡像。

2撤嫩、export 導(dǎo)出(import導(dǎo)入)是根據(jù)容器拿到的鏡像偎捎,再導(dǎo)入時(shí)會(huì)丟失鏡像所有的歷史。


日志、信息茴她、端口寻拂、重命名

查看容器運(yùn)行日志

#命令格式: 
docker logs [容器id] 
#命令效果:
$ docker logs 7c5a24a68f96 

查看容器詳細(xì)信息

#命令格式:
docker inspect [容器id] 
#命令效果: 
查看容器全部信息: 
$ docker inspect 930f29ccdf8a 
查看容器網(wǎng)絡(luò)信息: 
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 930f29ccdf8a

查看容器端口信息

#命令格式: 
docker port [容器id] 
#命令效果: 
$ docker port 930f29ccdf8a
#沒(méi)有效果沒(méi)有和宿主機(jī)關(guān)聯(lián)

容器重命名

#作用:
修改容器的名稱
#命令格式: 
docker rename [容器id]或[容器名稱] [容器新名稱]
#命令效果: 
$ docker rename 930f29ccdf8a u1 

數(shù)據(jù)管理

生產(chǎn)環(huán)境使用Docker的過(guò)程中,往往需要對(duì)數(shù)據(jù)進(jìn)行持久化保存丈牢,或者需要更多容器之間進(jìn)行數(shù)據(jù)共享祭钉,那我們需要怎么要的操作呢?

答案就是:數(shù)據(jù)卷(DataVolumes)和數(shù)據(jù)卷容器(Data Volume Containers)

數(shù)據(jù)卷簡(jiǎn)介

什么是數(shù)據(jù)卷己沛?

就是將宿主機(jī)的某個(gè)目錄慌核,映射到容器中,作為數(shù)據(jù)存儲(chǔ)的目錄申尼,我們就可以在宿主機(jī)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)
數(shù)據(jù)卷(Data Volumes):容器內(nèi)數(shù)據(jù)直接映射到本地主機(jī)環(huán)境

數(shù)據(jù)卷特性
  • 數(shù)據(jù)卷可以在容器之間共享和重用垮卓,本地與容器間傳遞數(shù)據(jù)更高效;
  • 對(duì)數(shù)據(jù)卷的修改會(huì)立馬有效师幕,容器內(nèi)部與本地目錄均可粟按;
  • 對(duì)數(shù)據(jù)卷的更新,不會(huì)影響鏡像霹粥,對(duì)數(shù)據(jù)與應(yīng)用進(jìn)行了解耦操作钾怔;
  • 卷會(huì)一直存在,直到?jīng)]有容器使用蒙挑。

docker 數(shù)據(jù)卷命令詳解

:~$ docker run --help 
-v, --volume list Bind mount a volume (default []) 
掛載一個(gè)數(shù)據(jù)卷,默認(rèn)為空 

我們可以使用命令 docker run用來(lái)創(chuàng)建容器愚臀,可以在使用docker run 命令時(shí)添加-v 參數(shù)忆蚀,就可以創(chuàng)建并掛載一個(gè)到多個(gè)數(shù)據(jù)卷到當(dāng)前運(yùn)行的容器中。 -v參數(shù)的作用是將宿主機(jī)的一個(gè)目錄作為容器的數(shù)據(jù)掛載到docker容器中姑裂,使宿主機(jī)和容器之間可以共享一個(gè) 目錄馋袜,如果本地路徑不存在,Docker也會(huì)自動(dòng)創(chuàng)建舶斧。

數(shù)據(jù)卷實(shí)踐

關(guān)于數(shù)據(jù)卷的管理我們從兩個(gè)方面來(lái)說(shuō):

  • 目錄
  • 普通文件

數(shù)據(jù)卷實(shí)踐之目錄

#命令格式: 
docker run -itd --name [容器名字] -v [宿主機(jī)目錄](méi):[容器目錄](méi)[鏡像名稱] [命令(可選)]
#命令演示: 
#創(chuàng)建測(cè)試文件: 
$ echo "file1" > tmp/file1.txt
#啟動(dòng)一個(gè)容器欣鳖,掛載數(shù)據(jù)卷: 
$ docker run -itd --name test1 -v /home/itcast/tmp/:/test1/ nginx
#注意宿主機(jī)目錄需要絕對(duì)路徑 
#測(cè)試效果
$ docker exec -it a53c61c77 /bin/bash root@a53c61c77bde:/# cat /test1/file1.txt file1

數(shù)據(jù)卷實(shí)踐 之 文件{不推薦}

#命令格式: 
docker run -itd --name [容器名字] -v [宿主機(jī)文件]:[容器文件][鏡像名稱] [命令(可選)]
#命令演示: 
#創(chuàng)建測(cè)試文件 
$ echo "file1" > /tmp/file1.txt
#啟動(dòng)一個(gè)容器,掛載數(shù)據(jù)卷
$ docker run -itd --name test2 -v /home/itcast/tmp/file1.txt:/nihao/nihao.sh nginx
#測(cè)試效果 
:~$ docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh 
file1 

注意:

  • Docker掛載數(shù)據(jù)卷的默認(rèn)讀寫(xiě)權(quán)限(rw)茴厉,用戶可以通過(guò)ro設(shè)置為只讀 格式:[宿主機(jī)文件]:[容器文件]:ro
  • 如果直接掛載一個(gè)文件到容器泽台,使用文件工具進(jìn)行編輯,可能會(huì)造成文件的改變矾缓,從Docker1.1.0起怀酷,這會(huì)導(dǎo)致 報(bào)錯(cuò)誤信息。所以推薦的方式是直接掛在文件所在的目錄嗜闻。

數(shù)據(jù)卷容器簡(jiǎn)介

什么是數(shù)據(jù)卷容器蜕依? 需要在多個(gè)容器之間共享一些持續(xù)更新的數(shù)據(jù),最簡(jiǎn)單的方式是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器也是一個(gè)容器样眠,但是它的目的是專(zhuān)門(mén)用來(lái)提供數(shù)據(jù)卷供其他容器掛載友瘤。數(shù)據(jù)卷容器(Data VolumeContainers):使用特定容器維護(hù)數(shù)據(jù)卷簡(jiǎn)單點(diǎn):數(shù)據(jù)卷容器就是為其他容器提供數(shù)據(jù)交互存儲(chǔ)的容器

docker 數(shù)據(jù)卷命令詳解

:~$ docker run --help 
。檐束。辫秧。 
-v, --volumes-from list Mount volumes from the specified container(s) (default[])
#從指定的容器掛載卷,默認(rèn)為空

數(shù)據(jù)卷容器操作流程

如果使用數(shù)據(jù)卷容器厢塘,在多個(gè)容器間共享數(shù)據(jù)茶没,并永久保存這些數(shù)據(jù),需要有一個(gè)規(guī)范的流程才能做得到:

  • 創(chuàng)建數(shù)據(jù)卷容器
  • 其他容器掛載數(shù)據(jù)卷容器

注意: 數(shù)據(jù)卷容器自身并不需要啟動(dòng)晚碾,但是啟動(dòng)的時(shí)候依然可以進(jìn)行數(shù)據(jù)卷容器的工作抓半。

數(shù)據(jù)卷容器實(shí)踐

數(shù)據(jù)卷容器實(shí)踐包括兩部分:創(chuàng)建數(shù)據(jù)卷容器和使用數(shù)據(jù)卷容器

創(chuàng)建一個(gè)數(shù)據(jù)卷容器

#命令格式: 
docker create -v [容器數(shù)據(jù)卷目錄](méi) --name [容器名字][鏡像名稱] [命令(可選)]
#執(zhí)行效果 
$ docker create -v /data --name v1-test1 nginx

創(chuàng)建兩個(gè)容器,同時(shí)掛載數(shù)據(jù)卷容器

#命令格式:
docker run --volumes-from [數(shù)據(jù)卷容器id/name] -tid --name [容器名字][鏡像名稱] [命令(可 選)]
#執(zhí)行效果: 
#創(chuàng)建 vc-test1 容器: 
docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash 
#創(chuàng)建 vc-test2 容器: 
docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash

確認(rèn)卷容器共享

#進(jìn)入vc-test1格嘁,操作數(shù)據(jù)卷容器: 
:~$ docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt 
root@c408f4f14786:/# exit
#進(jìn)入vc-test2笛求,確認(rèn)數(shù)據(jù)卷: 
:~$ docker exec -it vc-test2 /bin/bash
root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt 
root@7448eee82ab0:/# ls /data/ 
v-test1.txt
root@7448eee82ab0:/# exit 
#回到vc-test1進(jìn)行驗(yàn)證 
:~$ docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/ 
v-test1.txt v-test2.txt 
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2 

數(shù)據(jù)備份原理

為什么需要數(shù)據(jù)備份和恢復(fù)? 工作中很多的容器的數(shù)據(jù)需要查看糕簿,所有需要備份將數(shù)據(jù)很輕松的拿到本地目錄探入。
原理圖:


5.png

數(shù)據(jù)備份方案:

  • 創(chuàng)建一個(gè)掛載數(shù)據(jù)卷容器的容器
  • 掛載宿主機(jī)本地目錄作為備份數(shù)據(jù)卷
  • 將數(shù)據(jù)卷容器的內(nèi)容備份到宿主機(jī)本地目錄掛載的數(shù)據(jù)卷中
  • 完成備份操作后銷(xiāo)毀剛創(chuàng)建的容器

數(shù)據(jù)備份實(shí)踐

#命令格式:
$ docker run --rm --volumes-from [數(shù)據(jù)卷容器id/name] -v [宿主機(jī)目錄](méi):[容器目錄](méi)[鏡像名稱] [備份命令]
#命令演示: 
#創(chuàng)建備份目錄: 
$ mkdir /backup/ 
#創(chuàng)建備份的容器: 
$ docker run --rm --volumes-from 60205766d61a -v /home/itcast/backup/:/backup/ nginx tar zcPf /backup/data.tar.gz /data 
#驗(yàn)證操作: 
$ ls /backup 
$ zcat /backup/data.tar.gz

注釋: -P:使用原文件的原來(lái)屬性(屬性不會(huì)依據(jù)使用者而變),恢復(fù)字段到它們的原始方式懂诗,忽略現(xiàn)有的用戶權(quán)限屏蔽位(umask)蜂嗽。加了-p之后,tar進(jìn)行解壓后殃恒,生成的文件的權(quán)限植旧,是直接取自tar包里面文件的權(quán)限(不會(huì)再使用該用戶的umask值進(jìn)行運(yùn)算),那么不加-p參數(shù)离唐,將還要再減去umask的值(位運(yùn)算的減)病附,但是如果使用root用戶進(jìn)行操作,加不加-p參數(shù)都一樣亥鬓。

數(shù)據(jù)還原原理

原理圖:
數(shù)據(jù)恢復(fù)方案


6.png
  • 創(chuàng)建一個(gè)新的數(shù)據(jù)卷容器(或刪除原數(shù)據(jù)卷容器的內(nèi)容)
  • 創(chuàng)建一個(gè)新容器完沪,掛載數(shù)據(jù)卷容器,同時(shí)掛載本地的備份目錄作為數(shù)據(jù)卷
  • 將要恢復(fù)的數(shù)據(jù)解壓到容器中
  • 完成還原操作后銷(xiāo)毀剛創(chuàng)建的容器

數(shù)據(jù)還原實(shí)踐

#命令格式: 
docker run --rm -itd --volumes-from [數(shù)據(jù)要到恢復(fù)的容器] -v [宿主機(jī)備份目錄](méi):[容器備份目錄](méi) [鏡像名稱] [解壓命令] 
#命令實(shí)踐: 
#啟動(dòng)數(shù)據(jù)卷容器
$ docker start c408f4f14786 
#刪除源容器內(nèi)容: 
$ docker exec -it vc-test1 bash root@c408f4f14786:/# rm -rf /data/* 
#恢復(fù)數(shù)據(jù): 
docker run --rm --volumes-from v-test -v /home/itcast/backup/:/backup/ nginx tar xPf /backup/data.tar.gz -C /data 
#驗(yàn)證:
:~$ docker exec -it vc-test1/bin/bash
root@c408f4f14786:/# ls /data/data/ 
v-test1.txt v-test2.txt 
#新建新的數(shù)據(jù)卷容器: 
:~$ docker create -v /newdata --name v-test2 nginx 
#簡(jiǎn)歷新的容器掛載數(shù)據(jù)卷容器
:~$ docker run --volumes-from a7e9a33f3acb -tid --name vc-test3 nginx /bin/bash 
#恢復(fù)數(shù)據(jù): 
docker run --rm --volumes-from v-test2 -v /home/itcast/backup/:/backup/ nginx tar xPf /backup/data.tar.gz -C /newdata 
#驗(yàn)證: 
:~$ docker exec -it vc-test3 /bin/bash
root@c408f4f14786:/
# ls /newdata 
v-test1.txt v-test2.txt 

注意: 解壓的時(shí)候嵌戈,如果使用目錄的話覆积,一定要在解壓的時(shí)候使用 -C制定掛載的數(shù)據(jù)卷容器,不然的話容器數(shù)據(jù)是無(wú)法恢復(fù)的熟呛,因?yàn)槿萜髦心J(rèn)的backup目錄不是數(shù)據(jù)卷技健,即使解壓后,也看不到文件惰拱。數(shù)據(jù)是最寶貴的資源雌贱,docker在設(shè)計(jì)上考慮到了這點(diǎn)啊送,并且為數(shù)據(jù)的操作提供了充分的支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欣孤,一起剝皮案震驚了整個(gè)濱河市馋没,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌降传,老刑警劉巖篷朵,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異婆排,居然都是意外死亡声旺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)段只,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腮猖,“玉大人,你說(shuō)我怎么就攤上這事赞枕〕喝保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵炕婶,是天一觀的道長(zhǎng)姐赡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)柠掂,這世上最難降的妖魔是什么项滑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮涯贞,結(jié)果婚禮上枪狂,老公的妹妹穿的比我還像新娘。我一直安慰自己肩狂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布姥饰。 她就那樣靜靜地躺著傻谁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪列粪。 梳的紋絲不亂的頭發(fā)上审磁,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音岂座,去河邊找鬼态蒂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛费什,可吹牛的內(nèi)容都是我干的钾恢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘩蚪!你這毒婦竟也來(lái)了泉懦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疹瘦,失蹤者是張志新(化名)和其女友劉穎崩哩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體言沐,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邓嘹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了险胰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汹押。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸯乃,靈堂內(nèi)的尸體忽然破棺而出鲸阻,到底是詐尸還是另有隱情,我是刑警寧澤缨睡,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布鸟悴,位于F島的核電站,受9級(jí)特大地震影響奖年,放射性物質(zhì)發(fā)生泄漏细诸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一陋守、第九天 我趴在偏房一處隱蔽的房頂上張望震贵。 院中可真熱鬧,春花似錦水评、人聲如沸猩系。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寇甸。三九已至,卻和暖如春疗涉,著一層夾襖步出監(jiān)牢的瞬間拿霉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工咱扣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绽淘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓闹伪,卻偏偏與公主長(zhǎng)得像沪铭,于是被迫代替她去往敵國(guó)和親壮池。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容