Docker笔记-容器数据卷

news/2024/9/20 20:32:56 标签: docker

Docker笔记-容器数据卷

docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器

之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一

部分保存下来,那么当容器被删除之后,数据也就没了,为了能够保存数据,在docker容器中使用卷。卷就是目

录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些

用于持久化数据或共享数据的特点。

添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过dockerFile添加。

1、通过命令挂载

$ docker run -it -v /宿主机绝对路径目录:/容器内目录  镜像名

1.1 指定路径挂载

# 获取镜像
$ docker pull mysql:5.7

在这里插入图片描述

# 启动MySQL
# -d 后台运行
# -p 端口映射
# -v 卷挂载
# -e 环境配置
# --name 容器名字
$ docker run -d -p 3306:3306 -v /home/zhangshixing/work/linuxmysql/conf:/etc/mysql/conf.d -v /home/zhangshixing/work/linuxmysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name zsxmysq1 mysql:5.7

在这里插入图片描述

在这里插入图片描述

1.2 匿名挂载

$ docker pull nginx
[root@zsx linuxmysql]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
eff15d958d66: Pull complete 
1e5351450a59: Pull complete 
2df63e6ce2be: Pull complete 
9171c7ae368c: Pull complete 
020f975acd28: Pull complete 
266f639b35ad: Pull complete 
Digest: sha256:097c3a0913d7e3a5b01b6c685a60c03632fc7a2b50bc8e35bcaa3691d788226e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
# -v容器内路径
$ docker run -d -P --name mynginx -v /ect/nginx nginx

在这里插入图片描述

# 查看所有的volume的情况
$ docker volume ls
[root@zsx linuxmysql]# docker volume ls
DRIVER    VOLUME NAME
local     9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b
local     50ea91e78556e99ee7a0ae4fb62e97b83c92e70aec54bb3b5a1038fa093c4555
local     629aa14a8191229b0b52b17198400ca69c6391285b6917a9a447bb8f58fd2a75
local     a542052cdf3ee37e072281e2d5c66b512a6db5f286a2cc5c6a1c5b442c93eaa8
local     my_wordpress_db_data
local     my_wordpress_wordpress_data

1.3 具名挂载

$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

在这里插入图片描述

$ docker volume ls
root@zsx linuxmysql]# docker volume ls
DRIVER    VOLUME NAME
local     9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b
local     50ea91e78556e99ee7a0ae4fb62e97b83c92e70aec54bb3b5a1038fa093c4555
local     629aa14a8191229b0b52b17198400ca69c6391285b6917a9a447bb8f58fd2a75
local     a542052cdf3ee37e072281e2d5c66b512a6db5f286a2cc5c6a1c5b442c93eaa8
local     juming-nginx
local     my_wordpress_db_data
local     my_wordpress_wordpress_data
# 可以得到在宿主机上的卷的位置
$ docker volume inspect juming-nginx
[root@zsx linuxmysql]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-11-18T17:44:10+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
[root@zsx linuxmysql]# docker volume inspect 9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b
[
    {
        "CreatedAt": "2021-11-18T17:39:09+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b/_data",
        "Name": "9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b",
        "Options": null,
        "Scope": "local"
    }
]

如何确定是具名挂载还是匿名挂载,还是指定路径挂载:

-v 容器内路径              # 匿名挂载
-v 卷名:容器内路径          # 具名挂载
-v 宿主机路径::容器内路径    # 指定路径挂载

通过-v 容器内路径:ro rw 改变读写权限:

ro    readonly   # 只读
rw    readwrite  # 可读可写
# 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作
$ docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

2、通过DockerFile添加

Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

# 创建一个Dockerfile文件,名字可以随机,建议Dockerfile
# 文件中的指令(大写)
# 这里的每个命令,就是镜像的一层
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "Hello World!!!"
CMD /bin/bash
# zsx242030/centos:1.0是登录的情况下
$ docker build -f /home/zhangshixing/work/volumetest/dockerfile -t zsx242030/centos:1.0 .
# 没有登录的情况下
$ docker build -f /home/zhangshixing/work/volumetest/dockerfile -t centos:1.0 .
[root@zsx volumetest]# docker build -f /home/zhangshixing/work/volumetest/dockerfile -t centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in e77e19d82b76
Removing intermediate container e77e19d82b76
 ---> 0f77fb23826b
Step 3/4 : CMD echo "Hello World!!!"
 ---> Running in 456e49681cf3
Removing intermediate container 456e49681cf3
 ---> 055a082db43e
Step 4/4 : CMD /bin/bash
 ---> Running in babb5220e85c
Removing intermediate container babb5220e85c
 ---> 02f263acec53
Successfully built 02f263acec53
Successfully tagged centos:1.0
[root@zsx volumetest]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
centos       1.0       02f263acec53   30 seconds ago   231MB
nginx        latest    ea335eea17ab   26 hours ago     141MB
mysql        5.7       8b43c6af2ad0   26 hours ago     448MB
centos       latest    5d0da3dc9764   2 months ago     231MB
ubuntu       15.10     9b9cb95443b5   5 years ago      137MB

3、数据卷容器进行数据的双向同步

# 启动之后会有两个容器卷
$ docker run -it --name docker01 centos:1.0
[root@zsx work]# docker run -it --name docker01 centos:1.0
[root@33acc58bfa50 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
$ docker run -it --name docker02 --volumes-from docker01 centos:1.0
[root@zsx work]# docker run -it --name docker02 --volumes-from docker01 centos:1.0
[root@3499fc3a4a5b /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01

docker01中的volume01中新建一个a.txt文件

[root@33acc58bfa50 /]# cd volume01/
[root@33acc58bfa50 volume01]# touch a.txt
[root@33acc58bfa50 volume01]# ls
a.txt

docker02中的volume01中查看

[root@3499fc3a4a5b /]# cd volume01/
[root@3499fc3a4a5b volume01]# ls
a.txt
[root@3499fc3a4a5b volume01]# 

docker02中的volume02中新建b.txt文件

[root@3499fc3a4a5b volume01]# cd ../volume02
[root@3499fc3a4a5b volume02]# touch b.txt
[root@3499fc3a4a5b volume02]# ls
b.txt

docker01中的volume02中查看

[root@33acc58bfa50 volume01]# cd ../volume02/
[root@33acc58bfa50 volume02]# ls
b.txt

只要有一个容器在运行,数据就会在。

[root@zsx test]# docker inspect 02f263acec53
[
    {
        "Id": "sha256:02f263acec53fd4b71a01dc0b194e91ba90069fc1b98c825758c6995e7d4fb3e",
        "RepoTags": [
            "centos:1.0"
        ],
        "RepoDigests": [],
        "Parent": "sha256:055a082db43e9f890e5abd27847eb0a950e9ee76f54eff0d54d8b19e5c2d9f56",
        "Comment": "",
        "Created": "2021-11-18T12:28:21.778839806Z",
        "Container": "babb5220e85cd98c6b7267d99b0b8d4372012218f6276d65b9b994e63872e7a2",
        "ContainerConfig": {
            "Hostname": "babb5220e85c",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/sh\" \"-c\" \"/bin/bash\"]"
            ],
            "Image": "sha256:055a082db43e9f890e5abd27847eb0a950e9ee76f54eff0d54d8b19e5c2d9f56",
            "Volumes": {
                "volume01": {},
                "volume02": {}
            },
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "DockerVersion": "20.10.10",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "/bin/bash"
            ],
            "Image": "sha256:055a082db43e9f890e5abd27847eb0a950e9ee76f54eff0d54d8b19e5c2d9f56",
            "Volumes": {
                "volume01": {},
                "volume02": {}
            },
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 231268856,
        "VirtualSize": 231268856,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/38db170a6092df8b72f4c87a12fc9936436f6fb360e19ad69a96a7e084b9bd3a/merged",
                "UpperDir": "/var/lib/docker/overlay2/38db170a6092df8b72f4c87a12fc9936436f6fb360e19ad69a96a7e084b9bd3a/diff",
                "WorkDir": "/var/lib/docker/overlay2/38db170a6092df8b72f4c87a12fc9936436f6fb360e19ad69a96a7e084b9bd3a/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59"
            ]
        },
        "Metadata": {
            "LastTagTime": "2021-11-18T20:28:21.791051431+08:00"
        }
    }
]

http://www.niftyadmin.cn/n/5667596.html

相关文章

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第二篇-着色器制作】

在上一篇文章中,我们已经理顺了实现流程。 接下来,我们将在UE5中,从头开始一步一步地构建一次流程。 通过这种方法,我们可以借助一个熟悉的开发环境,使那些对着色器不太熟悉的朋友们更好地理解着色器的工作原理。 这篇…

使用SonarQube扫描ESP32项目,如何生成build-wrapper-dump.json

众所周知,ESP32项目一般使用乐鑫官方的IDF环境进行编译调试。以Windows为例,编译流程为先运行export.ps1加载虚拟环境和环境变量,然后运行idf.py build。 而SonarQube扫描需要使用build-wrapper对编译过程进行一次“监视”或者说分析&#x…

SpringCloud Alibaba 工程搭建详细教程

使用 Spring Cloud Alibaba 的主要目的是解决单体应用的痛点,并利用微服务架构的优势来构建高扩展性、可靠的分布式系统。 1. 单体应用的痛点 单体应用虽然在小型项目中优势明显,但随着业务复杂性增加,逐渐暴露出许多问题: 代码…

【4】AT32F437 OpenHarmony轻量系统移植教程(1)

开源地址:https://gitee.com/AT32437_OpenHarmony 1.学习本文档的意义 1.学习移植OpenHarmony轻量系统到AT32全系列mcu上,本文档移植的具体型号为AT32F437ZMT7 2.学习OpenHarmony轻量系统开发 2.移植前的准备工作 1.移植之前必须要先熟悉AT-START-F…

【C++ 学习】多态的基础和原理(10)

目录 前言1. 概念2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数重写2.4 虚函数重写的例外2.4.1 协变2.4.1 析构函数的重写 2.5 多态调用和普通调用2.6 函数重写/函数隐藏/函数重载 的对比2.6.1 函数重写2.6.2 函数隐藏2.6.3 函数重载 2.7 C11 final 和override 3…

[c++进阶(八)]STL容器适配器之queue

1.前言 和stack一样,队列也没有把他放在容器的一栏里面,而是把他放在容器适配器的一栏。这也是因为queue是使用了别人的相关接口,空间然后来封装自己的内容,最后再给上层用户使用。 2.队列 队列的性质就是先进先出,他…

ros2学习,仿真1

urdf标签: 1.robot:这是 URDF 文件的根标签,定义整个机器人的名称,并包含所有关于机器人的信息。 <robot name="my_robot"><!-- 这里是链接和关节的定义 --> </robot>2.link:标签用于定义机器人的一个部件(例如:底盘、轮子、机械臂)。每个…

cmake--find_package_handle_standard_args

作用 用于验证包的所有指定的变量是否都是有效的结果&#xff1b; 如果都是有效的&#xff0c;就人为包已经找到&#xff0c;则一切正常&#xff1b; 如果有变量的值是否定的&#xff0c;空的&#xff0c;无效的&#xff0c;则人为这个包没有找到&#xff0c;则 使用 FindP…