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的挂载技术方便我们在本机完成代码的编辑,自动同步至容器
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容器与主机,容器与容器数据共享】进行挂载的容器若被停止或被删除,与它存在挂载关系的容器/主机中的数据不会丢失
推荐阅读
- #|Docker部署(MySQL)
- docker|docker基础学习笔记
- 群晖|群晖docker安装jd脚本工具(jd_base)
- Java架构专栏|Docker 安装MySQL5.7(简单版本)
- kubernetes|kubernetes 的 Services 的分类
- mysql|工作随笔(一)——docker和mysql容器搭建使用问题解决
- Docker|Kubernetes中的开放接口CRI、CNI、CSI
- 网络|谈谈对K8S CNI、CRI和CSI插件的理解
- kubernetes|Kubernetes权威指南第5版(从Docker到Kubernetes实践全接触)