Docker网络介绍

news/2024/6/3 19:30:17 标签: docker, 网络, 容器

Docker网络

介绍

只要装了docker,就会有一个网卡docker0,每启动一个docker容器docker就会给容器分配一个ip,默认使用的是桥接模式,使用的技术是evth-pair。当容器停止或被删除时,生成的网卡也会被删除,。

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7d:1f:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.130/24 brd 192.168.11.255 scope global noprefixroute dynamic ens33
       valid_lft 1624sec preferred_lft 1624sec
    inet6 fe80::929c:9d6d:8589:24cd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:ff:d9:83:c2 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:ffff:fed9:83c2/64 scope link 
       valid_lft forever preferred_lft forever
 
$ docker run -d --name tomcat1 tomcat  #运行容器
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7d:1f:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.130/24 brd 192.168.11.255 scope global noprefixroute dynamic ens33
       valid_lft 1667sec preferred_lft 1667sec
    inet6 fe80::929c:9d6d:8589:24cd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ff:d9:83:c2 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:ffff:fed9:83c2/64 scope link 
       valid_lft forever preferred_lft forever
#多了一对网卡
381: veth3695120@if380: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 2a:04:14:48:38:ae brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::2804:14ff:fe48:38ae/64 scope link 
       valid_lft forever preferred_lft forever
#容器内部ip addr
$ docker exec -it tomcat1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
380: eth0@if381: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

容器容器之间是不互相通信,只是容器docker0之间是通信的,docker0与宿主机的物理网卡通过-p参数映射。

隔离性

命令
   docker network create --net 模式
模式:
   bridge:桥接模式(默认),docker run 默认采用此模式。
   host:本地模式,docker容器与宿主机采用相同的网络。
        此模式下启动容器不会生成evth-pair,也不需要-p参数映射就可访问容器内端口
   none:不配置网络,一般用作测试
   container:使用其他容器网络栈,不同容器中ip相同,可通过回环接口访问。
             用法:docker run  --net container:容器名

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f3a0af1ba07b        bridge              bridge              local
30eaddd942a9        host                host                local
383f7401900a        none                null                local

创建自定义网络
扩展:子网掩码中的16代表位数,表明还可以创建255*255-回环-0.1这么多ip  
      如果是24 表明还可以创建255-回环-0.1这么多ip
#创建网关是169.253.0.1,容器ip可以为169.253.x.x的网络
$ docker network create  --gateway 169.253.0.1 --subnet 169.253.0.0/16 mynet
$ docker network ls #多出了自定义的网络
$ ifconfig  #多了一个网桥

#通过自定义网络启动容器
$ docker run -d --net mynet --name apache1 myhttpd:v1
$ docker run -d --net mynet --name apache2 myhttpd:v1
$ docker run -d --name apache3 myhttpd:v1

#再次查看自定义网络元数据,发现分配了两个容器ip
$ docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "1dfc137cc6918db0582a959933ce050c775f49c1c935007a82614b38affc19e5",
        "Created": "2022-07-04T20:50:04.711134688+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "169.253.0.0/16",
                    "Gateway": "169.253.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "6ea0f20093935d29030fb3ad69d94d4c991fe745ec0f41fcdeafd5ec6a60b88a": {
                "Name": "apache1",
                "EndpointID": "c835e32a361103ae5d93da6740218b8720e9aa7e7a2a0577a05a3284cb3c5310",
                "MacAddress": "02:42:a9:fd:00:02",
                "IPv4Address": "169.253.0.2/16",
                "IPv6Address": ""
            },
            "d9261eccd254f0d579033f312332bccb5430b06f4a82efb74023dee770483078": {
                "Name": "apache2",
                "EndpointID": "0535dca700b252bfa47564c68644e844d2cefc3cca40ce1c5eaf284c859f7c49",
                "MacAddress": "02:42:a9:fd:00:03",
                "IPv4Address": "169.253.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

相同网桥下两个容器之间可以互通,而不同网桥下的容器无法互通.
$ docker exec -it apache2 ping apache1
PING apache1 (169.253.0.2) 56(84) bytes of data.
64 bytes from apache1.mynet (169.253.0.2): icmp_seq=1 ttl=64 time=0.259 ms
64 bytes from apache1.mynet (169.253.0.2): icmp_seq=2 ttl=64 time=0.255 ms

$ docker exec -it apache2 ping apache3
ping: apache3: Name or service not known

联通性

如何实现不同网桥下容器的互通?网桥与网桥之间是不能通信的,实现的是容器与网桥之间的通信

命令:
$ docker network connect 网卡  容器

#容器apache1、apache2采用自定义网络,apache3采用默认网桥
$ docker run -d --net mynet --name apache1 myhttpd:v1
$ docker run -d --net mynet --name apache2 myhttpd:v1
$ docker run -d --name apache3 myhttpd:v1

#此时相同网桥下两个容器之间可以互通,而不同网桥下的容器无法互通.
$ docker exec -it apache2 ping apache1
PING apache1 (169.253.0.2) 56(84) bytes of data.
64 bytes from apache1.mynet (169.253.0.2): icmp_seq=1 ttl=64 time=0.259 ms
64 bytes from apache1.mynet (169.253.0.2): icmp_seq=2 ttl=64 time=0.255 ms

$ docker exec -it apache2 ping apache3
ping: apache3: Name or service not known

#使用docker network connect命令
$ docker network connect mynet apache3
#查看元数据,发现apache3直接写在了mynet网络的,并且ip地址发生了变化,变为169.253.0.4,变成同网段。
$ docker inspect mynet
[
    ...
        "Containers": {
            "6ea0f20093935d29030fb3ad69d94d4c991fe745ec0f41fcdeafd5ec6a60b88a": {
                "Name": "apache1",
                "EndpointID": "c835e32a361103ae5d93da6740218b8720e9aa7e7a2a0577a05a3284cb3c5310",
                "MacAddress": "02:42:a9:fd:00:02",
                "IPv4Address": "169.253.0.2/16",
                "IPv6Address": ""
            },
            "85e7e7a6c99736a7ed428cb9df987ceee4107f3a2bd718c9d5be5d19c3b5025e": {
                "Name": "apache3",
                "EndpointID": "e25ec9c88c9b119425b4864b1304c1cd60604d84b427b28acdf2e8fa9f5a3d1d",
                "MacAddress": "02:42:a9:fd:00:04",
                "IPv4Address": "169.253.0.4/16",
                "IPv6Address": ""
            },
            "d9261eccd254f0d579033f312332bccb5430b06f4a82efb74023dee770483078": {
                "Name": "apache2",
                "EndpointID": "0535dca700b252bfa47564c68644e844d2cefc3cca40ce1c5eaf284c859f7c49",
                "MacAddress": "02:42:a9:fd:00:03",
                "IPv4Address": "169.253.0.3/16",
                "IPv6Address": ""
            }
        },
....
#此时,三个容器可以互相通信
$ docker exec -it apache2 ping apache3
PING apache3 (169.253.0.4) 56(84) bytes of data.
64 bytes from apache3.mynet (169.253.0.4): icmp_seq=1 ttl=64 time=0.175 ms
64 bytes from apache3.mynet (169.253.0.4): icmp_seq=2 ttl=64 time=0.132 ms
64 bytes from apache3.mynet (169.253.0.4): icmp_seq=3 ttl=64 time=0.160 ms
.....

删除connect命令
$ docker network  disconnect -f mynet apache3
#此时又无法通信
$ docker exec -it apache2 ping apache3
ping: apache3: Name or service not known

http://www.niftyadmin.cn/n/749196.html

相关文章

深入浅出 Create React App

本文差点难产而死。因为总结的过程中&#xff0c;多次怀疑本文是对官方文档的直接翻译和简单诺列&#xff1b;同时官方文档很全面&#xff0c;全范围的介绍无疑加深了写作的心智负担。但在最终的梳理中&#xff0c;发现走出了一条与众不同的路&#xff0c;于是坚持分享出来。 …

Docker三剑客之docker-swarm

Docker Swarm 介绍 swarm集群存在manager节点和worker节点 初始化 # docker swarm init $ docker swarm --help Usage: docker swarm COMMAND Manage Swarm Commands:ca Display and rotate the root CAinit Initialize a swarmjoin Join a swarm …

mysql时间差函数datediff和TIMESTAMPDIFF

7.时间差函数&#xff1a;datediff(date1,date2) &#xff08;1&#xff09;select datediff(now(), now());#0 &#xff08;2&#xff09;select datediff(2018-04-22 23:59:00, 2018-04-20 00:00:00);#2 8.时间差函数&#xff1a;TIMESTAMPDIFF select TIMESTAMPDIFF(DAY, 20…

Harbor镜像仓库搭建

Harbor镜像仓库搭建 1、安装底层需求 ​ Python应该是2.7或更高版本​ Docker引擎应为1.10或更高版本​ DockerCompose需要为1.6.0或更高版本 2、Harbor安装 Harbor 官方地址&#xff1a; ​ https://github.com/vmware/harbor/releases 配置harbor.yml $ tar -zxvf harb…

2020 年 Java 程序员应该学习什么?

大家好&#xff0c;我相信大家在新的一年都有一个良好的开端&#xff0c;并准备好制定一个提升自我技术的目标。作为 Java 开发人员&#xff0c;我还制定了一些目标&#xff0c;希望在今年成为一名更好的 Java 开发人员。 如果你尚未制定目标&#xff0c;这将帮助你制定 2020 …

mysql函数IFNULL和NULLIF和ISNULL

10.IFNULL和NULLIF和ISNULL (1)IFNULL(A,B) IFNULL(fieldA,fieldB),意义是当字段fieldA是NULL时取fieldB&#xff0c;不是NULL时取fieldA的值。 (2)isnull(expr) 如expr为null&#xff0c;那么isnull() 的返回值为 1&#xff0c;否则返回值为 0。 (3)NULLIF(expr1,expr2) 如果…

深入浅出 JVM 系列(一)初识 JVM

阅读本文大概需要 5.6 分钟 前言搜书 https://biqi.org/ 在 Java 开发中&#xff0c;我们经常会提到 JVM。我们知道 JVM 是 Java 虚拟机&#xff0c;但是它的运行原理是什么&#xff1f;它的内存结构是什么&#xff1f;如何进行优化&#xff1f;如何去定位问题&#xff1f;面试…

Docker可视化、数据持久化

可视化&#xff08;portainer&#xff09; $ docker run -d -p 9000:9000 -p 8000:8000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer $ docker ps CONTAINER ID IMAGE …