首页 > 其他分享 >三 docker存储和网络

三 docker存储和网络

时间:2023-01-06 16:46:03浏览次数:47  
标签:容器 存储 -- 主机 端口 网络 网桥 docker

  • docker数据管理
    • 数据卷volumes
      • 可供一个或多个容器使用的特殊目录,可以在容器之间共享,对数据卷的修改会立即生效且不会影响镜像,与容器声明周期独立,即容器删除数据卷也可存在,可以在删除容器的时候使用 docker rm -v 这个命令,删除容器的同时移除数据卷
      • docker volume create my-volume 创建数据卷
      • docker volume ls 查看全部数据卷
      • docker volume inspect my-volume查看指定数据卷
        $ docker run -d -P \
        --name web \
        --mount source=my-volume,target=/webapp \
        training/webapp \
        python app.pyq
      • 启动一个挂载数据卷的容器,将容器的webapp目录挂载到my-volume数据卷,可以通过docker inspect web查看web容器的信息,type是volume
    • 挂载主机目录 bind mounts
      • 使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。
        $ docker run -d -P \
        --name web \
        # -v /src/webapp:/opt/webapp \
        --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
        training/webapp \
        python app.py
        

          加载主机的/src/webapp目录到容器的/opt/webapp目录,主机的路径需要是绝对路径,默认权限是读写,也可以增加readonly指定为只读

      • docker inspect web, type是bind

  • docker网路管理,docker允许外部访问容器或容器互联的方式来提供网络服务
    • 外部访问容器
      • docker run -d -P training/webapp python app.py ,当使用-P标识时,docker会随机映射49000-49900的主机端口到内部容器开放的网络端口,此时访问主机的端口即可访问容器内提供的应用,-p则可以指定主机要映射的端口
      • -p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式
        有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。可以使用多次绑定多个端口

      • 映射所有接口地址,hostPort:containerPort 
      • 映射到指定地址的指定端口 ip:hostPort:containerPort
      • 映射到指定地址的任意端口  ip::containerPort ,本地主机会自动分配一个端口
      • 查看映射端口配置,可以查看到绑定的地址 
        $ docker port nostalgic_morse 5000
        127.0.0.1:49155.
        
    •   
    • 容器互联
      • 新建网络 docker network create -d bridge my-net,-d参数可以指定docker网络类型,有bridge和overlay,其中overlay用于集群模式
      • 连接容器 docker run -it --rm --name busybox1 --network my-net busybox sh, docker run -it --rm --name busybox2 --network my-net busybox sh,则两个容器简历了互联,进入busybox1,执行 ping busybox2
      • docker  compose 多个容器互联
      • 配置DNS,如何自定义容器的主机名和dns,docker利用虚拟文件挂载容器的3个相关配置文件,使用mount查看挂载信息
        $ mount
        /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
        /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
        tmpfs on /etc/resolv.conf type tmpfs ...
        

          这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过/etc/resolv.conf 文件立刻得到更新。

 


    • 高级网络配置
      • docker网络
    •                      当docker启动时,会自动在
主机
      上创建一个
docker0
      的虚拟网桥,实际上是linux的一个
bridge
    ,它会在挂载到它的网口之间进行转发。
      • 同时docker随机分配一个本地未占有的私有网段地址给docker0接口,此后启动的容器内的网口也会自动分配同一个网段的地址。
      • 当创建一个docker容器的时候,同时会创建一堆veth pair接口,当数据包发送到一个接口时,另一个接口也可以接受相同的数据包。
      • 这对接口一端在容器内,即eth0,,另一端在主机并被挂载到docker0网桥,名称以veth开头,通过这种方式,主机和容器可以互相通信
      • docker就创建了主机和所有容器之间一个虚拟共享网络

                                

    • 快速配置指南
      • 其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
        -b BRIDGE 或 --bridge=BRIDGE 指定容器挂载的网桥
        --bip=CIDR 定制 docker0 的掩码
        -H SOCKET... 或 --host=SOCKET... Docker 服务端接收命令的通道
        --icc=true|false 是否支持容器之间进行通信,最好是关闭
        --ip-forward=true|false 请看下文容器之间的通信
        --iptables=true|false 是否允许 Docker 添加 iptables 规则
        --mtu=BYTES 容器网络中的 MTU

      • 下面2个命令选项既可以在启动服务时指定,也可以在启动容器时指定。在 Docker 服务启动
        的时候指定则会成为默认值,后面执行 docker run 时可以覆盖设置的默认值。
        --dns=IP_ADDRESS... 使用指定的DNS服务器
        --dns-search=DOMAIN... 指定DNS搜索域

      • 最后这些选项只有在 docker run 执行时使用,因为它是针对容器的特性内容。
        -h HOSTNAME 或 --hostname=HOSTNAME 配置容器主机名
        --link=CONTAINER_NAME:ALIAS 添加到另一个容器的连接
        --net=bridge|none|container:NAME_or_ID|host 配置容器的桥接模式
        -p SPEC 或 --publish=SPEC 映射容器端口到宿主主机
        -P or --publish-all=true|false 映射容器所有端口到宿主主机

    • 容器访问控制
      • 容器的访问控制,主要通过linux的iptables防火墙来进行管理和实现。
      • 容器访问外部网络,需要本地系统的转发支持,sysctl net.ipv4.ip_forward 检查转发是否打开,如果net.ipv4.ip_forward = 1 ,则打开
      • 容器之间访问,容器的网络拓扑是否已互联,所有容器都会被连接到docker0网桥上;本地系统的iptables是否允许通过
      • 访问所有端口,启动docker服务的时候,默认会添加一条转发策略到iptables的forward链上,默认情况下,不同容器之间允许网络互通
      • 访问指定端口,在通过 -icc=false 关闭网络访问后,还可以通过 --link=CONTAINER_NAME:ALIAS 选项来访问容器的开放端口,最终会在iptables中为两个容器添加一条accept规则,允许相互访问开放的端口
    • 容器端口映射到主机的实现
      • 默认情况下,容器可以访问外部,外部不能访问容器
      • 容器访问外部实现,容器所有到外部网络的连接,原地址都会被nat转换成本地系统的ip地址,这是使用iptables的源地址伪装操作实现的。
        $ sudo iptables -t nat -nL
        ...
        Chain POSTROUTING (policy ACCEPT)
        target prot opt source destination
        MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
        ...
        

          上述规则将所有源地址在172.17.0.0/16网段,目标地址为其他网段的流量动态伪装为从系统网卡发出

      • 外部访问容器实现,可以在docker run时候通过-P -p参数来启用,本质是在本地的iptable的nat表中添加相应规则
        $ iptables -t nat -nL
        ...
        Chain DOCKER (2 references)
        target prot opt source destination
        DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.
        0.2:80
        

          这里的规则映射成了0.0.0.0,意味着接受主机来自所有接口的流量,可以通过-p IP:host_port:container_port 或 -p IP::port 来指定允许访问容器的主机上的 IP、接口等

    • 配置docker0网桥
      • docker服务默认创建了一个docker0的网桥,其上有一个docker0内部接口,它在内核层联通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到一个物理网络。
      • docker默认指定了docker接口的ip地址和子网掩码,让主机和容器可以通过网桥相互通信,还给出了mtu,接口允许接收的最大传输单元
      • 由于docker网桥是linux网桥,用户可以使用brctl show来查看网桥和端口连接信息
        $ sudo brctl show
        bridge name  bridge id          STP enabled  interfaces
        docker0      8000.3a1d7362b4ee  no           veth65f9 vethdda6
        

          每次创建一个新容器的时候,docker从可选的地址段中选一个空闲ip给容器的eth0端口,使用本机上docker0接口的ip作为所有容器的默认网关

    • 自定义网桥
      • 用户可以指定网桥来连接容器和主机,使用-b 指定使用的网桥

 

标签:容器,存储,--,主机,端口,网络,网桥,docker
From: https://www.cnblogs.com/weizhenlu/p/17030923.html

相关文章

  • 46-Docker-Container容器管理各种操作
    容器相关命令[root@ubuntu2204~]#dockercontainerUsage:dockercontainerCOMMANDManagecontainersCommands:attachAttachlocalstandardinput,output,and......
  • Docker 版本升级
    Docker版本升级1、查看系统要求Docker要求CentOS系统的内核版本高于3.10,查看CentOS的内核版本。uname-a2、删除旧版本yumremovedockerdocker-commondock......
  • 简单java servlet的登录脚本,部署到docker
    先打算参考这篇文章Simpleloginpageexampleusingjspservlet-Candidjava内含war文件和zip文件。但是tomcat上该war文件总是报错。于是又参考这篇(46条消息)Jav......
  • Docker版思源笔记使用Dark+主题,无法显示“霞鹜文楷等宽”字体的解决方式
    在Docker版思源笔记中使用Dark+主题时,编辑器的字体与Dark+中主题预览的字体不一致。此问题咨询了思源笔记官方得到是回复是“官方暂时不考虑Docker版的编辑器暂不考虑......
  • MTK存储说明
    @目录简介说明RAM和ROM的分配编译完后的空间查看简介MTK存储功能说明说明RAM和ROM的分配MTK项目里面,存储部分只需要关注ROM和RAM即可到对应的工程下面pro/FF741_CQ2......
  • .Net Core 用自动生成Dockerfile的坑
    简介  之前采用shell脚本+dockerfile的方式构建项目,后来发现Docker在17.05版本之后有多阶段构建方式,该文主要记录了netcore采用dockerfile构建遇到的坑。原先的方式......
  • .NETCore Docker实现容器化与私有镜像仓库管理
    一、Docker介绍Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖。相......
  • docker安装redis教程
    安装docker参考博主另一篇文章 1、下载redisdockerpullredis//使用镜像加速下载redisdockerpullregistry.docker-cn.com/library/redis两种方法均可以2、下载完成后查......
  • 用Python实现一个基于文件存储的控制台学生管理系统
    放假回家,写写Python玩,10分钟写了一个基于文件存储的控制台学生管理系统,目的是熟悉Json的使用importjsonimportosimportatexitimporttimelatest_file=""defm......
  • docker安装centos7
    一、查看可用的CentOS版本访问CentOS镜像库地址:https://hub.docker.com/_/centos?tab=tags&page=1。可以通过Sortby查看其他版本的CentOS。默认是最新版本cent......