Bootstrap

[docker]五、docker镜像的导入和导出、数据的持久化(volumes数据卷和mount挂载)

目录

1、导入和导出

1.1、docker save -o + 生成打包文件名  打包文件

1.1.1、docker load -i + 压缩包

1.2、docker export -o +生成打包文件名  容器名字

1.2.1、docker import  + 生成打包文件名 + [标识]

2、数据的持久化(data persistence)

2.1、数据存储面试小问题

2.1.1、正常停止容器,容器里的数据会丢失吗?

2.2、volumes数据卷

2.2.1、使用卷的优势

2.2.2、浅玩一下"卷"

2.2.3、使用卷的几种方法

2.3、mount挂载


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数据卷

参考文档 :Use volumes | Docker Documentation

  • 存放数据的地方
  • 可以实现容器和数据卷之间的数据共享
  • 方便备份恢复
  • 一台机器上的容器和宿主机之间的数据共享
  • 如果是多台机器,背后需要使用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挂载

就是把宿主机里的数据映射到容器里边,只要我们动容器里边的数据,就是动的宿主机里边的数据。只要容器一关闭,那么数据会存在宿主机里边,这就保证了数据的不会丢失。

🍓[不与宿主机挂载的情况]🍓

🍓[与宿主机挂载的情况]🍓 

若是宿主机里的网页文件发生了修改,那么容器里的文件也会发生修改,这就说明了挂载可以实现资源共享。

3、挂载总体图

;