宋东 发表于 2024-4-23 10:22:18

docker网络

一:docker网络基础知识

1:网络驱动

docker网路子系统使用可插拔(理解一下)的驱动,默认的情况下有多个驱动的程序,并且提供核心的联网的功能
1、bridge:桥接网络,这个是默认的网络驱动程序,不指定驱动成创建的容器默认是bridge驱动
2、host:主机网络,消除了容器和主机网络隔离,直接使用主机的网络
3、overlay网络,可以将多个docker守护程序进行连接,实现跨主机之间的通信(swarm集群)
4、macvlan:将mac地址分配给容器,使容器作为网络上的物理设备,不通过docker主机网络站进行路由,直接通过mac地址路由到容器 
5、none:表示关闭容器的所有网络连接,常常与自定义网络驱动一起使用,不适用于swarm
6、网络插件:可以通过docker安装和使用第三方的网络插件
2:docker网络驱动选用的规则

1、bridge桥接网络,最适合用于同一个docker主机上运行多个容器之间需要通信的场景(单主机)
2、host主机网络,适合用于当网络栈不能与docker主机隔离,而容器的其他方面需要被隔离的场景(解除容器和主机之间的隔离),相当于容器共用主机的网络信息
3、overlay网络,不同docker主机上运行的容器需要通信的场景,或者多个应用程序通过swarm集群服务一起工作的场景(多主机,集群)
4、macvlan网络,适用于从虚拟机迁移过来的工作场景,或者容器需要网络上的物理机一样,拥有独立的mac地址场景(容器需要mac)
5、第三方网络插件适用于docker与专用网络栈进行集成的场景(定制化,根据不同的需求)
3:容器的网络模式

1、桥接模式

 桥接网络分为,默认的桥接网络和自定义的桥接网络
桥接网络使用单主机运行的容器间的通信
实现原理:桥接网络使用软件网桥,让连接到同一个桥接网络的容器可以互相通信,没连接该网桥的容器被隔离,
工作流程:
docker守护进程启动,会在主机上创建一个名为docker0的虚拟网桥,还有一个配置文件,专门用来配置这个网桥的信息,启动容器没有特别的指定,自动连接到虚拟网桥上面
图解:
 

案例:
# docker network ls
NETWORK ID   NAME      DRIVER    SCOPE
7d65ce16e402   bridge    bridge    local
5f3fcf22894d   host      host      local
b99add30e794   none      null      local
# docker network create--driver bridge qqq
a6b2b151b3b46ca2a2921a4549cd1d88071ff5d908691892663e5001238bf8ba
# docker network ls
NETWORK ID   NAME      DRIVER    SCOPE
7d65ce16e402   bridge    bridge    local
5f3fcf22894d   host      host      local
b99add30e794   none      null      local
a6b2b151b3b4   qqq       bridge    localdocker守护进程为每一个启动的容器创建一个veth对设备,(成对的出现,组成数据通通道,就是容器与宿主机主机的连接,靠的就是这个)
veth对时直接连接的一对虚拟网络接口,一个接口设置为新创建容器的接口(位于容器的网络名称空间中);另一个接口连接到虚拟网桥docker0(位于docker的网络名称空间中)
2、host模式 

1: host模式的容器使用host驱动,直接连接docker主机网络栈,实质,关闭docker网络,容器直接的使用主机操作系统的网络
2:host模式没有为容器创建一个隔离的网络环境,容器没有隔离的网络名称空间,也不会获得一个独立的网络名称空间,而是和docker主机共用一个网络名称空间
3:容器和主机在同一个网络中,使用主机的物理网络接口,没有独立的ip地址,直接使用主机的ip地址和端口,所以的话同一个主机上要做好协调,各个容器通过端口来进行区分
图解:
 共享主机ip,只是端口不同而已

 
3、container模式

 是一个特别的网络模式,主要用于容器和容器直接频繁的交流的情况,创建一个nginx的容器,直接连接到已存在的容器上面,这样就不用配置网络信息了
k8s集群使用这种网络模式
特点:
1)该模式指定新建的容器和现有的容器共享网络名称空间,也就是在创建容器的时候,要指定现有的容器,然后进行共享
2)新创建的容器和一个现有指定容器共享Ip地址,端口范围,不创建自己的网络接口,ip地址
3)2个容器之间网络不隔离,进程可以通过回环网络进行通信
4)这2个容器和主机和其他容器存在网络隔离
4、none模式

 实际上关闭了容器的网络功能
特点:none模式,容器有自己的网络名称空间,但没有进行任何的网络配置,容器只能使用回环接口127.0.0.1
可用场景
1,有些容器不需要网络,列如,只需要写入磁盘卷的批处理任务
2,安全性要求较高且不需要联网的应用可以使用none模式
3,要创建自定义网络
5、用户自定义网络模式

可以使用网络驱动或第三方的插件创建一个自定义的网络,然后将多个容器连接到同一个自定义网络
特点:
1)连接到用户自定义网络的容器,可以使用ip地址或名称相互通信(默认的网络模式只能使用ip来进行访问)
2) 可以根据需要创建任意数量的自定义网络(默认的话数量少)
3)可以在任何时间将容器连接到这些网络
4)对运行的容器,可以连接,断开自定义网络,无需重启容器
用户自定义桥接网络:单机环境中常用,
不推荐使用默认桥接网络,原因如下:
1、用户自定义桥接网络能提供容器化应用程序之间更好的隔离和互操作性,如果在默认的桥接网络上运行应用栈,则docker主机需要通过其他访问来限制对端口的访问
2、用户自定义桥接网络提供容器之间自动dns解析功能,可以通过名称或者别名互相的访问,而默认桥接网络上的容器只能通过ip地址互相访问
3、容器可以在运行时与用户自定义网络连接和断开,要断开与默认桥接网络的连接,需要停止容器并使用不同的网络选项重新创建该容器
4、每个用户可以通过自定义网络创建一个可配置的网桥(也会创建相对应的配置文件),而默认桥接网络会自动创建一个为名为docker0的虚拟网桥
5、用户自定义网络中所连接容器不能共享环境变量,可以通过docker卷挂载,compose文件定义,集群,默认桥接网络中所连接的容器共享环境变量
4:容器间的通信方案

 1、bridge模式

bridge模式让通一个docker网络上的所有容器在所有端口上都可以互相的连接
用户自定义桥接网络中,容器之间可以通过名称或别名互相访问
1)默认桥接网络不支持基于名称的服务发现和用户指定的Ip地址(就是自已指定ip地址),所连接的容器只能通过ip地址互相访问
案例:不能通过容器名ping通,但是可以通过ip地址互相访问
# docker run -tid --name q1centos /bin/bash
3b20299d0207bb56656a70341895b6bbd2b83ce89bd439bdd60d37450ee7d101
# docker run -tid --name q2 centos /bin/bash
1df5fb188045a93392d26f62aaeedc59512cd8a6ac7dc13eb73a8f9f11e574e2
# docker inspect q2 | grep -i address
            "LinkLocalIPv6Address": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "IPAddress": "172.17.0.3",
            "MacAddress": "02:42:ac:11:00:03",
                  "MacAddress": "02:42:ac:11:00:03",
                  "IPAddress": "172.17.0.3",
                  "GlobalIPv6Address": "",
# docker inspect q1 | grep -i address
            "LinkLocalIPv6Address": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "IPAddress": "172.17.0.2",
            "MacAddress": "02:42:ac:11:00:02",
                  "MacAddress": "02:42:ac:11:00:02",
                  "IPAddress": "172.17.0.2",
                  "GlobalIPv6Address": "",
#使用容器名不能互相访问
# docker exec -ti q1 /bin/bash
# ping q2
ping: q2: Name or service not known

#使用容器ip地址互相访问
# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.059 ms
^C
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.059/0.061/0.064/0.008 ms
# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.039 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.039/0.041/0.044/0.006 ms

默认桥接网络模式下的容器想要使用容器名来互相访问的话,使用--link选项建立容器连接
(见link案例)2、hosts模式

host模式让所有的容器都位于同一个主机网络中,并且公用主机的ip地址栈,在该容器上所有的容器可通过主机的网络接口进行通信
案例:hosts模式和容器的网络配置看起来是一样的,但是实质是不同的
# docker run-tid--network host --name q3 centos/bin/bash
4df9a2c3184f032541af018d633b48dd209dbab0cf8809163c83aeeb59f17e98
# docker run-tid--network host --name q4 centos/bin/bash
9be5aab969639adee98c5611ef7cdc70f9e2015b55399033466e103ca75fc153
# docker exec -ti q3 /bin/bash
# ls
binetc   lib          lost+foundmntprocrun   srvtmpvar
devhomelib64media       optrootsbinsysusr
# ifconfig
bash: ifconfig: command not found


#公用主机的ip地址3、容器通过端口映射对外部提供连接

-P,-p选项实现端口映射,就是容器可以访问外面,但是外面访问不了容器,需要通过端口映射才能实现访问容器内部
4、container模式

container模式让容器共用一个ip网络,2个容器之间可以通过回环接口相互通信,container模式就是规定了新创建的容器要指定一个已存在的容器,然后实现网络共享
# docker run -tid --name q5 centos /bin/bash
8d00696f223d84682cfbb4dc0f6300ea54e4cd4240ca30834248a42de51ef998
# docker run -tid--name q6 --network container:q5 centos /bin/bash
861e20d9893cf694622f019d364f2ab4a64904ee8006b02f4936800f66ee7a20
# docker ps
CONTAINER ID   IMAGE   COMMAND       CREATED          STATUS          PORTS   NAMES
861e20d9893c   centos    "/bin/bash"   2 seconds ago    Up 2 seconds            q6
8d00696f223d   centos    "/bin/bash"   47 seconds ago   Up 46 seconds             q5

2个ip地址是一样的5:容器之间使用--link选项建立传统的容器互联(见下面)  

6:容器直接通过挂载主机目录来实现相互之间的数据通信

5:传统容器连接

 创建容器的时候使用--link选项可以建立容器之间的连接
特性:
1、可以将多个容器连接在一起,并在容器之间发送连接信息
2、当容器被连接时,在原容器和接收容器之间建立一个安全通道,原容器发送信息到接收容器,让接收容器访问原容器所指定的数据
3、为容器自定义表示特定的用途的名称更加容器记忆,
4、通过该名称引用其他的容器,弥补默认桥接网络不支持容器名称解析的问题
选项
docker run --link 原容器的名称或id
docker run --link 原容器的名称或id,:容器别名
案例:可以通过原容器的名称和别名进行访问
# docker run -tid --name q1 centos /bin/bash
9b83b5a18ce35d3cba85e0d138b8cee0a62b3f2fb4f3c1e6cd95e4e5ccf6549e
# docker ps
CONTAINER ID   IMAGE   COMMAND       CREATED         STATUS         PORTS   NAMES
9b83b5a18ce3   centos    "/bin/bash"   9 seconds ago   Up 9 seconds             q1
# docker run -tid --name q2 --link q1:qqq centos /bin/bash
2e65ec7a17137d0ff7665f3afcb8732e0fefeefa3dcbfafe526288a796979e02
# docker exec -ti q2 /bin/bash
# ping q1
PING qqq (172.17.0.2) 56(84) bytes of data.
64 bytes from qqq (172.17.0.2): icmp_seq=1 ttl=64 time=0.067 ms
^C
--- qqq ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.067/0.067/0.067/0.000 ms
# ping qqq
PING qqq (172.17.0.2) 56(84) bytes of data.
64 bytes from qqq (172.17.0.2): icmp_seq=1 ttl=64 time=0.052 ms
^C
--- qqq ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.052/0.052/0.052/0.000 ms
# 6:容器访问外部的网络

1、默认的情况下,容器可以主动的访问到外部网络,外部的网络不能访问容器 
2、使用bridge模式(默认桥接网络)的容器通过nat方式实现访问外部的网络,具体通过的是iptables(过滤防火墙)的源地址伪装实现的
3、iptables伪装,容器访问外网的连接,源地址都被NAT伪装成本地系统的ip地址
流程:
容器访问外网的话,通过这个nat转发出去,内部的地址转换成公网的ip地址
发送一个请求,会回应一个,
就是在发送一个请求的时候,会去加包,
回应的时候,就解包
 查看主机NAT规则:
# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 9 packets, 1789 bytes)
pkts bytes target   prot opt in   out   source               destination         
    2   104 DOCKER   all--*      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 9 packets, 1789 bytes)
pkts bytes target   prot opt in   out   source               destination         

Chain OUTPUT (policy ACCEPT 2 packets, 119 bytes)
pkts bytes target   prot opt in   out   source               destination         
    0   0 DOCKER   all--*      *       0.0.0.0/0         !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 2 packets, 119 bytes)
pkts bytes target   prot opt in   out   source               destination         
    0   0 MASQUERADEall--*      !br-a6b2b151b3b4172.18.0.0/16      0.0.0.0/0         
    4   262 MASQUERADEall--*      !docker0172.17.0.0/16      0.0.0.0/0         

Chain DOCKER (2 references)
pkts bytes target   prot opt in   out   source               destination         
    0   0 RETURN   all--br-a6b2b151b3b4 *       0.0.0.0/0            0.0.0.0/0         
    0   0 RETURN   all--docker0 *       0.0.0.0/0            0.0.0.0/0         7:外部网络访问容器

容器内部能够被外部网络或者那些未连接到容器的网络上的docker主机访问的,就需要将容器的端口映射到docker主机上的一个端口,允许从外部网络通过该端口进行访问容器
实现原理:将容器的一个端口映射给主机的一个端口,允许外部网络通过该端口访问容器,这也是一种NAT实现,即目标地址转换
1、-P发布容器所有暴露的端口

-P选项会将容器要发布的端口随机和主机的端口映射
暴露端口的方式:
第一种:在dockerfile用EXPOSE指令指定
第二种:--expose选项在创建容器时指定
#在创建的时候,不需要添加额外的指令
# docker run -tid --name q3 -P httpd
48a98db3289818f2c2b50762bb8c5dcf3fd322d356a1e73cc1ba1f67871ccc6d
# docker ps
CONTAINER ID   IMAGE   COMMAND            CREATED             STATUS             PORTS                                     NAMES
48a98db32898   httpd   "httpd-foreground"   1 second ago      Up 1 second      0.0.0.0:32769->80/tcp, :::32769->80/tcp   q3
2e65ec7a1713   centos    "/bin/bash"          About an hour ago   Up About an hour                                             q2
9b83b5a18ce3   centos    "/bin/bash"          About an hour ago   Up About an hour                                             q1
# curl 0.0.0.0:32769
<html><body><h1>It works!</h1></body></html>2、-p发布容器特点的端口

-p选项可以将一个或者多个端口映射到主机上,可以使用多个-p设置任意数量的端口映射
# docker run -tid --name q4 -p 8888:80httpd
519632720d8d4b4f12bdd5547ad47a28390ed67fc78b45c775d8e2aae820cbfe
do# docker ps
CONTAINER ID   IMAGE   COMMAND            CREATED             STATUS             PORTS                                     NAMES
519632720d8d   httpd   "httpd-foreground"   7 seconds ago       Up 7 seconds       0.0.0.0:8888->80/tcp, :::8888->80/tcp   q4
48a98db32898   httpd   "httpd-foreground"   2 minutes ago       Up 2 minutes       0.0.0.0:32769->80/tcp, :::32769->80/tcp   q3
2e65ec7a1713   centos    "/bin/bash"          About an hour ago   Up About an hour                                             q2
9b83b5a18ce3   centos    "/bin/bash"          About an hour ago   Up About an hour                                             q1
# curl 0.0.0.0:8888
<html><body><h1>It works!</h1></body></html>8:容器的网络配置语法

1、设置容器的网络连接(--network)

 --network可以选项容器连接的网络模式,
网络模式:
none,容器不需要联网
bridge:连接到默认的桥接网络
host:使用默认的主机模式
container:容器使用另外一个容器的网络
网络名或者网络Id:连接自定义的网络,通常用这个
# docker networkls
NETWORK ID   NAME      DRIVER    SCOPE
7d65ce16e402   bridge    bridge    local
5f3fcf22894d   host      host      local
b99add30e794   none      null      local
a6b2b151b3b4   qqq       bridge    local
# docker run -tid --name q5 --network hostcentos /bin/bash
e853cdded2d3f5d7d20527eb715718447f83e03d6c882f3a5c2a58d5b2c456a32、为容器添加网络作用域的别名(network-alias)

 这个设置只支持自定义的网络,默认的网络不支持这个,自定义网络除了通过容器名进行访问外,还能通过别名来进行访问
#创建一个自定义的桥接网络
# docker network create--driverbridgeb1
633c2ebbd6f2b646cc6eb01ea46183e8e02506fbfa4dcf844d77e82131b2ffb0
# docker network ls
NETWORK ID   NAME      DRIVER    SCOPE
633c2ebbd6f2   b1      bridge    local
7d65ce16e402   bridge    bridge    local
5f3fcf22894d   host      host      local
b99add30e794   none      null      local

#创建2个容器,都使用这个网桥
# docker run -tid --name q6 --network b1 --network-alias qq6 centos /bin/bash
27abc773ce6f5d57bf9f650f599be2aef1134f48758aa8c10f00dd9932af3de0
# docker run -tid --name q7 --network b1 --network-alias qq7 centos /bin/bash
6e855d7014d7b5d076daa72b0cacc123ae1d20afe812d338e3717a20d9070656
#通过查看容器的详细信息,可以查询到
# docker inspectq6|grep   -C 2-i alias
                  "IPAMConfig": null,
                  "Links": null,
                  "Aliases": [
                        "qq6",
                        "27abc773ce6f"


#互相访问别名(自定义网络,别名和容器名都能实现访问)
# docker exec -ti q6 /bin/bash
# ping qq7
PING qq7 (172.19.0.3) 56(84) bytes of data.
64 bytes from q7.b1 (172.19.0.3): icmp_seq=1 ttl=64 time=0.038 ms
^C
--- qq7 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms
# ping q7
PING q7 (172.19.0.3) 56(84) bytes of data.
64 bytes from q7.b1 (172.19.0.3): icmp_seq=1 ttl=64 time=0.081 ms
^C
--- q7 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.081/0.081/0.081/0.000 ms3、设置容器的ip地址(--ip)

前置的条件,用户自定义网络,用户自定义网络配置了子网(也就是网段,才能设置自定义设置容器的ip地址)
语法:--ip ip地址
#创建一个带有子网的自定义桥接网络
# docker network create --driver bridge--subnet 10.0.0.0/24 --gateway 10.0.0.254 b1
a699494c07d0f5eca00b0238008ac24ea5fb8c901d0a6d43a42008bb9e2c530d
# docker network inspect b1 | grep -C2 -i subnet
            "Config": [
                {
                  "Subnet": "10.0.0.0/24",
                  "Gateway": "10.0.0.254"
                }

#创建一个指定Ip地址的容器
# docker run -tid --name q1 --network b1 --ip 10.0.0.7 centos /bin/bash
ab82facc79cef6166ec7c629a91680d5a100c60b8b519dc28509a94333332b5c
# docker inspect q1 | grep -i ipv4address
                        "IPv4Address": "10.0.0.7"4、设置容器的网络接口mac地址

默认的情况下,容器的mac地址是基于ip地址生成的
可以通过--mac-address选项,为容器指定一个mac地址
手动指定的mac地址,docker不会去检查地址的唯一性
#将容器设置为宿主机的mac地址
# docker run -tid --name q2-mac --mac-address 00:0c:29:70:f4:c7 centos /bin/bash50e9d8631e654e450dbe016f4baf34e6780cf7b67923dce4368dbdbd6cd8d7c5
# docker inspectq2-mac |grep -i macaddress
            "MacAddress": "00:0c:29:70:f4:c7",
            "MacAddress": "00:0c:29:70:f4:c7",
                  "MacAddress": "00:0c:29:70:f4:c7",
#使用宿主机类型的mac地址(如果偏差太大的话,会报错的)
# docker run -tid --name q3-mac --mac-address 00:0c:29:70:f4:c8 centos /bin/bash
62e18fc6990410b592b49a7230f74858075c2082220dcdc42298d4d72bf1a64d
# docker inspectq3-mac |grep -i macaddress
            "MacAddress": "00:0c:29:70:f4:c8",
            "MacAddress": "00:0c:29:70:f4:c8",
                  "MacAddress": "00:0c:29:70:f4:c8", 5、设置容器的dns配置和主机名(--dns 和 --hostname)

默认的情况下的话,容器继承docker守护进程的dns配置,/etc/hosts和/etc/resolv.conf配置文件 
1:--dns为容器设置dns服务器地址

配置dns后会修改容器内容,/etc/resolv.con的内容
# docker run -tid --name q1 --dns 119.29.29.29 centos /bin/bash
83b2ace633efbc858797c5b7906f73fa125b96d1adfbfe433e569c8eb821bbd0
# docker exec -ti q1 /bin/bash
# cat /etc/resolv.conf
nameserver 119.29.29.292、--dns-search为容器设置搜索域

就是添加多个dns的域
# docker run -tid --name q2 --dns-search opop centos /bin/bash
ab7b827a1273dc2e80c3c217db4a2a5853e70a4ecd37b81b31bb89d64d58b307
# docker exec -ti q2 /bin/bash
# ls
binetc   lib          lost+foundmntprocrun   srvtmpvar
devhomelib64media       optrootsbinsysusr
# cat /etc/resolv.conf
search opop
nameserver 8.8.8.83、--dns-option设置dns选项

# docker run-tid --name q3   --dns-option yun centos /bin/bash
1d39084f5ffc969884bc5b130ab958e4bfc0b6211d20b09d4f98cdef3acafe1e
# docker exec -ti q3 /bin/bash
# cat /etc/resolv.conf
nameserver 8.8.8.8
options yun4、设置主机名(--hostname)

# docker run -tid --name q1 --hostname q111 centos /bin/bash
338df3a867c6b8e64b1d34490484a0298d4c55380b41b9370bed0bbe022279dc
# docker exec -ti q1 /bin/bash
# cat /etc/hostname
q111 
 总结:

1:自定义和默认的网络区别:

  1、自定义的网络能够通过容器名和别名来进行访问,默认的网络只能通过ip地址来进行访问(还可以在创建的时候使用--liink选项,通过容器名和别名来进行访问)
  2、自定义的网络,可以随时的断开连接,默认的网络需要先关闭容器,再来实现断开的操作
  3、自定义的网络可以设置指定容器的ip地址,默认的网络不能设置指定的ip地址
  4、自定义网络有dns的解析,默认的网络没有dns的解析,所以的话,就无法实现通过容器名和别名进行访问
2:容器与外界的通信的情况

  1、默认的情况下,容器可以访问外网,通过nat地址转换,实现伪装源地址来进行访问外网
  2、外界不能访问容器,只能通过实现容器端口映射到主机上面,才能实现访问
3、root用户的容器和普通用户的容器的区别(后面详细的介绍)

  1、root用户创建的容器,容器和宿主机能互相通信
  2、普通用户创建的容器,容器能与宿主机进行通信,但是宿主机不能与容器进行通信
4、docker网络模式

  1、docker桥接模式下,创建一个容器,会自动的创建一个veth对,一个用于连接在网桥上,另外一个用于容器与宿主机进行通信的
  2、docker主机模式下,容器使用的宿主机的网络,多个容器之间通过端口来进行区分
  3、docker中container模式,用于容器与容器之间高频繁的交流,就是创建一个容器将其指定到已存在的容器,这样就不用配置网络的相关信息,并且共同承担一个业务
5:docker网络模式管理

  1:对于已经定义好了的docker的话,不能进行修改,只能进行重新创建来达到修改的目的
 
二:docker网络管理命令

语法:

# docker network --help

Usage:docker network COMMAND

Manage networks

Commands:
connect   Connect a container to a network   //连接多个网络
create      Create a network    ///创建一个网络出来    --driver 就是驱动(模式)
disconnectDisconnect a container from a network    //不连接
inspect   Display detailed information on one or more networks//查看详细的网络信息
ls          List networks         //列出信息
prune       Remove all unused networks    //删除没有连接的网络
rm          Remove one or more networks   //删除网络

Run 'docker network COMMAND --help' for more information on a command. 
1、查看网络列表

# docker network ls
NETWORK ID   NAME         DRIVER    SCOPE
65b073e7e96c   alpine-net   bridge    local
7a3d70317629   bridge       bridge    local
b6f9942d6636   host         host      local
4336bf5bf74b   none         null      local2、查看网络详细的信息

# docker inspect none
[
    {
      "Name": "none",
      "Id": "4336bf5bf74bc0db81cd3ba066299107ca1d9fc1c76cd3b487e092c808cab229",
      "Created": "2024-03-05T16:57:40.656076516+08:00",
      "Scope": "local",
      "Driver": "null",
      "EnableIPv6": false,
      "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": null
      },
      "Internal": false,
      "Attachable": false,
      "Ingress": false,
      "ConfigFrom": {
            "Network": ""
      },
      "ConfigOnly": false,
      "Containers": {},
      "Options": {},
      "Labels": {}
    }
]3、创建用户自定义桥接网络并连接容器


# docker network create--driver bridge--subnet 192.168.107.0/24 --gateway 192.168.107.254 n1
8aec3d57d238b34eb6e0cb31b71775511bddfefebe8f87cb309150909c1fc646
# docker network ls
NETWORK ID   NAME      DRIVER    SCOPE
d1ea2ab3dab8   bridge    bridge    local
5f3fcf22894d   host      host      local
8aec3d57d238   n1      bridge    local
b99add30e794   none      null      local
# docker inspect n1
[
    {
      "Name": "n1",
      "Id": "8aec3d57d238b34eb6e0cb31b71775511bddfefebe8f87cb309150909c1fc646",
      "Created": "2024-04-23T20:06:37.31247228+08:00",
      "Scope": "local",
      "Driver": "bridge",
      "EnableIPv6": false,
      "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                  "Subnet": "192.168.107.0/24",
                  "Gateway": "192.168.107.254"
                }
            ]
      },
      "Internal": false,
      "Attachable": false,
      "Ingress": false,
      "ConfigFrom": {
            "Network": ""
      },
      "ConfigOnly": false,
      "Containers": {},
      "Options": {},
      "Labels": {}
    }
]
#创建一个容器,连接到这个n1的桥接网卡上面
# docker run -tid --name q1 --network n1centos /bin/bash
d098c15e25afd7d39a672f8193a658249016cfecd3e62f309cae4c7a317b94a9
# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                 NAMES
d098c15e25af   centos         "/bin/bash"            3 seconds ago   Up 2 seconds                                           q1
110106833b95   centos-nginx   "nginx -g 'daemon of…"   6 minutes ago   Up 6 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   c1
# docker exec -ti q1 /bin/bash
# ping www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) bytes of data.
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=1 ttl=127 time=48.10 ms
^C
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 48.952/48.952/48.952/0.000 ms
#查看容器的ip信息
# docker inspect q1 | grep-i address
            "LinkLocalIPv6Address": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "IPAddress": "",
            "MacAddress": "",
                  "MacAddress": "02:42:c0:a8:6b:01",
                  "IPAddress": "192.168.107.1",
                  "GlobalIPv6Address": "", 4、设置端口映射,允许外部网络访问容器

#通常的情况下的话,外部访问不了容器内部,只有容器可以进行访问外面
#可以使用window的命令模式来进行测试,发现只有容器能访问,其余的不能进行访问容器内部
#但是可以通过主机端口映射到容器里面,通过访问主机从而实现访问容器

# docker run -tid --name q1 -p 8080:80 httpd /bin/bash
6bf72067681d7073cd05e9b4422eed73ac350b476e64745686ce53a6a572d09d
# docker exec -ti q1 /bin/bash
root@6bf72067681d:/usr/local/apache2# httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
root@6bf72067681d:/usr/local/apache2# exit
exit
# docker inspect q1 | grep-i address
            "LinkLocalIPv6Address": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "IPAddress": "172.17.0.2",
            "MacAddress": "02:42:ac:11:00:02",
                  "MacAddress": "02:42:ac:11:00:02",
                  "IPAddress": "172.17.0.2",
                  "GlobalIPv6Address": "",
# curl 172.25.250.110:8080
<html><body><h1>It works!</h1></body></html>


#使用windows的命令行,curl来进行访问5:容器连接多个网络

一个容器可以连接多个网络模式,默认的桥接的模式和自定义的桥接模式,
#默认的桥接网络和自定义的桥接网络之间是不能互相通信的
#容器即连接了默认的桥接也连接了自定义的桥接,就能实现通信
#连接默认的桥接网络
# docker network connectbridgeq2
#实质就是连接默认的桥接网络,也分配一个Ip地址,所以才能实现通信
# docker inspectq2 | grep -i address
            "LinkLocalIPv6Address": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "IPAddress": "172.17.0.3",
            "MacAddress": "02:42:ac:11:00:03",
                  "MacAddress": "02:42:ac:11:00:03",
                  "IPAddress": "172.17.0.3",
                  "GlobalIPv6Address": "",
                  "MacAddress": "02:42:c0:a8:6b:01",
                  "IPAddress": "192.168.107.1",
                  "GlobalIPv6Address": "",
#进行通信
# docker exec -ti q2 /bin/bash
# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.050 ms
^C
--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.050/0.050/0.050/0.000 ms  
 
 
 
 
 
 
 
 
 
 
 
-
 

来源:https://www.cnblogs.com/qw77/p/18124244
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: docker网络