docker|Docker学习(三)——docker容器与主机,容器与容器数据共享


Docker学习(三)——docker容器与主机,容器与容器数据共享

  • 1.容器、主机间数据拷贝
  • 2.容器、主机间数据挂载(volume技术)
    • 2.1 命令行方式挂载
    • 2.2 补充:涉及到的简单linux命令
    • 2.3 命令行挂载的三种格式
    • 2.4 dockerfile挂载
  • 3. 数据卷容器——容器间数据共享
  • 4. 若容器被删除,会发生什么?

1.容器、主机间数据拷贝 常用作将容器中的数据拷贝至主机保存,当然也可以将主机中的数据使用docker cp 命令拷贝至容器(但不常用)
docker cp 主机文件路径 容器ID:文件目的地路径
#命令 sudo docker cp ./python/test.py f2bb0df657a3:/test#将主机中的./python/test.py 文件拷贝至容器中的 /test目录下 ./python/test.py 中的 . 代表相对路径 #结果 sudo docker exec -it f2bb0df657a3 /bin/bash #进入容器 #查看文件 root@:/$ ls binbootdevetchomeliblib64mediamntoptprocrootrunsbinsrvsystesttmpusrvar #进入test目录,发现test。py已经成功拷贝 root@:/$ cd test root@:/test$ ls test.py

2.容器、主机间数据挂载(volume技术) 容器与主机通过volume技术实现双向数据互通,自动实时更新(推荐)
2.1 命令行方式挂载 docker run -it -v 主机目录:容器目录 镜像名
Ps:注意,挂载是在run镜像的时候进行挂载
#测试 root@i:~$ sudo docker run -it -v ~/python:/test --name test python:3.6 /bin/bash #参数解释 -i 开启输入流 -t 开启伪终端 /bin/bash -使用bash作为命令行shell -v 挂载容器内的/test目录至主机的/python目录 ~/python:/test目录映射中的 ~ 代表root目录→→ root/python:/test --name 对新建的容器自定义命名

可通过新开一个终端或者Ctrl+P+Q 的方式进入主机命令行
使用docker inspect 容器ID 查看容器信息,并查看挂载是否成功
root@i:~$ sudo docker inspect ced15a99198f [ {... "Mounts": [ {"Type": "bind", "Source": "root/python", "Destination": "/test", "Mode": "", "RW": true, "Propagation": "rprivate" } ], ... #Mounts中标明了挂载信息可以 查看挂载路径 "Source": "/python", "Destination": "/test",

至此,主机/python目录下的内容和容器内/test目录下的内容完成映射,其中内容将自动同步
下面进行测试,查看是否完成了数据互通以及自动同步
docker|Docker学习(三)——docker容器与主机,容器与容器数据共享
文章图片

docker的挂载技术方便我们在本机完成代码的编辑,自动同步至容器
2.2 补充:涉及到的简单linux命令
cd 目录名#——进入指定的文件夹目录 cd ..#——返回上一级目录 ls#——列出当前目录下的文件夹 mddir 文件夹名#——创建文件夹 rmdir 文件夹名#——删除文件夹,注意文件夹必须为空 touch 文件名#——创建文件 rm文件名#——删除文件 cp source des#——复制文件/夹至指定目录 clear#——清空屏幕

2.3 命令行挂载的三种格式
#-v 容器内目录——匿名挂载 sudo docker run -it -v /test --name test python:3.6 /bin/bash #-v 卷名:容器内目录——具名挂载 sudo docker run -it -v /test --name test python:3.6 /bin/bash 通过以上两种方法挂载的数据卷,在本机的/var/lib/docker/volumes目录下#-v 主机目录:容器内目录——指定路径挂载 sudo docker run -it -v ~/python:/test --name test python:3.6 /bin/bash

2.4 dockerfile挂载 通过编写一个dockerfile脚本,在dockerfile中编写挂载命令
#打开dockerfile文件,无后缀 VOLUME ['数据卷路径名1','数据卷路径名2'] VOLUME ['/etc/volume1','/etc/volume2']#属于匿名挂载

有关dockerfile内容将在dockerfile学习中详写
3. 数据卷容器——容器间数据共享 使用 –volumes-from 容器ID/名命令,完成容器间的数据共享
容器间数据卷挂载的形式,与java中的继承相似,子容器-继承-父容器数据卷
#测试 root@iZ2ze2tw7cm243uv3wr3e6Z:~$ docker ps#查看正在运行的容器 CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 055a25ecd6b8python:3.6"/bin/bash"56 minutes agoUp 56 minutestest root@iZ2ze2tw7cm243uv3wr3e6Z:~$ docker run -it --name test2 --volumes-from test python:3.6 /bin/bash#创建新容器test2,并挂载至test root@62903f129cc4:~$ ls#查看test2容器中的目录,发现存在test文件夹(共享自test) binbootdevetchomeliblib64mediamntoptprocrootrunsbinsrvsystesttmpusrvar root@62903f129cc4:~$ cd test#进入test文件夹,查看文件,发现与test中文件相同 root@62903f129cc4:/test$ ls a.javab.javatest.py

4. 若容器被删除,会发生什么? 【docker|Docker学习(三)——docker容器与主机,容器与容器数据共享】进行挂载的容器若被停止或被删除,与它存在挂载关系的容器/主机中的数据不会丢失

    推荐阅读