鏡像
鏡像簡(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é)
容器管理
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ù)很輕松的拿到本地目錄探入。
原理圖:
數(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ù)方案
- 創(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ù)的操作提供了充分的支持。