這篇文章為大家帶來了Docker總結分享之資料卷技術的相關知識,希望對大家有幫助。
Docker資料卷技術
什麼是容器資料卷
#docker的概念回顧將應和環境打包成一個映像!資料?如果資料都在容器中,那麼我們容器刪除,資料就會遺失!需求:資料可以持久化MySQL,容器刪了,刪庫跑路--->需求:MySQL資料可以儲存在本地!
容器之間可以有一個資料共享的技術! Docker容器中產生的數據,同步到本地! 這就是磁碟區技術!目錄的掛載,將我們容器內的目錄,掛載到Linu×上面! 總結:容器的持久化和同步操作!容器間也是可以實現資料共享的!使用資料卷
docker run -it -v 宿主机目录: 容器目录 -p 主机端口:容器端口 容器id
實戰演練
inspect查看同步詳細資料在容器中建立一個文件,看是否同步到本機資料夾
#在關閉容器的情況下,對本機文件進行修改,看修改的是不是會同步到容器中檔案#Mysql實戰
#
docker run -d -p 3310:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7參數-d 後台運行
-p 連接埠對映
-v 資料卷掛載:同步資料
-e 設定環境變數:這裡時設定的時MySQL的登陸密碼
--name 容器起名字
測試結果:連線成功遇到的問題首先使用的時mysql的最新版本:8.0----在使用navicat進行連接的時候,總是報莫名其妙的錯誤
#解決方式:換成5.7版本,沒有任何問題在我們run鏡像mysql的時候,沒有加上-e MYSQL_ROOT_PASSWORD=123456進行密碼的設置,容器一直會處於關閉狀態,即使重新start也不會開啟加上-e MYSQL_ROOT_PASSWORD=123456這個參數完美開啟
#即使我們將容器刪除,我們掛載到本地的資料卷依舊沒有遺失,這就實現了容器資料的持久化功能
具名掛載與匿名掛載
#匿名掛載
-v 容器內的路徑!docker run -d --name nginx01 -v /etc/nginx nginx這裡我們發現,這種就是匿名掛載,我們在-v的後面只是寫上了容器內的路徑,沒有寫容器外的路徑查看所有捲的情況
docker volume ls具名掛載
#-v 掛載磁碟區的名稱:容器內的路徑
docker run -d --name nginx01 -v 具名挂在名称:/etc/nginx nginx
這裡我們發現,這種就是匿名掛載,我們在-v的後面既寫上了容器內的路徑,沒有容器外的路徑,但是有一個名稱
docker的內容目錄:/var/lib/docker所有的docker容器內的捲,沒有指定目錄的情況下都是在:/var/lib/docker/volume /xx/_data我們可以透過具名掛載方便的找到我們的一個卷,並且在使用卷的時候最多的使用方式就是具名掛載額外知識
如何區分時具名掛載或匿名掛載,指定路徑掛載
###-v 容器內路徑 #匿名掛載######-v 磁碟區名:容器內路徑 #具名掛載#######-v /容器外路徑:容器內路徑 #指定路徑掛載#######擴充## #####-v 容器內路徑:ro rw 改變讀寫權限######ro readonly 唯讀######rw readwrite 可讀可寫###一旦设置了这个容器权限,容器对我们挂载出来的内容就有限定了
docker run -d --name nginx01 -v 具名挂在名称:/etc/nginx:ro nginx docker run -d --name nginx01 -v 具名挂在名称:/etc/nginx:rw nginx
Ro 只要看到ro就说明这个路径只能通过宿主机来进行操作,容器内是无法操作的!
初识Dockerfile
dockerfile
dockerfile就是用来构建docker镜像文件的!命令脚本!先体验一下
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!
写一个dockerfile
# 创立一个dockerfile文件,名字可以随便的取,最好叫做dockerfile # 文件中的内容 指令(大写) 参数 FROM centos VOLUME ["volme01","volume02"] CMD echo "--------end----------" CMD /bin/bash #这里每个指令就是镜像的一层
使用dockerfile生成镜像
docker build -f dockerfile文件位置 -t 镜像名称和版本 镜像生成的位置
进入镜像查看详情
查看卷的同步目录
docker ps -a
docker inspect 容器id
最后测试两个文件夹中是不是同步
同步成功
总结
使用dockerfile构建镜像的方式在我们未来的使用中非常的多,因为我们通常会构建自己的镜像
假设构建镜像时候没有挂载卷,要手动镜像挂载-v
数据卷容器
实际上即使保证的容器之间的数据共享的问题
数据卷容器实际上就是被拷贝数据的容器(A- volumes-from ->B,B是数据卷容器)
测试两个镜像之间同步
首先先开三个容器
创建docker01
创建docker02 --volumes-from docekr01
创建docker03 --volumes-from docekr02
查看docker01和docker03之间的数据共享
接着我们将docker02删除,查看docker01和docker03之间的数据共享
总结:
实现多个mysql之间的数据共享
docker run -d -p 3310:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 docker run -d -p 3310:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7
总结:
容器之间配置信息的传递。数据卷容器的声明周期一直持续到没有容器使用位置
理解:容器之间只要是共享就会数据copy,即使有的容器被删除,数据依然存在,直到所有共享 的容器都删除,数据才会被彻底删除
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的。
推荐学习:《docker视频教程》
以上是Docker總結分享之資料卷技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!