Docker学习(三)——docker容器与主机,容器与容器数据共享
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
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
#进入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 #——清空屏幕
echo #——打印信息
#文件编辑操作
vim 文件名 →i →Esc →:wq #——进入文件→开启输入流→退出编辑→保存文件并退出vim
cat 文件名 #——查看文件内容
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 ID IMAGE COMMAND CREATED STATUS PORTS NAMES
055a25ecd6b8 python:3.6 "/bin/bash" 56 minutes ago Up 56 minutes test
root@iZ2ze2tw7cm243uv3wr3e6Z:~$ docker run -it --name test2 --volumes-from test python:3.6 /bin/bash #创建新容器test2,并挂载至test
root@62903f129cc4:~$ ls #查看test2容器中的目录,发现存在test文件夹(共享自test)
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
root@62903f129cc4:~$ cd test #进入test文件夹,查看文件,发现与test中文件相同
root@62903f129cc4:/test$ ls
a.java b.java test.py
4. 若容器被删除,会发生什么?
进行挂载的容器若被停止或被删除,与它存在挂载关系的容器/主机中的数据不会丢失