• 【云原生 | 19】Docker数据存储详解


    作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅
    ✒️个人主页:小鹏linux
    💊个人社区:小鹏linux(个人社区)欢迎您的加入!

    为大家推荐一款刷题神奇 点击链接访问牛客网

    各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!

    牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析 

    目录

    1. 网络启动与配置参数

    2. 配置容器DNS和主机名

    2.1 相关配置文件

    2.2 容器内修改配置文件

    2.3 通过参数指定


    1. 网络启动与配置参数

    Docker启动时会在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥,可以理解为一个软件交换机,它会在挂载其上的接口之间进行转发,如下图所示:

    同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给docker0接口。比如典型的172.17.42.1,掩码为255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。
    当创建一个Docker容器的时候,同时会创建了一对veth pair接口。(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0;另一端在本地并被挂载到docker0网桥,名称以veth开头(例如vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。如此一来,Docker就创建了在主机和所有容器之间一个虚拟共享网络。
    下面是跟Docker网络相关的命令参数。其中有些命令选项只有在Docker服务启动的时候才能配置,而且不能马上生效:
    1. -b BRIDGE or--bridge=BRIDGE #指定容器挂载的网桥;
    2. --bip=CIDR #定制docker0的掩码;
    3. -H SOCKET...or--host=SOCKET... #Docker服务端接收命令的通道;
    4. --icc=true|false #是否支持容器之间进行通信;
    5. --ip-forward=true|false #启用net.ipv4.ip_forward,即打开转发功能;
    6. --iptables=true|false #禁止Docker添加iptables规则;
    7. --mtu=BYTES #容器网络中的MTU。
    下面2个命令选项既可以在启动服务时指定,也可以Docker容器启动(docker run)时候指定。在Docker服务启动的时候指定则会成为默认值,后续执行docker run时可以覆盖设置的默认值。
    1. --dns=IP_ADDRESS... #使用指定的DNS服务器;
    2. --dns-search=DOMAIN... #指定DNS搜索域。
    最后这些选项只能在docker run执行时使用,因为它是针对容器的特性内容:
    1. -h HOSTNAME or--hostname=HOSTNAME #配置容器主机名;
    2. --link=CONTAINER_NAME:ALIAS #添加到另一个容器的连接;
    3. --net=bridge|none|container: NAME_or_ID|host|user_defined_network #配置容器的桥接模式;
    4. -p SPEC or--publish=SPEC #映射容器端口到宿主主机;
    5. -P or--publish-all=true|false #映射容器所有端口到宿主主机。
    其中,--net选项支持五种模式,如下所示:
    1. --net=bridge #默认配置。为容器创建独立的网络命名空间,分配网卡、IP地址等网络配置,并通过veth接口对将容器挂载到一个虚拟网桥(默认为docker0)上;
    2. --net=none #为容器创建独立的网络命名空间,但不进行网络配置,即容器内没有创建网卡、IP地址等;
    3. --net=container:NAME_or_ID #意味着新创建的容器共享指定的已存在容器的网络命名空间,两个容器内的网络配置共享,但其他资源(进程空间、文件系统等)还是相互隔离的;
    4. --net=host #意味着不为容器创建独立的网络命名空间,容器内看到的网络配置(网卡信息、路由表、Iptables规则等)均与主机上保持一致。注意其他资源还是与主机隔离的;
    5. --net=user_defined_network #用户自行用network相关命令创建一个网络,同一个网络内的容器彼此可见,可以采用更多类型的网络插件。

    2. 配置容器DNS和主机名

    Docker支持自定义容器的主机名和DNS配置。

    2.1 相关配置文件

    实际上,容器中主机名和DNS配置信息都是通过三个系统配置文件来维护的:/etc/resolv.conf、/etc/hostname和/etc/hosts。
    启动一个容器,在容器中使用mount命令可以看到这三个文件挂载信息:
    1. $ docker run -it ubuntu
    2. root@75dbd6685305:/# mount
    3. ...
    4. /dev/mapper/ubuntu--vg-root on /etc/resolv.conf type ext4 (rw,relatime,errors= remount-ro,data=ordered)
    5. /dev/mapper/ubuntu--vg-root on /etc/hostname type ext4 (rw,relatime,errors= remount-ro,data=ordered)
    6. /dev/mapper/ubuntu--vg-root on /etc/hosts type ext4 (rw,relatime,errors=remount- ro,data=ordered)
    7. ...
    其中,/etc/resolv.conf文件在创建容器时候,默认会与宿主机/etc/resolv.conf文件内容保持一致:
    1. root@75dbd6685305:/# cat /etc/resolv.conf
    2. # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    3. # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 8.8.8.8
    4. search my-docker-cloud.com
    /etc/hosts文件中默认只记录了容器自身的一些地址和名称:
    1. root@75dbd6685305:/# cat /etc/hosts
    2. 172.17.0.2 75dbd6685305
    3. ::1 localhost ip6-localhost ip6-loopback
    4. fe00::0 ip6-localnet
    5. ff00::0 ip6-mcastprefix
    6. ff02::1 ip6-allnodes
    7. ff02::2 ip6-allrouters
    8. 127.0.0.1 localhost
    9. /etc/hostname文件则记录了容器的主机名
    10. root@75dbd6685305:/# cat /etc/hostname
    11. 75dbd6685305

    2.2 容器内修改配置文件

    Docker 1.2.0开始支持在运行中的容器里直接编 辑/etc/hosts,/etc/hostname和/etc/resolve.conf文件。
    但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来。也不会被docker commit提交。

    2.3 通过参数指定

    如果用户想要自定义容器的配置,可以在创建或启动容器时利用下面的参数指定:
    ·指定主机名-h HOSTNAME或者--hostname=HOSTNAME。设定容器的主机名,它会被写到容器内的/etc/hostname和/etc/hosts。但这个主机名只有容器内能看到,在容器外部则看不到,既不会在docker ps中显示,也不会在其他的容器的/etc/hosts看到。
    ·记录其他容器主机名--link=CONTAINER_NAME:ALIAS。选项会在创建容器的时候,添加一个所连接容器的主机名到容器内/etc/hosts文件中。这样,新创建容器可以直接使用主机名来与所连接容器通信。
    ·指定DNS服务器--dns=IP_ADDRESS。添加DNS服务器到容器的/etc/resolv.conf中,容器会用指定的服务器来解析所有不在/etc/hosts中的主机名。
    ·指定DNS搜索域--dns-search=DOMAIN。设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时,DNS不仅搜索 host,还会搜索host.example.com。

     👑👑👑结束语👑👑👑

    为大家推荐一款刷题神奇 点击链接访问牛客网

    各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!

    牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析

  • 相关阅读:
    【Linux】进程控制
    如何清除运行 Docker 容器的日志
    【C++】Map、Set 模拟实现
    使用docker中部署RuoYi-Cloud遇到的坑
    【剑指Offer】44.数字序列中某一位的数字
    安卓手机APP开发__媒体开发部分__媒体项
    图神经网络驱动的交通预测技术:探索与挑战
    RPC接口测试-两种方法(Jmeter和代码)
    MSDP概述
    使用mybatis拦截器模糊查询统一处理%_字符
  • 原文地址:https://blog.csdn.net/qq_62294245/article/details/125975540