宿主机与Docker之间的关系
docker中容器与宿主机之间的网络关系
一、PC上的网络关系
1、、网卡的物理地址
网卡的物理地址(MAC地址):是网卡的唯一标识。由生产厂商写入网卡中。MAC地址就如同我们身份证上的身份证号码,具有全球唯一性
2、IP地址
IP地址是设备接入局域网时,局域网所分配的一个地址,在接入局域网的这段时间内,跟物理地址绑定,成为该设备在局域网中的唯一标识。可以被公网访问
3、回环地址
本地环回环地址时以127开头的地址127.0.0.1 —> 127.255.255.254,是由http协议规定,用于本地主机的进程间的通信之用。若主机发送一个目的地址为环回地址的IP数据报,则本主机中的协议软件就处理该数据报中数据,而不会将数据报发送到任何网络。目的地址为环回地址的IP数据报永远不会出现在任何网络上,因为网络号为127的地址根本不是网络地址。不可以被公网访问
4、localhost
localhost时一个域名,如www.baidu.com.其具体的地址时可以配置的,一般情况下默认指向的地址为127.0.0.1。不可以被公网访问
5、0.0.0.0
0.0.0.0,最特殊的一个ip地址,代表的是本机所有ip地址,不管你有多少个网口,多少个ip,如果监听本机的0.0.0.0上的端口,就等于监听机器上的所有ip端口。换句话说,就是只要数据报目的地址是你机器上的一个ip地址,那么就能被接受。这个ip相当于java中的this,代表当前设备的IP
二、docker中容器与宿主机之见的网络
本机访问容器:
容器将自己的3306端口映射到宿主机的3306端口,因此要访问容器只能通过宿主机的3306端口访问容器的3306端口进而跟容器通信。能够访问宿主机的3306端口的地址有 在宿主机中有
回环地址
hocalhost
以及宿主机地址
公网访问容器
在公网必须通过宿主机地址访问宿主机的3306端口参能访问容器的3306端口,才能访问容器。
容器在起服务时需要指定ip给外部访问,起可以指定为自己的容器地址,或者0.0.0.0。
——————————————————————————————————
2. 什么是容器数据卷
卷就是目录或文件,存在于 Docker 容器中,由 Docker 挂载到容器,但不属于 UnionFS 联合文件系统,因此能够绕过 UnionFS 提供一些用于持续存储或共享数据的特性。
容器数据卷,作用就是将 Docker 容器内的数据保存并同步到宿主机的硬盘中。如下图所示。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。
将应用与运行的环境打包成镜像,run 之后形成容器实例运行,但我们希望容器中的数据能持久化到宿主机的硬盘中,不会随着容器的删除而消失。然而,Docker 容器产生的数据,如果不备份,那么当容器实例被删除后,容器内的数据自然也没有了。为了能保存容器中的数据,我们就要使用容器数据卷。
特点:
数据卷可以在容器之间共享或重用;
卷中的数据更改可以直接实时自动同步到宿主机上;
宿主机卷中的数据更改也会实时同步到容器内的卷中;(双向同步)
卷中的数据更改不会包含在镜像的更新中;
数据卷的生命周期一直持续到没有容器使用它为止。
—————————————————————————————————
3. 数据卷常用操作
3.1 创建带数据卷的容器
docker run -it --privileged=true -v /宿主机绝对路径目录/:/容器内目录 镜像名或镜像ID
其中,-v 就是启动容器数据卷,把 /容器内目录 备份到 /宿主机绝对路径目录/ 中。同时,如果 /宿主机绝对路径目录 卷中有数据更改,也会实时同步到 /容器内目录 中。换句话说,容器和主机的数据卷之间是双向同步的。
此外,--privileged=true 就是文章开头提到的解决 Docker 挂载主机目录访问时出现 cannot open directory.:Permission denied 报错的问题。
如果目录不存在,Docker 会自动创建 。此外,-v 后可以绑定一对或多对数据卷。
(Ps. 永远要记住容器实例也是一个简易版的 Linux 系统)
容器和宿主机的数据卷之间是实时双向同步的。
举例:接下来创建一个带有容器卷存储功能的 Ubuntu 容器实例。
docker run -it --privileged=true -v /tmp/host_data/:/tmp/docker_data --name=u1 ubuntu:latest /bin/bash
其中,把容器中 /tmp/docker_data 目录下的数据备份到宿主机的 /tmp/host_data 目录中。
可以看到,Docker 确实自动创建了目录。
下面,我们在容器内 /tmp/docker_data
下创建数据 dockerin.txt
,验证是否能实时同步到宿主机的 /tmp/host_data
下。
cd /tmp/docker_data/
touch dockerin.txt
此时,查看宿主机的 /tmp/host_data
目录。
cd /tmp/host_data/
ls
容器内的数据 dockerin.txt
成功同步到宿主机的 /tmp/host_data
目录下。
接下来,我们在宿主机的 /tmp/host_data
目录下也创建数据 hostin.txt
来验证这种同步是否是双向的。
touch hostin.txt
可以发现,宿主机的 /tmp/host_data
目录下也创建数据 hostin.txt
也出现在了容器的数据卷 /tmp/docker_data
中。
得出结论:容器和宿主机的数据卷之间是实时双向同步的。
3.2 数据共享特性总结
- Docker 容器修改,主机同步获得数据;
- 主机修改,Docker 容器同步获得数据;
- Docker 容器 stop ,主机修改,Docker 容器 start 重启后依然可以获得数据;
4. 读写规则映射
在上一节的案例中,使用的是 Docker 默认的规则:rw
可读可写。换句话说,下面两行命令是等价的。
docker run -it --privileged=true -v /宿主机绝对路径目录/:/容器内目录 镜像名或镜像ID docker run -it --privileged=true -v /宿主机绝对路径目录/:/容器内目录:rw 镜像名或镜像ID
但在实际开发中,有时容器实例内部的读写权限被限制,只能读不能写,数据只能由宿主机同步给容器实例。这是我们把容器数据卷的读写权限改为 ro
(Read Only) 只读即可。
docker run -it --privileged=true -v /宿主机绝对路径目录/:/容器内目录:ro 镜像名或镜像ID
此时如果宿主机写入内容,可以同步给容器实例,容器可以读取到。
5. 卷的继承和共享
数据卷的继承,指的是容器 2 继承容器 1 的卷规则,卷规则包括数据卷的同步目录、读写规则等;此外,容器 1 、容器 2 与宿主机三者之间可以数据共享和同步。用 docker run 的一个参数 --volumes-from 父容器ID 来设置。
$ docker run -it --privileged=true --volumes-from 父容器 --name=容器名称 镜像名或镜像ID
1
卷继承的特点:
继承父容器与宿主机的同步目录、数据;
三者之间的数据能够相互共享,相互实时同步;
即使在容器停止的状态下,其他容器或宿主机更改的数据依然能在容器重启后同步过来。
详细的集成规则可以查看:https://blog.csdn.net/Sihang_Xie/article/details/128290142 该博主