ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

docker 镜像 数据卷

2022-05-14 17:31:42  阅读:127  来源: 互联网

标签:容器 root nginx 挂载 镜像 docker 数据


docker镜像就是由一层一层的文件系统组成 这种层次的文件系统就叫unionfs

联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

*下载一个nginx tomcat ,nginx tomcat有一个共有的文件系统 ,nginx下载后 再下载tomcat 就不用再下载那个共有的文件系统了

Docker的镜像实际由一层一层的文件系统组成:

bootfs(boot file system)主要包含bootloader和kernel。bootloader主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,系统卸载bootfs。可以被不同的Linux发行版公用。
rootfs(root file system),包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,Centos等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。
分层理解
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层。
容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pl8V3F3J-1628648977536)(Docker学习笔记(中)].assets/image-20210805151534296.png)

docker镜像都是只读的 当容器启动时,一个新的可写层被加载到镜像的顶部,这一层叫容器层,其下的都叫镜像层

docker commit 提交容器成为一个新的镜像(副本)

docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:版本

启动一个默认的tomcat 自己拷贝webapps.dist到webapps 使其可以正常访问

[root@shuju ~]# docker exec -it e8b28ad6a291 /bin/bash
root@e8b28ad6a291:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@e8b28ad6a291:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@e8b28ad6a291:/usr/local/tomcat# ls webapps
ROOT  docs  examples  host-manager  manager
root@e8b28ad6a291:/usr/local/tomcat#

[root@shuju ~]# docker commit -a="feng" -m="add wepadds" e8b28ad6a291 tomcatfeng:1   #提交其为一个新的镜像
sha256:ae9ae7d32705fccc046668dc2517e863af56e8d02106dad27f595baabe727787

[root@shuju ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
tomcatfeng            1         ae9ae7d32705   20 seconds ago   684MB
nginx                 latest    fa5269854a5e   3 weeks ago      142MB
tomcat                latest    fb5657adc892   4 months ago     680MB

容器数据卷

什么是容器数据卷?(容器内的目录挂载到虚拟机上)

为了实现数据持久化,使容器之间可以共享数据。可以将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。

使用容器数据卷

  直接使用命令 -v

docker run -it -v 主机内目录:容器内目录 镜像名/id

docker run -it -v /root/feng/:/home  -v /root/feng1:/etc centos /bin/bash 可以用多个-v映射多个目录 

当你在容器home文件夹里创建文件时 虚拟机里相关挂载目录也会出现创建的文件 反之亦然(无论容器是开启还是关闭只要不删就行,容器删除后linux文件还会存在)

docker inspect f0d7efcb77a1  查看元数据 mount显示挂载目录相关信息

        "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/feng",   #linux
                "Destination": "/home",  #容器
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

mysql  设置mysql root 初始密码 -e mysql_root_password=

 docker run -d -p 3306:3306 -v /root/mysql/my.cnf:/my.cnf -v /root/mysql/data:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=123 --name mysql01 mysql:5.7

具名和匿名挂载

匿名挂载 :docker run -d -v 容器内目录 镜像名/id # 匿名挂载

 docker run -d -P --name nginx01 -v /etc/nginx nginx #-P随机指定容器端口

docker volume --help

  create      Create a volume        #创建一个卷
  inspect     Display detailed information on one or more volumes#显示一个或多个卷的详细信息
  ls          List volumes   #列出卷
  prune       Remove all unused local volumes  #删除所有未使用的本地卷
  rm          Remove one or more volumes  #删除一个或多个卷

[root@shuju ~]# docker volume ls
DRIVER    VOLUME NAME
local     7d7eee1ce61a500bfb1ec5041d0b1a9c1e508d1b512b2399a1ca2a7be6cfeb22
local     9ae5ea370c7cd11514447bb2f85189e72a1d342a197b9a3ea696d1104555e750
local     55a79a6e29e562b75a1d49c17196b544d3458f4956c38b6bfe2472aec4960365
local     081da36e6a4a3936fcbd39d190dc014c0a28e89d2b33b8bdcdec06ee0eb81f4f
local     f594291f4f463c06088b3bd0b820a93c37c49f9b8947e90c9e56f4afef1836e2

匿名目录挂载只需要写容器内目录或者文件即可,而宿主机对应的目录会在/var/lib/docker/volumes路径下生成

不论是具名匿名,没有指定宿主机目录 所有的卷默认挂载到/var/lib/docker/volumes目录

 "Mounts": [
            {
                "Type": "volume",
                "Name": "7d7eee1ce61a500bfb1ec5041d0b1a9c1e508d1b512b2399a1ca2a7be6cfeb22",
                "Source": "/var/lib/docker/volumes/7d7eee1ce61a500bfb1ec5041d0b1a9c1e508d1b512b2399a1ca2a7be6cfeb22/_data", #挂载目录
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

具名挂载:docker run -d -v 卷名:容器内目录 镜像名/id # 具名挂载

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

[root@shuju volumes]# docker volume ls
DRIVER    VOLUME NAME
local     7d7eee1ce61a500bfb1ec5041d0b1a9c1e508d1b512b2399a1ca2a7be6cfeb22
local     9ae5ea370c7cd11514447bb2f85189e72a1d342a197b9a3ea696d1104555e750
local     55a79a6e29e562b75a1d49c17196b544d3458f4956c38b6bfe2472aec4960365
local     081da36e6a4a3936fcbd39d190dc014c0a28e89d2b33b8bdcdec06ee0eb81f4f
local     f594291f4f463c06088b3bd0b820a93c37c49f9b8947e90c9e56f4afef1836e2
local     juming-nginx   #卷名

[root@shuju volumes]# docker volume inspect juming-nginx  #显示卷的详细信息
[
    {
        "CreatedAt": "2022-05-14T23:06:13+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

-v 容器内路径 #匿名挂载

-v 卷名:容器内路径 #具名挂载

-v /宿主机路径:容器内路径 #指定路径挂载

容器内文件权限设置

ro #只读权限  设置只读 容器内部无法操作此文件,只能通过宿主机来操作文件

rw #读写权限

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

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

dockerfile

Dockerfile是用来构建docker镜像的文件

在宿主机的 /root目录下创建一个DockerFile文件,并添加如下内容到文件中

#基于centos镜像进行构建 FROM centos

#数据卷只能指定容器数据卷,不能指定宿主机数据卷,英文并不能够保证在所有的宿主机上都存在这样的特定目录。

VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

#以 /bin/bash方式启动

CMD /bin/bash

把编写的DockerFile文件执行生成镜像

docker build -f 宿主机中DockerFile文件的绝对路径 -t 新镜像名称[:版本号] .  #最后的.不要忽略

运行我们生成的new-centos镜像,就能够查看到在容器内中生成的数据卷

docker inspect 容器ID/容器名称  #找mount 找到挂载文件目录

数据卷容器 

--volumes-from 数据卷容器id/名(父容器)#要想使用--volumes-from 其父容器(数据卷容器必须要由 数据卷 -v 挂载目录)

最高级的父容器必须要用挂载目录   无论停止或删除那个容器,其他两个 还可以实现/home的同步

 docker run -it -P -v /home --name centos1 centos /bin/bash

docker run -it -P --name centos2 --volumes-from centos1 centos

docker run -it -P --name centos3 --volumes-from centos2 centos

 

标签:容器,root,nginx,挂载,镜像,docker,数据
来源: https://www.cnblogs.com/feng2039/p/16264572.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有