容器与宿主机之间的文件复制示例

实测

主要是docker cp命令

创建场景

在宿主机创建3个文件
启动两个容器 red1, red2

1
2
3
4
5
6
root@nu18-vm:~# cd /usr/local/games 
root@nu18-vm:/usr/local/games# touch /usr/local/games/{aa,bb.txt,cc.txt}
root@nu18-vm:/usr/local/games# docker run -d --name red1 redis
ea7854c0c552567630d318f34e5727b7d14a94f76fde85d27539c359f24c8cae
root@nu18-vm:/usr/local/games# docker run -d --name red2 redis
4255fa735d906862cfe83659f2968846c8023b23b6d5fb7ea5827c831c825dfa

cp命令

从容器拷贝文件到宿主机
从宿主机拷贝文件到容器 用来测试文件复制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
root@nu18-vm:/usr/local/games# docker cp red1:/usr/local/bin/redis-cli ./
root@nu18-vm:/usr/local/games# ls
aa  bb.txt  cc.txt  redis-cli
root@nu18-vm:/usr/local/games# docker cp aa red1:/tmp
root@nu18-vm:/usr/local/games# docker exec -it red1 ls /tmp
aa

root@nu18-vm:/usr/local/games# docker cp /usr/local/games/. red1:/mnt
root@nu18-vm:/usr/local/games# docker exec -it red1 ls /mnt
aa  bb.txt  cc.txt
root@nu18-vm:/usr/local/games#
root@nu18-vm:/usr/local/games# docker cp /usr/local/games red1:/mnt
root@nu18-vm:/usr/local/games# docker exec -it red1 ls /mnt
aa  bb.txt  cc.txt  games
root@nu18-vm:/usr/local/games# docker exec -it red1 ls /mnt/games
aa  bb.txt  cc.txt

tar方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
root@nu18-vm:/usr/local/games# tar -c . | docker cp - red2:/tmp
root@nu18-vm:/usr/local/games# docker exec -it red2 ls /tmp
aa  bb.txt  cc.txt

root@nu18-vm:/usr/local/games#
root@nu18-vm:/usr/local/games# tar -c /usr/local/games | docker cp - red2:/mnt
tar: 从成员名中删除开头的“/”
root@nu18-vm:/usr/local/games# docker exec -it red2 ls /mnt/usr/local/games
aa  bb.txt  cc.txt

root@nu18-vm:/usr/local/games#
root@nu18-vm:/usr/local/games# tar -c -C /usr/local/games . | docker cp - red2:/mnt
root@nu18-vm:/usr/local/games# docker exec -it red2 ls /mnt
aa  bb.txt  cc.txt  usr

命令的过滤版

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
环境准备
docker run -d --name red1 redis
docker run -d --name red2 redis
cd /usr/local/games 
touch /usr/local/games/{aa,bb.txt,cc.txt}

cp直接拷贝
docker cp red:/usr/local/bin/redis-cli ./
docker cp aa red1:/tmp
docker exec -it red ls /tmp

docker cp /usr/local/games/. red1:/mnt
docker exec -it red1 ls /mnt
docker cp /usr/local/games red1:/mnt
docker exec -it red1 ls /mnt
docker exec -it red1 ls /mnt/games

采用tar拷贝
tar -c . | docker cp - red2:/tmp
docker exec -it red2 ls /tmp

tar -c /usr/local/games | docker cp - red2:/mnt
docker exec -it red2 ls /mnt/usr/local/games

tar -c -C /usr/local/games . | docker cp - red2:/mnt
docker exec -it red2 ls /mnt