文章目录
网络和存储原理
前言
博主语录:一文精讲一个知识点,多了你记不住,一句废话都没有
经典语录:勇者愤怒,抽刃向更强者;怯者愤怒,却抽刃向更弱者
文末惊喜
一、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.2、Container and layers
下图显示了共享同一 Ubuntu 15.04 映像的多个容器。
1.3、磁盘容量预估
1.4、镜像如何挑选
1.5、Copy On Write
- 写时复制是一种共享和复制文件的策略,可最大程度地提高效率。
- 如果文件或目录位于映像的较低层中,而另一层(包括可写层)需要对其进行读取访问,则它仅使用现有文件。
- 另一层第一次需要修改文件时(在构建映像或运行容器时),将文件复制到该层并进行修改。 这样可以将I / O和每个后续层的大小最小化。
2、容器如何挂载
每一个容器里面的内容,支持三种挂载方式:
- docker自动在外部创建文件夹自动挂载容器内部指定的文件夹内容【Dockerfile VOLUME指令的作用】
- 自己在外部创建文件夹,手动挂载
- 可以把数据挂载到内存中
- 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博客🙉
- 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨