DOCKER02_镜像如何存储、镜像加载原理、容器数据卷、可视化界面-Portainer

本文主要是介绍DOCKER02_镜像如何存储、镜像加载原理、容器数据卷、可视化界面-Portainer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • ①. 镜像如何存储
  • ②. 镜像加载原理
  • ③. 容器如何挂载 volume、bindmount、temfsmount
    • ①. 每一个容器里面的内容,支持三种挂载方式
    • ②. 直接挂载 volume(卷)
    • ③. 手动挂载 bind mount
    • ④. 使用总结
  • ④. 可视化界面-Portainer

①. 镜像如何存储

  • ①. 使用命令docker image inspect nginx,出现如下信息
    在这里插入图片描述
  • ②. LowerDir:底层目录,diff(只是存储不同),包含小型linux和装好的软件(倒着看)
  1. 小linux系统(FROM apline)+ Dockerfile的每一个命令可能都引起了系统的修改,所以和git一样只记录变化
  2. 我们进入到这个镜像启动的容器,容器的文件系统就是镜像的(解释见下面的图)
  3. docker ps -s:可以看到这个容器真正用到的文件大小(可以看到只用到了1.12kb)
(4). 用户文件: /var/lib/docker/overlay2/67b3802c6bdb5bcdbcccbbe7aed20faa7227d584ab37668a03ff6952e 631f7f2/diff
(3). nginx的启动命令放在这里:/var/lib/docker/overlay2/f56920fac9c356227079df41c8f4b056118c210bf4c50bd9bb077bdb4 c7524b4/diff
(2). nginx的配置文件在这里: /var/lib/docker/overlay2/0e569a134838b8c2040339c4fdb1f3868a7118dd7f4907b40468f5fe6 0f055e5/diff
(1). 小linux系统: /var/lib/docker/overlay2/2b51c82933078e19d78b74c248dec38164b90d80c1b42f0fdb1424953 207166e/diff

在这里插入图片描述在这里插入图片描述

  • ③. 写实复制:容器会自己建立层;如果想要改东西,把改的内容复制到容器层即可 docker inspect container
    (当我们启动一个容器的时候,容器中的配置文件发生了改变:如在nginx.conf 后面追加了1111,这个时候容器首先会将镜像中的nginx.conf文件复制到自己的容器中,如果有发生文件修改,这个时候会在容器的upperdir层也新建一个nginx.conf文件,然后对容器中建立的nginx.conf进行追加操作)
    注意:无论容器如何修改,基于这个容器的底层的镜像永远不会改变的,增删改永远只能修改到容器层
    在这里插入图片描述

  • ④. 镜像为容器提供了一个基础的文件系统,容器是否在运行中,只要引用了镜像,都不能进行删除的处理!但是可以使用强制删除 -f 参数进行处理

  • ⑤. UpperDir 上层目录:数据卷在容器层产生,所有的增删改都在容器层

  • ⑥. MergedDir:合并目录:容器最终的完整工作目录全内容都在合并层
    (我们在使用file1的时候,会先在upperdir中查看,如果有就用upperdir中的,如果没有就用lowdir中的)
    在这里插入图片描述

  • ⑦. WorkDir:工作目录(临时层)

②. 镜像加载原理

  • ①. 镜像的存储方式有很多中,如下图所示,目前docker使用的是overlayFS

在这里插入图片描述

在这里插入图片描述

  • ②. 新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层
    在这里插入图片描述

  • ③. 为什么 Docker 镜像要采用这种分层结构呢
    最大的一个好处就是 - 共享资源
    比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享

  • ④. 如下图所示:使用ubuntu 15.04镜像启动一个容器。容器的存储空间由两部分组成,底层是镜像层,顶部是容器层。镜像层是只读层,容器层是可读写层。容器运行时,涉及文件写的操作,都是在容器层中完成的

在这里插入图片描述

在这里插入图片描述

  • ⑤. 镜像为什么能长久运行?
    镜像启动一定得有一个阻塞的进程,一直干活,在这里代理
    docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
    docker run --name myredis2 -p 6379:6379 -p 8888:6379 redis
    镜像启动以后做镜像里面默认规定的活

  • ⑥. docker启动一个MySQL,默认什么都不做?
    (MySQL就会丢失数据,我们可以使用文件挂载的方式,或者是docker commit:能提交,MySQL的容器,也能提交。100G、100G)

③. 容器如何挂载 volume、bindmount、temfsmount

①. 每一个容器里面的内容,支持三种挂载方式

  • ①. docker自动在外部创建文件夹自动挂载容器内部指定的文件夹内容(Dockerfile VOLUME指令的作用)

  • ②. 自己在外部创建文件夹,手动挂载(以/开头的)

  • ③. 可以把数据挂载到内存中(基本不用)

  • ④. Volumes(卷):存储在主机文件系统的一部分中,该文件系统由Docker管理(在Linux上的根目录是"/var/lib/docker/volumes/"(非Docker进程不应修改文件系统的这一部分,卷是在Docker中持久存储数据的最佳方法
    Bind mounts(绑定挂载) 可以在任何地方存储在主机系统上。它们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时对其进行修改
    tmpfs mounts(临时挂载) 仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统

在这里插入图片描述

  • ⑤. 管理卷(容器卷是用来做持久化处理的,有点类似我们Redis里面的rdb和aof文件)
  1. docker volume create xxx:创建卷名
  2. docker volume inspect xxx:查询卷详情
  3. docker volume ls: 列出所有卷
  4. docker volume prune: 移除无用卷

②. 直接挂载 volume(卷)

  • ①. 具名卷使用 不以/开头的路径,Docker容器内部绝对路径:叫绑定(docker会自动管理,docker不会把他当前目录,而把它当前卷)
    docker run -d --name mynginxvolume -p 30001:80 -v nginxhtml:/usr/share/nginx/html nginx
-v不以绝对路径方式:
(1). 先在docker底层创建一个你指定名字的卷(具名卷)nginxhtml
(2). 把这个卷和容器内部目录绑定
(3). 容器启动以后,目录里面的内容就在卷里面存着
[root@i-id8g0yu9 nginx]# docker run -d --name mynginxvolume -p 30001:80 -v nginxhtml:/usr/share/nginx/html  nginx
2d1e2fadafbd81474234defd42e058c7b817796f91ad3e5de03b50a6d4ca2e16
[root@i-id8g0yu9 nginx]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
2d1e2fadafbd   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:30001->80/tcp, :::30001->80/tcp   mynginxvolume
[root@i-id8g0yu9 ~]# docker volume --help
Usage:  docker volume COMMAND
Manage volumes
Commands:create      Create a volumeinspect     Display detailed information on one or more volumesls          List volumesprune       Remove all unused local volumesrm          Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
[root@i-id8g0yu9 ~]# docker volume ls
DRIVER    VOLUME NAME
local     nginxhtml
[root@i-id8g0yu9 ~]# docker volume inspect nginxhtml
[{"CreatedAt": "2021-04-17T15:39:42+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/nginxhtml/_data","Name": "nginxhtml","Options": null,"Scope": "local"}
]
[root@i-id8g0yu9 ~]# cd /var/lib/docker/volumes/nginxhtml/_data
[root@i-id8g0yu9 _data]# ls
50x.html  index.html
  • ②. -v /usr/share/nginx/html 效果:匿名卷 (什么都不写也不要加冒号,直接写容器内的目录)
[root@i-id8g0yu9 _data]# docker run -d --name mynginxvolume2 -v /usr/share/nginx/html -p 30002:80 nginx
44efbcbbb23325714fd6285cd5823f4d97a9937ebc34b35a7ee6b9d5555f3a5c
[root@i-id8g0yu9 _data]# docker volume ls
DRIVER    VOLUME NAME
local     958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4
local     nginxhtml
[root@i-id8g0yu9 _data]# docker volume inspect 958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4
[{"CreatedAt": "2021-04-17T16:06:48+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4/_data","Name": "958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4","Options": null,"Scope": "local"}
]
[root@i-id8g0yu9 _data]# cd /var/lib/docker/volumes/958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4/_data
[root@i-id8g0yu9 _data]# ls
50x.html  index.html

③. 手动挂载 bind mount

  • ①. bind mount,文件挂载没有在外部准备好内容而导致的容器启动失败问题(一定要防止空挂载问题)

  • ②. docker run -d -P -v /root/nginxconf:/etc/nginx/ -v /root/nginxhtml:/usr/share/nginx/html --name=nginx999 nginx
    (一定要提前把/nginxconfig和nginxhtml以及里面的东西提前准备好,不然会出现空挂载问题)

  • ③. 参考Nginx的安装步骤

④. 使用总结

  • ①. 如果自己开发测试,用-v绝对路径的方式

  • ②. 如果是生产环境建议用卷

  • ③. 除非特殊/bin/docker需要挂载主机路径的则操作绝对路径挂载

④. 可视化界面-Portainer

  • ①. 安装 可视化界面操作指南
[root@i-id8g0yu9 ~]# docker run -d -p 30008:8000 -p 30009:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
Unable to find image 'portainer/portainer-ce:latest' locally
latest: Pulling from portainer/portainer-ce
Digest: sha256:5064d8414091c175c55ef6f8744da1210819388c2136273b4607a629b7d93358
Status: Downloaded newer image for portainer/portainer-ce:latest
c81e504ee751172d4129b042758d3106b5b700f06c8fc83d8ce0240b4cea434d
[root@i-id8g0yu9 ~]# docker ps
CONTAINER ID   IMAGE                    COMMAND        CREATED          STATUS          PORTS                                                                                      NAMES
c81e504ee751   portainer/portainer-ce   "/portainer"   11 seconds ago   Up 11 seconds   0.0.0.0:30008->8000/tcp, :::30008->8000/tcp, 0.0.0.0:30009->9000/tcp, :::30009->9000/tcp   portainer
  • ②. 访问:http://139.198.169.136:30009/#!/1/docker/events
    在这里插入图片描述在这里插入图片描述

这篇关于DOCKER02_镜像如何存储、镜像加载原理、容器数据卷、可视化界面-Portainer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/953125

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和