【云原生 | Docker篇】网络和存储原理(三)(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【云原生 | Docker篇】网络和存储原理(三)(下)

2、容器如何挂载



image.png


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


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


--mount 挂载到 linux宿主机,手动挂载(不用了)
-v 可以自动挂载,到 linux' 主机或者 docker 自动管理的这一部分区域


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


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


image.png


2.1、volume(卷)  


  • 匿名卷使用


docker run -dP -v :/etc/nginx nginx
# docker 将创建出匿名卷,并保存容器 /etc/nginx 下面的内容
# -v 宿主机 : 容器里的目录


  • 具名卷使用


docker run -dP -v nginx:/etc/nginx nginx
# docker 将创建出名为 nginx 的卷,并保存容器 /etc/nginx 下面的内容


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


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


image.png


-v 宿主机绝对路径 :Docker 容器内部绝对路径:叫挂载;这个有空挂载问题

-v 不以 / 开头的路径 :Docker 容器内部绝对路径:叫绑定(docker会自动管理, docker 不会把他当前目录,而把它当前卷)


以上用哪个比较好?


  • 如果自己开发测试,用 -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 容器的时候


#  -v 不以绝对路径方式;
# 1 、先在 docker 底层创建一个你指定名字的卷(具名卷) html
# 2 、把这个卷和容器内部目录绑定
# 3 、容器启动以后,目录里面的内容就在卷里面存着;
# -v nginxhtml:/usr/share/nginx/html 也可以以下操作
# 1 、 docker create volume nginxhtml 如果给卷里面就行修改,容器内部的也就改了。
# 2 、 docker volume inspect nginxhtml
#  3 、 docker run -d -P -v nginxhtml:/usr/share/nginx/html --name=nginx777 nginx
# 可以看到
"Mounts" : [
        {
                "Type" : "volume" , // 这是个卷
                "Name" : "html" , // 名字是 html
                "Source" : "/var/lib/docker/volumes/html/_data" , // 宿主机的目录。容器里面的哪两个文件都在
                "Destination" : "/usr/share/nginx/html" , // 容器内部
                "Driver" : "local" ,
                "Mode" : "z" ,
                "RW" : true , // 读写模式
                "Propagation" : ""
        }
]


#  卷:就是为了保存数据
docker volume #  可以对 docker 自己管理的卷目录进行操作; /var/lib/docker/volumes(卷的根目录 )
# 一行命令启动 nginx ,并且配置文件和 html 页面。需要知道卷的位置才能改
docker run -d -P -v nginxconf:/etc/nginx/ -v nginxpage:/usr/share/nginx/html nginx
# 想要实现 docker run -d -P -v /root/nginxconf:/etc/nginx/ -v /root/nginxhtml:/usr/share/nginx/html --name=nginx999 nginx
# 1 、提前准备好东西 目录 nginxconf ,目录里面的配置 we 年都放里面,,再调用命令
# 2 、 docker cp nginxdemo:/etc/nginx /root/nginxconf # 注意 / 的使用
# 3 、 docker run -d -P -v /root/nginxconf:/etc/nginx/ -v  /root/nginxhtml:/usr/share/nginx/html --name=nginx999 nginx


2.2、bind mount


如果将绑定安装或非空卷安装到存在某些文件或目录的容器中的目录中,则这些文件或目录会被安装遮盖,就像您将文件保存到Linux 主机上的 / mnt 中一样,然后 将 USB 驱动器安装到 / mnt 中。在卸载USB 驱动器之前, / mnt 的内容将被 USB 驱动器的内容遮盖。 被遮盖的文件不会被删除或更改,但是在安装绑定安装或卷时将无法访问。

总结:外部目录覆盖内部容器目录内容,但不是修改。所以谨慎,外部空文件夹挂载方式也会导致容器内部是空文件夹


docker run -dP -v /my/nginx:/etc/nginx:ro nginx
# bind mount 和 volumes 的方式写法区别在于
# 所有以 / 开始的都认为是 bind mount ,不以 / 开始的都认为是 volumes.


警惕bind mount 方式,文件挂载没有在外部准备好内容而导致的容器启动失败问题  


3、管理卷



docker volume create xxx :创建卷名
docker volume inspect xxx :查询卷详情
docker volume ls : 列出所有卷
docker volume prune: 移除无用卷


4、docker cp



cp的细节


docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- :把容器里面的复制出来
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH :把外部的复制进去

image.png


案例:


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 直接通信。


image.png

image.png


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、网络模式


image.png


3.3、自建网络测试


#  1 、 docker0 网络的特点。,


默认、域名访问不通、 --link 域名通了,但是删了又不行


#2 、可以让容器创建的时候使用自定义网络


1 、自定义创建的默认 default "bridge"

2 、自定义创建一个网络网络


docker network create --driver bridge --subnet 192 .168.0.0/16 --gateway
192 .168.0.1 mynet


所有东西实时维护好,直接域名 ping 通


docker network connect [OPTIONS] NETWORK CONTAINER


# 3 、跨网络连接别人就用。把 tomcat 加入到 mynet 网络


docker network connect mynet tomcat

效果:


1 、自定义网络,默认都可以用主机名访问通

2 、跨网络连接别人就用 docker network connect mynet tomcat


# 4 、命令


1 、容器启动,指定容器 ip 。 docker run --ip 192 .168.0.3 --net 自定义网络


2 、创建子网。 docker network create --subnet 指定子网范围 --driver bridge 所有东西实时维护好,直接域名ping 同


3 、 docker compose 中的网络默认就是自定义网络方式。


目录
相关文章
|
2天前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
20 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
13天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
78 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
3天前
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全能增强
在过去半年,ALB Ingress Controller推出了多项高级特性,包括支持AScript自定义脚本、慢启动、连接优雅中断等功能,增强了产品的灵活性和用户体验。此外,还推出了ingress2Albconfig工具,方便用户从Nginx Ingress迁移到ALB Ingress,以及通过Webhook服务实现更智能的配置校验,减少错误配置带来的影响。在容灾部署方面,支持了多集群网关,提高了系统的高可用性和容灾能力。这些改进旨在为用户提供更强大、更安全的云原生网关解决方案。
34 4
|
11天前
|
前端开发 网络协议 安全
【网络原理】——HTTP协议、fiddler抓包
HTTP超文本传输,HTML,fiddler抓包,URL,urlencode,HTTP首行方法,GET方法,POST方法
|
11天前
|
域名解析 网络协议 关系型数据库
【网络原理】——带你认识IP~(长文~实在不知道取啥标题了)
IP协议详解,IP协议管理地址(NAT机制),IP地址分类、组成、特殊IP地址,MAC地址,数据帧格式,DNS域名解析系统
|
11天前
|
存储 JSON 缓存
【网络原理】——HTTP请求头中的属性
HTTP请求头,HOST、Content-Agent、Content-Type、User-Agent、Referer、Cookie。
|
11天前
|
安全 算法 网络协议
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
|
11天前
|
XML JSON 网络协议
【网络原理】——拥塞控制,延时/捎带应答,面向字节流,异常情况
拥塞控制,延时应答,捎带应答,面向字节流(粘包问题),异常情况(心跳包)
|
13天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
62 1
|
11天前
|
网络协议 算法 Java
【JavaEE】——初始网络原理
局域网,广域网,局域网连接方式,交换机,集线器,路由器,网络通信,五元组(源IP,源端口,目的IP,目的端口,协议),协议分层,TCP/IP五层网络协议,封装和分用,交换机和路由器的封装和分用