0
点赞
收藏
分享

微信扫一扫

【云原生 | Docker篇】网络和存储原理

Sky飞羽 2022-04-25 阅读 18

文章目录

网络和存储原理

前言

一、Docker存储

1、镜像如何存

2、容器如何挂载

3、管理卷 

4、docker cp

二、Docker网络

1、端口映射

2、容器互联

3、自定义网络 


网络和存储原理

前言

博主语录一文精讲一个知识点,多了你记不住,一句废话都没有

经典语录:勇者愤怒,抽刃向更强者;怯者愤怒,却抽刃向更弱者 

     文末惊喜      

一、Docker存储

1、镜像如何存

1.0、自己探索

FROM busybox 
CMD ping baidu.com

截取的nginx的分层

 

如图指示了镜像怎么存的

  • LowerDir :底层目录; diw (只是存储不同);包含小型linux和装好的软件
  • 倒着看

  • MergedDir :合并目录;容器最终的完整工作目录全内容都在合并层;数据卷在容器层产生;所有的增删改都在容器层;

  • UpperDir :上层目录;
  • WorkDir :工作目录(临时层),PID

1.1、Images and layers

Docker 映像由一系列层组成。 每层代表图像的 Dockerfile 中的一条指令。 除最后一层外的每一层都是只读的。 如以下Dockerfile

 

 

1.2Container and layers

下图显示了共享同一 Ubuntu 15.04 映像的多个容器。

 

1.3、磁盘容量预估

1.4、镜像如何挑选

1.5、Copy On Write

  • 写时复制是一种共享和复制文件的策略,可最大程度地提高效率。
  • 如果文件或目录位于映像的较低层中,而另一层(包括可写层)需要对其进行读取访问,则它仅使用现有文件。
  • 另一层第一次需要修改文件时(在构建映像或运行容器时),将文件复制到该层并进行修改。 这样可以将I / O和每个后续层的大小最小化。

 

2、容器如何挂载

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

  1. docker自动在外部创建文件夹自动挂载容器内部指定的文件夹内容【Dockerfile VOLUME指令的作用】
  2. 自己在外部创建文件夹,手动挂载
  3. 可以把数据挂载到内存中

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

上面三种挂载方法可以参照官网 

 

2.1、volume()  

  • 匿名卷使用
  • 具名卷使用

如果将空卷装入存在文件或目录的容器中的目录中,则容器中的内容(复制)到该卷中。

如果启动一个容器并指定一个尚不存在的卷,则会创建一个空卷。

 

以上用哪个比较好?

  • 如果自己开发测试,用 -v 绝对路径的方式
  • 如果是生产环境建议用卷
  • 除非特殊 /bin/docker 需要挂载主机路径的则操作 绝对路径挂载

nginx测试html挂载几种不同情况:

  • 不挂载 效果:访问默认欢迎页
  • -v /root/html:/usr/share/nginx/html 效果:访问forbidden
  • -v html:/usr/share/nginx/html:ro 效果:访问默认欢迎页
  • -v /usr/share/nginx/html 效果:匿名卷 (什么都不写也不要加冒号,直接写容器内的目录)

原因:

方式一 :-v html:/usr/share/nginx/html; # 这种方式称为docker自动管理的方式

docker inspect 容器的时候

2.2、bind mount 

3、管理卷 

4、docker cp

cp的细节

 

案例: 

docker cp index.html mynginx4:/usr/share/nginx/html 
docker cp mynginx4:/etc/nginx/nginx.conf nginx.conf

二、Docker网络

1、端口映射

docker create -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name hello-mysql mysql:5.7

 

2、容器互联

-- link name:alias name 连接容器的名称, alias 连接的别名

场景:我们无需暴露 mysql 的情况下,让 web 应用使用 mysql

 

docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 
docker run -d --link mysql01:mysql --name tomcat tomcat:7 
docker exec -it tomcat bash 
cat /etc/hosts 
ping mysql

3、自定义网络 

3.1、默认网络原理

Docker 使用 Linux 桥接,在宿主机虚拟一个 Docker 容器网桥 (docker0) Docker 启动一个容器时会根据Docker网桥的网段分配给容器一个 IP 地址,称为 Container-IP ,同时 Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP 直接通信。

 

Docker 容器网络就很好的利用了 Linux 虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair );

Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为 Linux 是在内核中进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。

原理:

1 、每一个安装了 Docker linux 主机都有一个 docker0 的虚拟网卡。桥接网卡

2 、每启动一个容器 linux 主机多了一个虚拟网卡。

3 docker run -d -P --name tomcat --net bridge tomcat:8

3.2、网络模式

 

3.3、自建网络测试 

文末惊喜:

马东:随着时间的流逝我们终究会原谅那些曾经伤害过我们的人

蔡康永:那不是原谅,那是算了


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨ 
举报

相关推荐

0 条评论