前言
在很多时候我们需要将宿主机的文件复制到Docker容器里面,或者在Docker启动时挂载宿主机的一个目录。本节主要记录Docker复制宿主机目录及挂载宿主机目录的命令以及方法。
复制
宿主机 -> 容器
从宿主机拷贝文件至容器可以执行以下命令:
docker cp <file path in host> <containerID> :<file path in container>
以下以Windows 下 _Docker Desktop_为例,演示从宿主机拷贝文件至容器的功能。
首先打开控制台,查看所有镜像。
docker ps -a
发现容器有点多,那么可以执行以下命令删除全部容器:
docker rm $(docker ps -a -q)
删除之后,新建一个测试容器
docker run --name cptest -itd ubuntu:latest /bin/bash
- –name
: 指定容器名称
可以看到已经创建了名为cptest的容器。
执行以下命令
[In Host]: docker exec -it cptest /bin/bash # 打开容器
[In Container]: pwd # 查看当前路径
[In Container]: mkdir /cptest # 创建测试文件夹
[In Container]: ls # 查看当前文件夹
结果如下所示:
OK,目前已经将测试文件夹创建完毕,接下来执行如下命令复制测试文件cptest.txt以及测试文件夹cptest。
[In Host]: docker cp .\cptest.txt cptest:/cptest/ # 复制文件
[In Host]: docker cp .\cptest\ cptest:/cptest/ # 复制文件夹
[In Host]: docker exec -it cptest /bin/bash # 打开容器
[In Container]: cd /cptest/ # 打开测试文件夹
[In Container]: ls # 查看文件夹内容
结果如下所示:
可以发现宿主机的文件及文件夹已经全部复制到容器中去了。
容器 -> 宿主机
执行以下命令可以将容器内的文件或者目录复制到宿主机。
docker cp <container>:<path in container> <path in host>
将容器cptest中/cptest/cptest.txt
复制到宿主机./cptest/
下。命令如下所示:
[In Host]: docker cp cptest:/cptest/cptest.txt ./cptest/
在宿主机目标文件夹下可以看到该文件。
挂载
正常挂载
通过挂载可以使得容器共享宿主机的目录及文件,命令如下:
# 通过-v参数指定挂载的目录
[In Host]: docker run -it -v <path in host (abs)>:<path in container><:permission> <image> <command/app>
例如将宿主机./volumetest
目录挂载至容器volumetest, 可以执行以下命令:
[In Host]: docker run -it -v C:\Users\XJTU-IAIR-09\volumetest/volumetest/:/volumetest ubuntu:latest /bin/bash
如上所示,即完成目录的挂载,在容器内的操作也会影响宿主机的目录及文件。
默认挂载的路径权限为读写。如果指定为只读可以修改<:permission>
为:ro
。
数据卷挂载
数据卷:“一个专门用来提供数据卷供其它容器挂载的正常的容器”。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。可以使用--volumes-from <container>
在启动容器时指定需要挂载的数据卷。
# 创建数据卷
[In Host]: docker run -v C:\Users\XJTU-IAIR-09\volumetest:/volumetest --name dataVol ubuntu:latest /bin/bash
# 利用--volumes-from 从数据卷挂载
[In Host]: docker run -it --volumes-from dataVol ubuntu:latest /bin/bash
在容器查看,可以看到宿主机的测试文件夹已经挂载至新的容器中。