Docker镜像的导出、导入、容器的数据保存问题-数据持久化
一、镜像的概念
- Docker 包含三个基本概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是Docker的核心。
- 镜像(Image)是docker的三大核心概念
- 镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件的所有内容,包括代码,运行时,库,环境变量和配置文件。
二、导入导出镜像的方法
1.导出镜像
- 首先 新建 / 启动一个乌班图容器
root@root:/home/puleya# docker run -it --name ubuntu-sc-1 -d ubuntu
- export导出镜像 导出正在运行的容器里的文件系统成一个归档文件 是动态的
docker export -o name.tar ubuntu-sc-2
这里的ubuntu-sc-2是我们自己新建的容器名字
示例如下
root@root:/home/puleya# docker export -o sc-ubuntu2.tar ubuntu-sc-2
root@root:/home/puleya# ls
sc-ubuntu2.tar
- .另外一种导出镜像的方式 save(保存) 是导出docker本地的静态
docker save -o name.tar ubuntu
这里的ubuntu是我们镜像的名字
示例如下
root@root:/home/puleya# docker save -o sc-ubuntu.tar ubuntu
root@root:/home/puleya# ls
sc-ubuntu.tar sc-ubuntu2.tar
2.导入镜像
这里我们一般会将导出的镜像传入另一台机器去另一台机器进行导入
将tar文件传入另一台机器的方法如下
root@root:/home/puleya# scp sc-ubuntu.tar root@192.168.2.32:/root
The authenticity of host '192.168.2.32 (192.168.2.32)' can't be established.
ECDSA key fingerprint is SHA256:gNa7HrrZRixx5+oPrh8WEvFSI5vEUWphGuSF34URMhw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.2.32' (ECDSA) to the list of known hosts.
root@192.168.2.32's password:
sc-ubuntu.tar
不同的导出方式会对应不同的导入方法
- 使用export方法导出的使用import导入
root@root:/home/puleya# docker import sc-ubuntu2.tar
- 使用save导出的使用load方式加载
[root@kafka02 ~]# docker load -i sc-ubuntu.tar
7555a8182c42: Loading layer [==================================================>] 75.16MB/75.16MB
Loaded image: ubuntu:latest
三、容器的数据保存问题-数据持久化
要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。这是官方给出的三种实现方式的结构图
这里我们讲解一下最常见的方法:数据卷(volume)
说到这个问题,我们必须要先引入数据卷(volume)的概念
- 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用,可以实现一台机器上的容器和宿主机之间的数据共享
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除,故方便备份恢复
- 数据卷是存放数据的地方 数据存放在 /var/lib/docker/volumes/
[root@kafka02 web]# docker volume create sc # 创建数据卷
sc
[root@kafka02 web]# docker volume ls
DRIVER VOLUME NAME
local sc
挂载
法一
docker run --name xxxx -p 8888:8888 -v /my:/docker -it imagename /bin/bash
- -v:宿主机目录:docker目录 (必须为绝对路径)
- imagename:镜像名字
法二
使用卷:是容器去使用卷
docker run -d \
--name sc-nginx-1 \
--mount source=sc,target=/usr/share/nginx/html \ sc事先不新建会默认自动新建
-p 7790:80\
nginx:latest
- –name: 为容器起名
- source后接数据卷的名字,target后接绝对路径
- -p:宿主机端口:docker端口 (端口映射,不能重复)
法二
docker run --name xxxx -p 8888:8888 -v /my:/docker -it imagename /bin/bash
- -v:宿主机目录:docker目录 (必须为绝对路径)
- imagename:镜像名字
查看卷的详细信息
一般docker查看详细信息都是 docker inspect 组合 想看什么就接什么的属性+名字
比如查看一个容器的详情就是 docker container inspect sc-nginx-1
[root@kafka02 _data]# docker volume inspect sc
[
{
"CreatedAt": "2021-08-12T16:38:05+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/sc/_data",
"Name": "sc",
"Options": {},
"Scope": "local"
}
]
具体查看某个容器的卷的信息
[root@kafka02 _data]# docker container inspect rose-1|grep volume -C 5
多容器是否可以使用一个卷
[root@kafka02 _data]# docker run -d --name rose-1 --mount source=sc,target=/usr/share/nginx/html -p 7777:80 nginx:latest
a81dcd86768d28b44ed18ad64ee517b4e6a4c061735858fe0c08fed86ba89c73
[root@kafka02 _data]# docker run -d --name rose-2 --mount source=sc,target=/usr/share/nginx/html -p 7778:80 nginx:latest
5f71ed0f2015bef183c5c185b01cbec3d8df203888676f48322fbc95f8fdeb11
这里用的数据卷全部是source=sc,操作成功
- 所以多容器可以使用一个卷,从而达到了文件夹共享,数据一致