Docker网络:相关操作:inspect、create 、connect、disconnect;docker默认的4种网络类型;host内docker网络内通信、docker网络间通信;容器访问外部世界(nat);外部世界访问容器(端口映射)

 

复制代码
docker网络相关操作
-----------------------------------------------------------------------------------------
查看容器网络
    docker network ls
    docker network inspect xxxx
创建删除容器网络
    docker network create [OPTIONS] NETWORK
    docker network rm NETWORK [NETWORK...]
    docker network create --driver bridge --ip-range 100.100.100.0/24 --gateway 100.100.100.99 --subnet 100.100.100.0/25 ip_range_100.100.100.0_24
    docker network create --subnet 100.100.1.0/24 net_100.100.1.0_24
    docker network create --subnet 100.100.2.0/24 net_100.100.2.0_24
    docker network create -d ipvlan --subnet=192.168.20.0/24 --gateway=192.168.20.1 -o parent=eth0.20 ipvlan20     #https://docs.docker.com/network/ipvlan/
    docker network create --driver axxnet --ipam-driver=axxnet --gateway=100.0.0.247 --ip-range 100.0.0.0/24 --subnet=100.0.0.0/24 --opt nic=docker1 net_100.00.00.0_24            #参数说明:getaway是网关,--ip-range和—subnet一样都是子网,--opt docker1后面为新网段别名
    测试:--driver/--ip-range/--subnet/--gateway
    1.(实测)--driver:默认driver为bridge,其他可选的有overlay、ipvlan以及自定义driver
    2.(实测)--ip-range:指定--ip-range,则必须指定--subnet;指定--subnet,并不一定要指定--ip-range
                        默认的docker0网络为172.17.0.0/16;新创建的docker网络若未指定任何参数,则默认在172网络取,例如172.18.0.0/16
    3.(实测)--gateway:网关默认为第一个IP
    4.(实测)有容器存在时,docker网络不能被删除
    
    docker network create --driver bridge my_net1                            #"brctl show"命令显示添加了一个新bridge,bridge名字和network id存在关联
    docker network create --driver bridge --subnet 10.0.0.0/24 --gateway 10.0.0.22 my_net2        #自定义网段10.0.0.0/24;自定义网关10.0.0.22 
    
连接or断开容器网络
    docker network connect [OPTIONS] NETWORK CONTAINER
    docker network disconnect [OPTIONS] NETWORK CONTAINER
    docker network connect net_100.100.2.0_24 0985c2
    docker network disconnect net_100.100.2.0_24 0985c2
    docker network connect --ip=100.100.1.58 net_100.100.1.0_24 0985c2
    docker network connect --ip=100.100.2.58 net_100.100.2.0_24 0985c2
    docker network connect net_100.100.2.0_24 0985c2

创建容器(网络测试)
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    docker run --net=net_100.100.1.0_24 --ip=100.100.1.98 -itd  82f3b5f3c58f 
    docker run --net=net_100.100.1.0_24 -itd  82f3b5f3c58f
    docker inspect 0da98dc7a7c8  |grep NetworkSettings -A50
    测试:--net/--ip
    1.(实测)不指定网络,默认为docker0网络
    2.(实测)容器IP默认是从小到大分配的
    3.(实测)指定IP超范围,则该ip无效;
    4.(实测)指定非docker0网络的IP,则必须指定网络;否则虽然会创建容器,但是会报错,且该容器无ip
    5.(实测)指定自定义网络,不指定ip,则自动在自定义网络使用一个最小的IP

    docker run -it --network my_net2 centos            #手工指定网络;默认使用docker0
    docker run -it --network=my_net2 centos            #“=”可有可无
    docker run -it --network my_net2 --ip 10.0.0.33 centos        #run容器时,指定IP
    docker run -it --network my_net2 --ip 10.0.0.33 centos        #可以重复使用一个IP,只要旧容器是down状态
        注:只有使用 --subnet 创建的网络才能指定静态 IP。并不是所有的自定义网络都可以使用--ip
docker网络相关操作:inspect、create 、connect、disconnect
复制代码

 

复制代码
docker默认的4种网络类型;3种网络驱动(bridge、overlay、macvlan);bridge_name 与 docker_network_id 的关联
========================================================================================================================
docker默认的4种网络类型(none、host、bridge、container)
    none 网络:挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络。
        挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络。
    host 网络:容器的网络配置与 host 完全一样。可以通过 --network=host 指定使用 host 网络。
        直接使用 Docker host 的网络最大的好处就是性能
        不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。
        另一个用途是让容器可以直接配置 host 网路。
    bridge 网络:Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上。
        其实经过测试,docker0是docker demaon运行时,才动态创建的。。
        经测试,docker0上若无活动接口,则docker0状态为down
        当容器为down状态时,brctl show是不能看到veth pair设备挂在docker0上的。
    container:共用其他容器的network namespace(用的少,局限很大)

--------------------------------------------------------------------------------------------------------------------
docker提供了3种网络驱动:bridge, overlay 和 macvlan
    overlay 和 macvlan 详见 docker多host间通信
--------------------------------------------------------------------------------------------------------------------    
docker自定义网络 bridge_name 与 docker_network_id 存在关联;
    brctl show;ip link 均可以查看bridge_name
    docker inspect network_name 查看docker_network_id
docker默认的4种网络类型;3种网络驱动(bridge、overlay、macvlan);bridge_name 与 docker_network_id 的关联
复制代码

overlay 和 macvlan 驱动 详见 docker多host间通信

复制代码
默认网络docker0对比自定义bridge网络
==========================================================================================================================
默认网络docker0与自定义bridge网络的差异:
    1.默认网络docker0:网络中所有主机间只能用IP相互访问。通过--link选项创建的容器可以对链接的容器名(container-name)作为hostname进行直接访问。
        自定义网络(bridge):网络中所有主机除ip访问外,还可以直接用容器名(container-name)作为hostname相互访问。
    2.默认网络中的link是静态的,不允许链接容器重启,而自定义网络下的link是动态的,支持链接容器重启(以及IP变化)
        因此,使用--link时链接的容器,在默认网络中必须提前创建好,而自定义网络下不必预先建好。
默认网络docker0对比自定义bridge网络
复制代码

 

复制代码
docker网络内部 容器间通信;单host内部docker网络间通信
==========================================================================================
docker网络内部通信:    一个docker网络内部的容器间通信的3种方式


1.IP 通信:体做法是在容器创建时通过 --network 指定相应的网络,或者通过 docker network connect 将现有容器加入到指定网络。
2.Docker DNS Server:使用 docker DNS 有个限制:只能在 user-defined 网络中使用。
    记得本质上就是修改docker本地的host文件吧????

3.joined 容器(--network=container:xxx):使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。
    --network=container:web1
    joined 容器非常适合以下场景:
        1.不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server 与 app server。
        2.希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

----------------------------------------------------------------------------------------
单host内部docker网络间通信

方式1:'docker network connect'       

    docker网络之间是隔离的,是通过iptables隔离的。路由层面其实是没问题的,容器的网关都是bridge,其实就是host;还有可能就是ip转发没打开
    docker使用'docker network connect'这种方式打通网络,本质是只是让某个容器在另一个容器网络配置了网卡
    #####严格来说这不属于docker网络间通信了。。。

方式2:创建veth pair连接2个docker网络
    这种方式只是我个人根据bridge的交换特性总结出来的方式,不具备实用性,仅用于帮助理解。
docker网络内部 容器间通信;单host内部docker网络间通信
复制代码

 docker run -d -P --name tomcat03 --link tomcat02 tomcat   #使用--link,会自动注册域名到容器中,实现通过域名来访问容器,但是--link是不实用的

复制代码
容器访问外部世界;外部世界访问容器
=============================================================
容器访问外部世界
方式1:
    容器默认网关在bridge,即host,然后通过nat访问外部网络
    docker0就是这种方式

方式2:借助vlan设备
    将容器网络设置在外部网络,例如:在服务器上联交换机配置docker网络网关
    流量路径:容器--->docker bridge--->物理网卡子网卡--->携带vlan id数据包--->物理网卡--->服务器上联设备--->网关
    ###这种方式,容器是以3层通信的方式与外部直接互通,无需借助nat
--------------------------------------------------------
外部世界访问容器:
方式1:端口映射
    -p 80   #映射容器的80端口,host端口随机
    -p 8080:80    #映射容器的80端口,host端口8080

    docker ps 或者 docker port 查看到 host 映射的端口
    每一个映射的端口,host 都会启动一个 docker-proxy 进程来处理访问容器的流量

方式2:借助vlan设备
    流量路径:容器网关(物理交换机)--->携带vlan id数据包--->物理网卡--->物理网卡子网卡--->docker bridge--->docker容器
容器访问外部世界;外部世界访问容器
复制代码

 

posted @   雲淡風輕333  阅读(165)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示