docker数据卷之持久化操作
docker
Docker三大核心組件:(運行起來的鏡像就可以稱作容器)
- Docker 鏡像--Dcoker images:類比與類
- Docker 倉庫--Docker registeries:
- Docker 容器-- Dcoker conrainers:類比于實例化的對象
倉庫(registry)--repo(Repository)-->鏡像(按版本區分)
- 共有庫
- docker.io
- 私有庫
yum庫-->不同repo-->軟件(按名字區分)
docker底層原理
Docker是一個c/s架構的系統,Docker守護進程運行在主機上,然后通過Socket連接從客戶端訪問,守護進程從客戶端接收命令并管理運行在主機上帝額容器。容器,是一個運行環境,就是我們前面說的集裝箱。
為什么比虛擬機快
- docker有著比虛擬機更少的抽象層,由于docker不需要實現硬件資源虛擬化。
- 運行在docker容器上的程序是直接使用的都是實際物理機上的硬件資源。因此在cpu、內存利用率上docker將會在效率上有明顯優勢。
- docker利用的是宿主機的內核,而不需要客戶端OS。因此,當新建一個容器時,docker不需要虛擬機易楊重新加載一個操作系統內核。從而避免引尋、加載做操系統內核所返回這個比較浪費時間資源的過程。而新建虛擬機,虛擬機軟件需要加載GuestOS,返回新建過程是分鐘級別。docker由于直接利用宿主機的操作系統,省略了這個過程,因此docker容器只需要幾秒
docker與虛擬機對比
- 操作系統:
- docker與宿主機共享OS
- 虛擬機是宿主機OS上運行虛擬機OS
- 儲存大小:
- 鏡像小,便于存儲與運輸
- 鏡像龐大
- 運行性能:
- 幾乎沒有額外的性能損失
- 操作昔日額外的CPU、內存消耗
- 移植性
- 輕便、靈活適應linux
- 笨重,與虛擬化技術耦合度高
- 硬件親和性:
- 面向軟件開發者
- 面向硬件運維者
問題點:
使用centos鏡像以后臺模式啟動一個容器
? docker run -d centos
然后執行:
? docker ps -a 進行查看,發現容器已經退出
很重要的說明一點問題:
? Docker容器后臺運行,就必須要有一個前臺進程
? 容器命令如果不是那些一直掛起的命令(比如top,tail) ,就會自動退出
? 這是docker的一個機制,比如web容器,我們以nginx為例,正常情況下,我們配置服務器服務只要啟動響應的serveice 即可,例如 : service nginx start
? 但是這樣做,nginx 為后臺進程模式,就會導致docker前臺沒有運行的應用。
? 這樣容器后臺啟動后,會立刻自殺因為他覺得沒事可做
? 所以最佳的解決辦法就是將你要運行的程序以前臺進程的形式運行
Docker客戶端的命令:
幫助命令
- docker version:
- docker info:
- docker --help:
鏡像命令
docker images
[root@qzk ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 5a3221f0137b 11 days ago 126MB mysql 5.6 732765f8c7d2 13 days ago 257MB mysql <none> 3ed1080b793f 2 months ago 256MB alpine 3.8 dac705114996 5 months ago 4.41MB hello-world latest fce289e99eb9 7 months ago 1.84kB redis 3.2 87856cc39862 10 months ago 76MB # REPOSITORY:鏡像倉庫源 # TAG:鏡像標簽 # IMAGE ID:鏡像ID # CREATED:鏡像創建時間 # SIZE:鏡像大小 # 同一個倉庫源可以由多個Tag,代表這個倉庫源的不同版本,我們使用REPOSITORY:TAG來定義不同的鏡像[root@qzk ~]# docker images -qa 5a3221f0137b 732765f8c7d2 3ed1080b793f dac705114996 fce289e99eb9 87856cc39862常見參數:
- -a:列出本地所有鏡像(包含中間鏡像層)
- -q:只顯示鏡像ID
- digests:只顯示鏡像摘要
- --no-trunc:只顯示完整的鏡像信息
docker search:搜索鏡像
查詢的網站是:https://hub.docker.com
docker search tomcat [root@qzk ~]# docker search tomcat NAME DESCRIPTION STARS OFFICIAL AUTOMATED tomcat Apache Tomcat is an open source implementati… 2503 [OK] tomee Apache TomEE is an all-Apache Java EE certif… 66 [OK] dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 53 [OK] bitnami/tomcat Bitnami Tomcat Docker Image 29 [OK] kubeguide/tomcat-app Tomcat image for Chapter 1 27- 參數選項:
- -s:列出收藏數(點贊數)不少于指定值的鏡像
- --no-trunc:顯示完整的鏡像描述
- --automated:只列出 automated build類型的鏡像
docker pull(拉取鏡像):
- 下載鏡像
- 參數:docker pull [鏡像名稱]
- docker pull mysql ---> 等價于 docler pull mysql:latest 下載最新版本的
docker rmi:刪除某個鏡像
- 刪除單個:
- docker rmi [鏡像名]----->ocker rmi hello-world 刪除 hello-world鏡像
- docker rmi -f [鏡像名]------>docker rmi -f hello-world 強制刪除鏡像
- 刪除多個:
- docker rmi -f [鏡像名] [鏡像名]----->docker rmi -f mysql nginx 強制刪除多個docker鏡像
- 刪除全部:
- docker rmi -f $(docker images -qa)
- 刪除單個:
容器命令
- docker run [options] IMAGES[Command] [arg..] --->依照IMAGES鏡像在docker容器中運行
- OPTIONS參數說明:
- --name:指定容器的新名字(為容器命名)
- -d:后臺運行容器,并返回容器ID,即啟動守護進程式的容器
- -i:以交互模式運行容器,通常與 -t 同時使用
- -P:隨機端口映射
- -p:指定端口映射(有一下幾種方法):
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containPort
- OPTIONS參數說明:
- docker ps:查看當前docker下所有正在運行的容器實例
- OPTIONS參數:
- -l :查看上一個容器,已經其運行狀態信息
- -a:列出所有正在運行的容器+ 歷史運行過的容器
- -n [num]:查看上num次運行的容器
- -q:靜默模式:只顯示容器編號
- --no-trunc:不截斷輸出
- OPTIONS參數:
退出容器:
- exit:退出容器,并且關閉容器
- ctrl +p+q:退出不關閉容器
docker start 容器ID:啟動容器
docker stop 容器ID:停止容器
docker restart 容器ID :重啟容器
docker kill 容器ID:強制停止容器
docker rm 容器ID:刪除容器
一次刪除多個容器:
- docker rm -f $(docker ps -a -q)
- docker ps -a -q | xargs docker rm
查看容器日志:docker logs -f -t --tail 容器ID
- options參數:
- -t:加入時間戳
- -f:跟隨最新的日志打印
- --tail:數字,顯示最后多少條
- options參數:
查看容器內的進程:docker top 容器ID
查看容器內部的細節:docker inspect 容器ID -->返回json字符串形式的容器細節
進入正在運行的容器并以命令行交互:docker attach 容器ID
這個命令是指進入還在運行的docker容器中的
- exit 退出容器并關閉容器
- ctrol +p+q 退出容器但是不關閉容器 ---->此時再想進去就是 用 docker attach 容器ID
- 兩種方式執行容器的命令行交互:
- docker attach 容器ID --> 進入命令行交互終端,執行你想執行的操作
- docker exec -t 容器ID ls -l /etc --> 不進入命令行終端,執行你想要的執行的操作,并返回執行結果。
- 兩種方式執行容器的命令行交互:
從容器內拷貝文件的到宿主機上:docker cp 容器ID:容器內路徑 目的主機路徑
[root@f555a0797343 /]# cd /tmp/ [root@f555a0797343 tmp]# ls ks-script-rnBCJB yum.log [root@f555a0797343 tmp]# read escape sequence [root@qzk ~]# docker cp f555a0797343:/tmp/yum.log /root [root@qzk ~]# ll total 40 drwxr-xr-x 2 root root 4096 Jul 17 00:06 conf drwxr-xr-x 4 polkitd input 4096 Jul 17 00:06 data -rw-r--r-- 1 root root 13185 Jul 16 23:53 get-docker.sh drwxr-xr-x 2 root root 4096 Jul 17 00:06 logs drwxr-xr-x 5 root root 4096 Aug 26 20:03 mysql drwxr-xr-x 5 root root 4096 Aug 20 17:27 nginx drwxr-xr-x 3 root root 4096 Jul 17 08:42 redis -rw------- 1 root root 0 Aug 1 09:09 yum.logdocker鏡像
docker 鏡像的原理:
是什么:
鏡像是一種輕量級的、可獨立執行的軟件包,用來打包軟件的額運行環境和基于運行環境開發的軟件,它包含運行某個軟件所需的所有內容包括代碼,運行時的庫,環境變量和配置文件
聯合文件系統(UnionFS):鏡像是聯合文件系統的縮寫
- 是一種分層的,輕量級高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加。
- 同時支持將不同目錄掛載到同一個虛擬文件系統下。
- Union文件系統是Docker鏡像的基礎。鏡像可以通過分成來進行繼承。基于基礎鏡像可以制作各種應用鏡像。
- 特性:
- 一次同時加載多個文件系統,但是從外面看起來只能看到一個文件系統。聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄
docker鏡像加載原理
- docker鏡像實際上是由一層一層的文件系統組成,這種層級文件系統叫UnionFS
- bootfs(boot file system)主要包含bootloader 和 kernel,
- bootloader:主要是引導加載kernel,linux系統剛啟動時會加載bootfs文件系統。
- 在docker鏡像最底層就是 bootfs。這一層與我們linux一致。包括boot加載器和內核。
- 當boot加載完成之后,整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核了,此時文件系統也會卸載bootfs。
- rootfs(root file system),在bootfs之上,包含的就是典型linux系統的/dev,/proc,/bin 等標準目錄或文件。rootfs就是各種不同操作系統的發行版,不如Ubantu,centos等。
問題:為什么我們在docker中跑的鏡像實例化的容器centos 會那么小?200M左右
- 對于一個精簡的OS,rootfs可以很小,只需要包括最基本的命令,工具和程序即可。因為底層直接使用的是 宿主機的kernel(內核),自己只需要提供rootfs就可以了。
- 由此可見,對于不同版本的linux發行版,bootfs基本一致,rootfs會有差別。因此不同的發行版可以共用bootfs。
分層的鏡像
問題:為什么Docker鏡像要采用分層結構呢?
- 最大的好處就是資源共享
- 比如:有多個鏡像都從相同的base鏡像構建而來,那么宿主機只需要在磁盤上保存一份base鏡像。同時內存中也只需要加載一份base鏡像,就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。
問題:鏡像有哪些特點:
- Docker鏡像都是只讀的
- 當容器啟動的時候,一個新的可寫層被加載到鏡像的頂部。
- 這一層通常被稱作為容器層。容器層之下稱為鏡像層
容器命令之提交副本使其成為鏡像:
docker commit(提交容器的副本使之成為鏡像)
docker commit -m='提交的描述信息' -a='作者' 容器ID 要創建的目標鏡像名:[標簽名]
Docker容器數據卷:(docker中的數據持久化,保存docker中的數據)
Docker的容器數據卷類似于Redis里面的rdb和aof文件(redis是分布式內存數據庫,其數據持久化依賴于rdb和aof文件)
特點:
- 數據卷可在容器之間共享或重用數據
- 卷中的更改可以直接生效
- 數據卷中的更改不會包含在鏡像的更新中
- 數據卷的生命周期一直持續到沒有容器使用它為止。
直接命令添加
命令:
- docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
查看數據卷是否掛載成功:
容器和宿主機之間數據共享:
容器停止退出后,主機修改后數據是否同步:
命令(帶權限):
- docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
- ro:readonly 只讀
- docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
dockerfile方法--->dockerfile 是鏡像的配置執行文件,優點類似于linux的shell腳本
- Docker 掛載主機Docker 訪問出現cannot open directory:Permission denied
- 解決辦法:在掛載目錄后多加一個--privilege = true參數即可
此時即完成數據卷的添加且綁定到宿主機對應的文件夾
},"Mounts": [{"Type": "volume","Name": "2093233e62fd1861cd936c2f24b2aeed7938660679fbb4ef7410b4a55c1a8315","Source": "/var/lib/docker/volumes/2093233e62fd1861cd936c2f24b2aeed7938660679fbb4ef7410b4a55c1a8315/_data","Destination": "/dataValumeContainer2","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "2f2eae1d07d01dc5a1e26ff0388321dd0a51e19a1ba7ba04d89a4470caeed38c","Source": "/var/lib/docker/volumes/2f2eae1d07d01dc5a1e26ff0388321dd0a51e19a1ba7ba04d89a4470caeed38c/_data", # 對應宿主機的文件夾"Destination": "/dataVolumeContainer1","Driver": "local","Mode": "","RW": true,"Propagation": ""}數據卷容器:
命名的容器掛載數據卷,其他容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器
實現容器之間共享與傳遞數據
root@a85b1adc42b2 dataVolumeContainer1]# [root@qzk _data]# [root@qzk _data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 147e8ecfb961 qzk/centos "/bin/sh -c /bin/bash" About a minute ago Up About a minute dc02 159a20092c5b qzk/centos "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes dc01 f4525af85b89 mysql:5.6 "docker-entrypoint.s…" 28 hours ago Up 4 hours 0.0.0.0:3306->3306/tcp qzkmysql d2c751fb7ea8 nginx "nginx -g 'daemon of…" 7 days ago Up 4 hours 0.0.0.0:8081->80/tcp docker_nginx [root@qzk _data]# ls test.txt [root@qzk _data]# ls test.txt [root@qzk _data]# cd [root@qzk ~]# docker attach dc01 [root@159a20092c5b /]# cd /dataVolumeContainer1/ [root@159a20092c5b dataVolumeContainer1]# ll total 0 -rw-r--r-- 1 root root 0 Aug 27 16:19 1.txt [root@159a20092c5b dataVolumeContainer1]# read escape sequence [root@qzk ~]# docker attach dc02 [root@147e8ecfb961 dataVolumeContainer1]# ll total 0 -rw-r--r-- 1 root root 0 Aug 27 16:19 1.txt [root@qzk _data]# ls test.txt [root@qzk _data]# cd .. [root@qzk 2f2eae1d07d01dc5a1e26ff0388321dd0a51e19a1ba7ba04d89a4470caeed38c]# cd .. [root@qzk volumes]# ls 107e09635eb15fe000de2e3cdb291b05d44156f9bd5bfb39c84b926a75b37197 1cd5cb6d336ea6c0915f92d5b99ed9522f1878526e91990636c308c284c61a79 2093233e62fd1861cd936c2f24b2aeed7938660679fbb4ef7410b4a55c1a8315 2f2eae1d07d01dc5a1e26ff0388321dd0a51e19a1ba7ba04d89a4470caeed38c 43267e6f36e88653976d1547f9aff74b2a293c182f2a20069b511b9f738d5ecf adf312b8b092ca8a2493579a3ea850f9da7c778f7ffdbd67678b17c313701a35 c0979a3fc3137ff4612337fea71f8d604f03e88e5c874227deed99fcc53e5d95 metadata.db
總結:容器之間配置信息的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止。
- Docker 掛載主機Docker 訪問出現cannot open directory:Permission denied
轉載于:https://www.cnblogs.com/qianzhengkai/p/11421602.html
總結
以上是生活随笔為你收集整理的docker数据卷之持久化操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用软件-安装过程中的小常识
- 下一篇: 小程序模板消息点击后弹开发版过期