Docker 的優點
832
2025-04-03
是什么?
先來看看Docker的理念:
將運用與運行的環境打包形成容器運行 ,運行可以伴隨著容器,但是我們對數據的要求希望是持久化的
容器之間希望有可能共享數據
Docker容器產生的數據,如果不通過docker commit生成新的鏡像,使得數據做為鏡像的一部分保存下來,
那么當容器刪除后,數據自然也就沒有了。
為了能保存數據在docker中我們使用卷。
一句話:有點類似我們Redis里面的rdb和aof文件
能干嘛
卷就是目錄或文件,存在于一個或多個容器中,由docker掛載到容器,但不屬于聯合文件系統,因此能夠繞過Union File System提供一些用于持續存儲或共享數據的特性:
卷的設計目的就是數據的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷
特點:
1:數據卷可在容器之間共享或重用數據
2:卷中的更改可以直接生效
3:數據卷中的更改不會包含在鏡像的更新中
4:數據卷的生命周期一直持續到沒有容器使用它為止
容器的持久化
容器間繼承+共享數據
數據卷
容器內添加
直接命令添加
命令:
docker run -it -v /宿主機目錄:/容器內目錄 centos /bin/bash
-v表示volume,卷
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
案例:在宿主機上和centos鏡像之間新建文件夾互通
docker run -it -v /myDataVolum:/dataVolumContainer centos /bin/bash
可以看出命名執行完就進入到一個鏡像名為a82ff6c30fbb的centos下,查看centos下有dataVolumContainer這個新建的文件夾
進入到宿主機,發現也會新建個myDataVolum,這兩個文件夾中的數據是互通的
查看數據卷是否掛載成功
docker inspect 容器ID
docker inspect a82ff6c30fbb
容器和宿主機之間數據共享
案例:測試宿主機和容器是否共享數據
在宿主機新建一個a.txt文件
容器中寫入數據,如:hello docker!
在宿主機上查看寫入的內容:
容器停止退出后,主機修改后數據是否同步
案例:先exit退出容器,在宿主機新建文件并寫入數據。然后再重新啟動容器,看寫入的數據是否同步。
新建b.txt文件,寫入:test
docker ps -l -l :顯示最近創建的容器。
啟動centos鏡像
docker start a82ff6c30fbb docker attach a82ff6c30fbb
數據一致:
命令(帶權限)
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
ro:表示只讀不可寫
RW:表示讀寫
結論:設置上述的權限時(設置ro),在共享文件夾中,容器中只能查看不能寫入
DockerFile添加
進入dockerhub下載鏡像:https://hub.docker.com/
docker hub打開的太慢了,可以去github上的搜索鏡像:https://github.com/docker-library/
如:tomcat鏡像的docker file :https://github.com/dockerlibrary/tomcat/blob/master/8.5/jdk8/openjdk/Dockerfile
根目錄下新建mydocker文件夾并進入,搜索tomcat,在tomcat的docker file里發現有OpenJDK,所以這也是為什么tomcat鏡像包這么大了。
docker下載的鏡像都有一個特點就是這些鏡像都是小型化的Linux系統
docker file里的 “ \ ”是連接符,一行寫不下所以需要換行
docker file就是鏡像模板的描述文件
案例
mkdir mydocker cd mydocker
可在Dockerfile中使用VOLUME指令來給鏡像添加一個或多個數據卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
說明:
出于可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
由于宿主機目錄是依賴于特定宿主機的,并不能夠保證在所有的宿主機上都存在這樣的特定目錄。
File構建
在centos鏡像的根目錄里新建兩個容器卷,并且打印出一段話
# volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------success1" CMD /bin/bash
build后生成鏡像,參數 -f 表示docker file的路徑,-t 是命名空間,最后面一個點 “.” ,表示在當前目錄下,如果在當前目錄下可以不加參數 -f
鏡像是一層套一層的,類似于花卷,上面的docker file的第一層是centos,第二層是容器卷。我們只訪問最外層。
獲得一個新鏡像zzyy/centos
docker build -f /mydocker/Dockerfile -t xdr630/centos .
運行后一層一層執行,以容器內的centos鏡像為根本,就可以創建另外一個自定義的centos鏡像。
現在直接運行剛才創建的容器,一運行就會直接在xdr630/centos 下創建兩個容器卷
docker images 容器名 可以查詢images下是否有這個容器,如:
run容器
docker run -it xdr630/centos
在自定義的centos的容器卷1中創建a.txt并且寫入 hello Docker!
容器內有兩個容器卷,沒有指定對應的宿主機上的路徑。但docker會有默認的對應的路徑
這里注意的是最新版的centos鏡像中默認對應的宿主機的路徑在“Mounts”值中
復制上述的路徑,在宿主機上查看,又實現了宿主機到容器的數據可以是共享的
通過上述步驟,容器內的卷目錄地址已經知道對應的主機目錄地址哪??
主機對應默認地址
最新版本的宿主機默認對應的路徑為:
/var/lib/docker/volumes/75326a87e1affc3eb80ed150430ff4aaa11c1d55ddc333f3fe0754098b964486/_data
備注
Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄后多加一個–privileged=true參數即可
數據卷容器
是什么?
命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器
總體介紹
以上一步新建的鏡像zzyy/centos為模板并運行容器dc01/dc02/dc03
它們已經具有容器卷
/dataVolumeContainer1
/dataVolumeContainer2
容器間傳遞共享(–volumes-from)
先啟動一個父容器dc01
這里的 --name 是自己自定義的名字,默認不寫的話是docker隨機給的名
在dataVolumeContainer2新增內容
dc02/dc03繼承自dc01
–volumes-from
命令
docker run -it --name dc02 --volumes-from dc01 xdr630/centos
發現有剛才新增的文件
dc02/dc03分別在dataVolumeContainer2各自新增內容
回到dc01可以看到02/03各自添加的都能共享了
刪除dc01,dc02修改后dc03可否訪問
刪除dc02后dc03可否訪問
再進一步
新建dc04繼承dc03后再刪除dc03
結論:容器之間配置信息的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止
Docker
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。