从容器创建新镜像:docker commit
备份/恢复镜像:docker save + docker load
、docker export + docker import
docker commit
操作的是容器。从容器创建新镜像
https://docs.docker.com/engine/reference/commandline/commit/
cuiwei@weideMacBook-Pro server % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df15d5b449c6 nginx:1.21.3 "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp server-docker-nginx-1
#在此之前,先进入容器进行一些修改
cuiwei@weideMacBook-Pro server % docker commit df15d5b449c6 chudaozhe/nginx:test1
sha256:98f7915e8f85b81d12eadad38dc6124bae858384c03734886432f8dce7ea5c36
cuiwei@weideMacBook-Pro server % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chudaozhe/nginx test1 98f7915e8f85 About a minute ago 133MB
nginx 1.21.3 87a94228f133 17 months ago 133MB
#运行一下
cuiwei@weideMacBook-Pro server % docker run -d chudaozhe/nginx:test1
6417f9eccd033d651351cb1d35004aa63efa163bd2d56be2e16c749d3c062dae
#进入新容器,看下刚才的修改是否还在
#肯定在!
其他命令
cuiwei@weideMacBook-Pro server % docker inspect -f "{{ .Config.Env }}" 6417f9eccd03
[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.21.3 NJS_VERSION=0.6.2 PKG_RELEASE=1~buster]
docker commit --change "ENV DEBUG=true" df15d5b449c6 chudaozhe/nginx:test1
docker commit --change='CMD ["apachectl", "-DFOREGROUND"]' -c "EXPOSE 80" df15d5b449c6 chudaozhe/nginx:test1
docker save + docker load
操作的是镜像。备份和恢复镜像
cuiwei@weideMacBook-Pro server % docker save nginx:1.21.3 | gzip > nginx_1.21.3.tar.gz
cuiwei@weideMacBook-Pro server % docker load < nginx_1.21.3.tar.gz
43f4e41372e4: Loading layer [==================================================>] 64.97MB/64.97MB
788e89a4d186: Loading layer [==================================================>] 3.072kB/3.072kB
f8e880dfc4ef: Loading layer [==================================================>] 4.096kB/4.096kB
f7e00b807643: Loading layer [==================================================>] 3.584kB/3.584kB
9959a332cf6e: Loading layer [==================================================>] 7.168kB/7.168kB
Loaded image: nginx:1.21.3
docker save
将一个或多个图像保存到tar
存档(默认流式传输到STDOUT)
https://docs.docker.com/engine/reference/commandline/save/
创建一个备份,然后与docker load
一起使用。
docker save nginx:1.21.3 | gzip > nginx_1.21.3.tar.gz
docker save nginx:1.21.3 > nginx_1.21.3.tar
docker save --output nginx_1.21.3.tar nginx:1.21.3
docker save -o nginx_1.21.3.tar nginx:1.21.3
#同时备份两个标签
docker save -o nginx.tar nginx:1.21.3 nginx:mainline
docker load
从tar
存档或STDIN
加载图像
https://docs.docker.com/engine/reference/commandline/load/
docker load < nginx_1.21.3.tar.gz
docker load --input nginx_1.21.3.tar.gz
docker export + docker import
操作的是容器。从容器创建新镜像,和docker commit
导出所有层级不同,它只有一层。
另外运行时要加-t和bash参数,否则无法启动新容器1️⃣
cuiwei@weideMacBook-Pro server % docker export server-docker-nginx-1 > nginx_1.21.3.tar
cuiwei@weideMacBook-Pro server % docker export df15d5b449c6 > nginx_1.21.3_2.tar
#一定要指定镜像名和tag,否则就成虚悬镜像了(仓库名 (镜像名) 和标签 TAG 都是<none>的镜像。)
cuiwei@weideMacBook-Pro server % docker import nginx_1.21.3.tar chudaozhe/nginx:test1
sha256:c7905c3274d23683e66bcab36b860144857faec6bb3813384212002092dc0971
#运行一下,注意:要加-t和bash参数
cuiwei@weideMacBook-Pro server % docker run -d -t chudaozhe/nginx:test1 bash
fb64767ec3dacc97f0ccd26252fa9e51ceebddd453a07a0a7e380a2781c33791
docker export
将容器导出为tar存档
https://docs.docker.com/engine/reference/commandline/export/
docker export server-docker-nginx-1 > nginx_1.21.3.tar
docker export df15d5b449c6 > nginx_1.21.3_2.tar
docker export --output="nginx_1.21.3.tar" server-docker-nginx-1
docker import
从tarball导入内容以创建文件系统映像(tarball 即 Tar包(Tarball))
https://docs.docker.com/engine/reference/commandline/import/
docker import https://example.com/exampleimage.tgz chudaozhe/nginx:test1
cat exampleimage.tgz | docker import - exampleimagelocal:new
cat exampleimage.tgz | docker import --message "New image imported from tarball" - exampleimagelocal:new
docker import /path/to/exampleimage.tgz chudaozhe/nginx:test1
sudo tar -c . | docker import - exampleimagedir
sudo tar -c . | docker import --change "ENV DEBUG=true" - exampleimagedir
备份、恢复或迁移数据卷
https://docs.docker.com/storage/volumes/#back-up-restore-or-migrate-data-volumes
备份
#创建一个名为dbstore的新容器
docker run -v /dbdata --name dbstore ubuntu /bin/bash
#...上面容器运行一段时间,dbdata卷已经产生了数据
#备份dbdata卷到/backup目录
docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
恢复
#创建一个名为dbstore2的新容器
docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
#恢复备份
docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1" 2️⃣
备注
1️⃣ 比如nginx
docker-compose.yml
...
restart: always
tty: true
command:
- /bin/bash
- -c
- nginx -g "daemon off;"
volumes:
...
2️⃣ --strip 1:tar解压删除上层目录 需求
使用tar解压文件,需要移除第一层目录,例如
package
└── target
└── vsomeip.json
转化为
target └── vsomeip.json
实现
使用tar --strip
参数
tar xvf xxxx.tar.gz --directory /your/path --strip 1