目录
1.1、docker save -o + 生成打包文件名 打包文件
1.2、docker export -o +生成打包文件名 容器名字
1.2.1、docker import + 生成打包文件名 + [标识]
1、导入和导出
情景引入:
这种方法可以应用于B不能上网,但是又急需这个镜像,所以需要从A中导入导出。或者说是A有一个独家的镜像,网上都没有这个,B需要,那么就使用导入导出。
案例引入:
# 启动Ubuntu
root@dockerserever:~# docker run -it --name ubuntu-fan -d ubuntu
749818f10d5f37cf5413e9842138052e3a8b022117bb1b32a5a7c84ac1b278ba
root@dockerserever:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
749818f10d5f ubuntu "bash" 7 seconds ago Up 6 seconds ubuntu-fan
root@dockerserever:~# docker exec -it ubuntu-fan /bin/bash # 进入容器内部
root@749818f10d5f:/# cat /etc/issue
Ubuntu 20.04.4 LTS \n \l
root@749818f10d5f:/# apt list # 可以查看Ubuntu里边安装了哪些软件
# 启动centos7
[root@centos7-docker lianxi]# docker run -it -d --name handsome-centos7 centos/python-35-centos7 /bin/bash
2a0d68c812b08122c8f0cb08447f69dd6ddd0810a45a24e693581e7d388f1c3e
[root@centos7-docker lianxi]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a0d68c812b0 centos/python-35-centos7 "container-entrypoin…" 9 seconds ago Up 8 seconds 8080/tcp handsome-centos7
注意:docker启动centos容器的时候,要加上-it,容器起来之后,让第一个程序"/bin/bash"一直运行;若是没有加,/bin/bash会运行一下之后就停止容器的使用。
[root@centos7-docker ~]# docker run -d --name test-1 centos/python-35-centos7 /bin/bash
75ea803025215246bfaf0a6780df9161d3e39c0cb63f641968be2e808a871e66
[root@centos7-docker ~]# docker ps -a |grep test-1
75ea80302521 centos/python-35-centos7 "container-entrypoin…" 10 seconds ago Exited (0) 8 seconds ago test-1
[root@centos7-docker ~]# docker run -it -d --name test-2 centos/python-35-centos7 /bin/bash
75d94dc55ef6c5e50e6985f7e9058d2e3cfef73875c0f28024afdd53f6a857dc
[root@centos7-docker ~]# docker ps -a |grep test-2
75d94dc55ef6 centos/python-35-centos7 "container-entrypoin…" 3 seconds ago Up 2 seconds 8080/tcp test-2
🍓 [docker top + 容器名字]🍓
查看容器里运行的进程
[root@centos7-docker ~]# docker top test-2
UID PID PPID C STIME TTY TIME CMD
1001 2412 2393 0 21:00 pts/0 00:00:00 /bin/bash
1.1、docker save -o + 生成打包文件名 打包文件
导出镜像,这个导出的镜像是docker本地的静态镜像。
# 导出镜像
root@dockerserever:~# docker save -o fan-ubuntu.tar ubuntu # 将Ubuntu镜像打包
root@dockerserever:~# ls
fan-ubuntu.tar snap
# 将这个镜像包传给192.168.29.131
Croot@dockerserever:~# scp fan-ubuntu.tar [email protected]:/root/lianxi
The authenticity of host '192.168.29.131 (192.168.29.131)' can't be established.
ECDSA key fingerprint is SHA256:D03XNUmMdCVcuY9Z/Paep9OV6Frwgs2OqM/1B1mySqg.
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added '192.168.29.131' (ECDSA) to the list of known hosts.
[email protected]'s password:
fan-ubuntu.tar
下面这个是192.168.29.131这台机器
1.1.1、docker load -i + 压缩包
导入镜像
[root@centos7-docker lianxi]# docker images|grep ubuntu
[root@centos7-docker lianxi]# docker load -i fan-ubuntu.tar
c5ec52c98b31: Loading layer 75.14MB/75.14MB
Loaded image: ubuntu:latest
[root@centos7-docker lianxi]# docker images|grep ubuntu
ubuntu latest 825d55fb6340 11 days ago 72.8MB
1.2、docker export -o +生成打包文件名 容器名字
导出正在运行的容器里的文件系统成一个归档文件
# 导出这个动态的docker容器
root@dockerserever:~# docker export -o fan-ubuntu-changed.tar ubuntu-fan
root@dockerserever:~# ls
fan-ubuntu-changed.tar fan-ubuntu.tar snap
# 把这个压缩包传给别的机器
root@dockerserever:~# scp fan-ubuntu-changed.tar [email protected]:/root/lianxi
[email protected]'s password:
fan-ubuntu-changed.tar 100% 72MB 69.3MB/s 00:01
1.2.1、docker import + 生成打包文件名 + [标识]
导入动态的镜像。这个标识可以自定应
[root@centos7-docker lianxi]# docker import fan-ubuntu-changed.tar ubuntu-fan:best-
[root@centos7-docker lianxi]# docker images|grep fan
ubuntu-fan best-handsome 555c222f03a8 10 seconds ago 72.8MB
上面的打包过程都是在Ubuntu的容器里打包的,下面演示在centos7容器中打包
2、数据的持久化(data persistence)
就是把数据保存在磁盘里
2.1、数据存储面试小问题
2.1.1、正常停止容器,容器里的数据会丢失吗?
答:不会丢失,会保存在"/var/lib/docker/volumes/"
2.2、volumes数据卷
- 存放数据的地方
- 可以实现容器和数据卷之间的数据共享
- 方便备份恢复
- 一台机器上的容器和宿主机之间的数据共享
- 如果是多台机器,背后需要使用nfs、NAS、SAN、云存储等网络存储解决
2.2.1、使用卷的优势
卷是保存Docker容器生成和使用的数据的首选机制。同时绑定安装依赖于主机的目录结构和操作系统,卷完全由Docker管理。与绑定装载相比,卷有几个优势:
- 卷比绑定装载更容易备份或迁移。
- 可以使用Docker CLI命令或Docker API管理卷。
- 卷可以在Linux和Windows容器上工作。
- 多个容器之间可以更安全地共享卷。
- 卷驱动程序允许您在远程主机或云提供商上存储卷,以加密卷的内容,或添加其他功能。
- 新卷可以使用容器预先填充其内容。
- Docker Desktop上的卷比Mac和Windows主机上的绑定装载具有更高的性能。
2.2.2、浅玩一下"卷"
🍓[制作一个卷]🍓
[root@centos7-docker ~]# docker volume create FanMY # 创建一个卷
FanMY
[root@centos7-docker ~]# docker volume ls # 查看卷
DRIVER VOLUME NAME
local FanMY
[root@centos7-docker _data]# docker volume inspect FanMY # 查看卷的详细信息
[
{
"CreatedAt": "2022-04-19T20:17:58+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/FanMY/_data",
"Name": "FanMY",
"Options": {},
"Scope": "local"
}
]
[root@centos7-docker _data]# pwd
/var/lib/docker/volumes/FanMY/_data
[root@centos7-docker _data]# cp /usr/share/nginx/html/* . # 把宿主机的网页文件复制到卷里边
[root@centos7-docker _data]# ls
fan.gif index.html myself.jpg study.html
使用卷并且查看结果
# 里边跑的程序就是监听80端口的,外边的端口你可以随便指定,但是里边的端口一定要使用80端口
[root@centos7-docker _data]# docker run -d --name fan-nginx-1 --mount source=FanMY,target=/usr/share/nginx/html -p 7790:80 daocloud.io/nginx
8d5390c5335a4225bcda251597765c4c949f8a0b2c209712b0e189ecaa5b5bc3
# 查看这个容器的挂载内容属性
[root@centos7-docker _data]# docker inspect fan-nginx-1|grep -A 20 Mounts
--
"Mounts": [
{
"Type": "volume",
"Name": "FanMY",
"Source": "/var/lib/docker/volumes/FanMY/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
多容器可以使用一个卷,达到文件共享的目的;卷内的nginx内容才是影响我们页面内容的因素。
2.2.3、使用卷的几种方法
# 第一种
docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
# 第二种
docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
2.3、mount挂载
就是把宿主机里的数据映射到容器里边,只要我们动容器里边的数据,就是动的宿主机里边的数据。只要容器一关闭,那么数据会存在宿主机里边,这就保证了数据的不会丢失。
🍓[不与宿主机挂载的情况]🍓
🍓[与宿主机挂载的情况]🍓
若是宿主机里的网页文件发生了修改,那么容器里的文件也会发生修改,这就说明了挂载可以实现资源共享。