03-Docker存储和网络

0.Docker镜像透析

镜像加载原理

UnionFS联合文件系统

  • UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级

目高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

  • 人话:想象一下我有一本预言之书,每一页都是一张可以独立存在的篇章,但是当我把所有页按顺序叠在一起时,它们就形成了一个完整的预言日志。现在,如果我想在故事中间添加一个新的章节,我不用重写整个故事,我只需要在中间插入几张新的纸就可以了。而且,这些新页可以随时添加或移除,不会影响到原来的故事。

  • 工作原理:

    • 写时复制(Copy-on-Write) :当你想修改预言(也就是在Docker镜像中做修改)时,你不会直接在原来的页上写,而是复制那一页到一个新的页上,然后在新的页上进行修改。这样,原来的页保持不变,新的页包含了你的修改。
    • 层叠效果:所有的层都叠加在一起,形成一个完整的视图。在Docker中,当你查看镜像时,你看到的是一个包含了所有层的统一文件系统,但实际上每个层都是独立的。
    • 可复用性:因为每个层都是独立的,所以不同的镜像可以共享相同的底层。比如,很多不同的Docker镜像都可能使用同一个基础Ubuntu镜像作为它们的底层。
  • Docker高效性:
    • 可复用性:基础镜像层可以被多个容器共享,不需要每次都重新建造。
    • 轻量级:每个镜像层只包含了必要的改动,而不是完整结构。
    • 快速构建:创建新容器时,只需要添加或修改必要的镜像,而不是从头开始

1.Docker存储

1.1数据卷挂载(目录挂载)

书接上文,容器内可能不必备vi编辑器,这使得容器内对文件的编辑工作会很麻烦,需要一点魔法

  • 目录挂载是指将本地主机上的文件或目录映射到容器内的过程。这样做的目的是为了让容器能够访问主机本地上的文件系统,实现数据持久化或者共享配置文件等功能。
  • 人话: 好不容易辛苦的进入容器对各种配置信息进行修改,忽然有一天容器炸了或者手欠把容器删了,那么配置的各种容器信息和数据都将丢失,使用目录挂载可以将本地文件和容器中的文件进行神秘联动(量子纠缠),你对**本地文件的任何修改都会映射到容器的文件中,**哪怕把容器删除重装,映射关系也不会改变从而数据得到保存

数据卷(volume):是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁

匿名挂载

  • 语法: docker -v 数据卷名:容器目录
  • 不指定本地目录,默认放在/var/lib/docker/volums/xxxx/_data
  • 容器内路径: ro rw 改变读写权限,看到ro说明只能通过本地主机修改文件而非容器内修改
复制代码
#查看帮助信息
docker volum --help
#创建数据卷
docker volume create
#查看所有数据卷
docker volume ls
#删除指定数据卷
docker volume rm
#查看某个数据卷的详情
docker volume inspect
#清除数据卷
docker volume prune
小试羊刀-匿名挂载:
  1. 直接运行并且匿名挂载

    docker run -d -p 80:80 --name nginx -v html:/usr/share/nginx/html nginx

  1. 查看当前数据卷
  1. 查看数据卷信息

createdAt:创建时间

mountpoint:数据卷路径

  1. 切换到该工作目录下就可以看到对应文件信息

具名挂载(用得多)

  • 语法: docker -v 本地目录:容器目录
  • 目录必须以 / 开头,否则会被识别为数据卷
  • (目录和: 之间不能有任何空格)
小试羊刀-具名挂载:
  1. 预备工作,确保容器正常运行
  1. 2.将Linux的IP地址粘到网页即可看到nginx的运行情况
  1. 3查看官方文档可以得知控制网页的html文件路径,进入容器,切换工作目录准备对其修改
  1. 4对页面进行修改刷新可得,容器内甚和至没有vi编辑器,编辑文件难受的一批
  1. 5删除容器重造,页面数据丢失
  1. 6那么现在挂载启动

    docker run -d -p 80:80 --name nginx -v /refle/nghtml:/usr/share/nginx/html nginx

注意,本地不存在的目录会自动创建的,切换到该目录可以看到该文件

  1. 7进入该映射文件会发现没有任何内容,并且访问网页无如何内容

这是因为现在容器内文件的访问会以外面的映射文件为基准

  1. 8所以我们需要在外面的文件建立一个index.html去设置相应的配置信息,此时就可以正常显示
  1. 9现在我们删除容器,用相同的命令挂载启动会发现配置信息得到了保留

1.2制作镜像Dockerfile

  • 镜像就是包含了应用程序,程序运行的系统函数库,运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
  • 编写dockerfile常见指令

官方文档点我

2.Docker网络

  • 实现进入到某个容器内部去访问另一个容器

2.1利用机器ip+外部端口互相通讯

  • 使用curl http://机器ip+外部端口可以互相访问
  • curl 用于在命令行界面(CLI)中发出网络请求。curl 命令启动并解析提供的 URL,建立一个到 IP 地址 119.45.45.4 的网络连接,它使用 HTTP 协议在端口 99 上发送一个 GET 请求(从服务器检索 数据)到服务器,服务器接收到请求后,它会处理这个请求并返回一个响应,并将其输出到命令行界面
  • 首先存储创建两个容器app1,app2,外部主机端口分别为88,99
  • 进入app1容器并访问容器app2

问题未解决?

2.2利用容器ip+内部端口

  • docker0是 Docker 在宿主机上创建的一个虚拟网络接口。它是 Docker 默认创建的桥接网络(bridge network)的一个组成部分,用于实现 Docker 容器之间 的网络通信以及容器与主机之间的网络通信。
  • docker0为每个容器分配唯一的ip地址,容器之间就可以通过IP地址进行通信
  • 使用curl http://容器ip+内部端口可以互相访问
  • docker inspect container 可以查看容器ip地址
相关推荐
forAllforMe6 分钟前
etherCAT的协议VoE,FoE,EoE,CoE的概念和区别
网络
斯普信云原生组20 分钟前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
大数据新鸟27 分钟前
操作系统之虚拟内存
java·服务器·网络
喵了几个咪32 分钟前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
工具罗某人1 小时前
docker compose部署kafka集群搭建
docker·容器·kafka
迷藏4941 小时前
**eBPF实战进阶:从零构建网络流量监控与过滤系统**在现代云原生架构中,**网络可观测性**和**安全隔离**已成为
java·网络·python·云原生·架构
zmj3203241 小时前
汽车电子内部网络架构图
网络·汽车
汽车仪器仪表相关领域2 小时前
NHFID-1000型非甲烷总烃分析仪:技术破局,重构固定污染源监测新体验
java·大数据·网络·人工智能·单元测试·可用性测试·安全性测试
卤炖阑尾炎2 小时前
Python 网络编程实战:从 TCP/UDP 基础到高并发服务器开发
网络·python·tcp/ip
乾元2 小时前
《硅基之盾》番外篇二:算力底座的暗战——智算中心 VXLAN/EVPN 架构下的多租户隔离与防御
网络·人工智能·网络安全·架构