docker ——网络配置和管理

docker网络基础

了解docker网络

两种docker网络

  • 单主机与多主机的docker网络

网络驱动

网络驱动 介绍
bridge 桥接网络,这是默认的网络驱动程序
host 主机网络
overlay 覆盖网络
macvlan 将mac地址分配给容器,使容器作为网络上的物理设备
none 表示关闭容器的所有网络连接
网络插件 可以通过Docker安装和使用第三方的网络插件

选择网络驱动的原则

  • 用户自定义桥接网络最适合用于同一个docker主机上运行多个容器之间需要通信的场景。
  • host乌拉盖诺最适用于当网不能与docker主机隔离,而容器的其他地方需要被隔离的场景
  • overlay网络适用于不同docker主机上运行的容器需要的通信的场景,或者多个应用程序通过Swarm集群服务一起工作的场景
  • macvlan网络适用于从虚拟机迁移过来的场景,或者向网络上的乌力吉一样,拥有独立的mac地址的场景
  • 迪斯拉罕网络插件适用与将docker与专用网络栈进行集成的场景

容器的网络模式

创建容器时,可以指定容器的我那个若模式。docker可以有以下四种模式:
一.bridge 模式
1.了解

  • 生产环境中被弃用。
    image
    • docker守护进程为每一个启动的容器创建一个VETH对 设备。VETH对设备总是成对出现,他们组成了一个数据通道。数据从一个设备进入,就会从另一个设备出来。
      image
  • 默认配置运行一个容器,会添加一张VETH的网卡。
  • 删除容器,网卡消失。
  • docker0 是docker的守护进程一启动,就会在主机上创建docker0的虚拟网桥
    2.操作
    (1).查看网络连接和查看网络详细信息
[root@hmm ~]# docker network inspect bridge  //查看网络详情
[
    {
        "Name": "bridge",
        "Id": "5afc9ac7b6a51ccd2d1a6fe00c6b5e64760817ff084b8d10609cf52686978a49",
        "Created": "2024-04-09T16:01:59.731474913+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0557f384f47cc9a105ea79770dcaa5455c1b501dfb5cd8d2e7844ef18ef1c8cf": {
                "Name": "gifted_shannon",
                "EndpointID": "5dd14220ecb730e61bafb08715a4acab3ebb4fe5492bbe377fe79da3cdcd524f",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "34f04786c73664ed062d99fc4b8d96a462810e581573f2278ea80d11dbfa548b": {
                "Name": "myregistry",
                "EndpointID": "b8a0deb96a314ead633c3d7dca013124144cbebac4b385fb7e4e07242f3e55ed",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
[root@hmm ~]# docker network ls   //查看网络列表
NETWORK ID     NAME      DRIVER    SCOPE
5afc9ac7b6a5   bridge    bridge    local
67bc430327bc   host      host      local
5f92e59bee8f   none      null      local

eg:

  • 容器的网络桥接信息中,网络和默认桥接网络完全对应
    docker守护进程为每一个启动的容器

二.host模式
1.了解host模式

  • 选择host模式的容器使用host驱动,直接连接到docker主机网络栈。这种网络模式实质上是关闭docker网络,而让容器直接使用主机操作系统的网络
  • host模式没有为容器创建一个隔离的网络环境,容器没有隔离的网络名称空间,也不会获得一个独立的网络名称空间,而是和docker主机共用一个网络名称空间

三.container模式
1.了解

  • 主要用于容器和容器的直接频繁交流的情况
  • 该模式指定新创建的容器和现有的一个容器,而不是和docker主机共享同一个网络名称空间
  • 两个容器除了网络方面,其他的如文件系统,进程列表等还是互相隔离的。两个容器的进程可以通过回环网络接口进行通信的
    image
    四.none模式
    1.了解
  • 将容器放置在自己的网络栈中,但是并不进行任何配置,实际上关闭了容器的网络功能。
    五。用户自定义网络
    1.了解
  • 可以使用docker网络驱动,或第三方网络驱动插件创建一个自定义的网络,然后将多个容器连接到同一个自定义网络
  • 用户自定义桥接网络与默认桥接网络的主要区别
  • 优点:可以通过名称或者别名互相访问。

2.实操
(1)默认情况下,容器之间不能用别名访问

[root@hmm ~]# docker ps 
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS             PORTS                                       NAMES
0557f384f47c   centos            "/bin/bash"              19 minutes ago   Up 19 minutes                                                  gifted_shannon
34f04786c736   registry:latest   "/entrypoint.sh /etc…"   13 days ago      Up About an hour   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   myregistry
[root@hmm ~]# docker exec -ti 055 /bin/bash
[root@0557f384f47c /]# 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.151 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.060 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.060/0.105/0.151/0.046 ms
[root@0557f384f47c /]# ping 34f04786c736
ping: 34f04786c736: Name or service not known
[root@0557f384f47c /]#   //可以使用ip ping ,但是使用主机名时访问不到

容器之间的通信方案

image

传统的容器连接

[root@hmm ~]# docker run -tid --name yun3test centos
93baea338e296e65137c58caaa91f4f48495340cbe018e9d3404b44492e47267
[root@hmm ~]# docker run  -tid --link yun3test:y3t centos  //要连接的容器名字:别名
524cd67dc2fe09e41858443b79a4e8d2cbad443cf432c01707192d40f19e457c
[root@hmm ~]# docker exec -ti 524c /bin/bash
[root@524cd67dc2fe /]# ping y3t //使用定义的别名连接
PING y3t (172.17.0.4) 56(84) bytes of data.
64 bytes from y3t (172.17.0.4): icmp_seq=1 ttl=64 time=0.198 ms
64 bytes from y3t (172.17.0.4): icmp_seq=2 ttl=64 time=0.054 ms
^C
--- y3t ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.054/0.126/0.198/0.072 ms
[root@524cd67dc2fe /]#

从外部访问容器

1.介绍
简单来说就是 将容器的一个端口映射到docker主机上的一个端口,允许从外部网络通过端口访问容器
要让容器能够被外部网络(docker主机外部)或者那些未连接到该端口访问容器。
2.实例:

root@hmm ~]# docker run -tid -p 8080:80 --name web-test  httpd 
7461b82860224f05276b12cae589fd89fa213ccc15d3222e08232c02125608d3
[root@hmm ~]# docker ps 
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS          PORTS                                       NAMES
7461b8286022   httpd             "httpd-foreground"       8 seconds ago   Up 7 seconds    0.0.0.0:8080->80/tcp, :::8080->80/tcp       web-test
34f04786c736   registry:latest   "/entrypoint.sh /etc…"   2 weeks ago     Up 36 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   myregistry
[root@hmm ~]# curl 10.0.0.10:8080
<html><body><h1>It works!</h1></body></html>
[root@hmm ~]# 

补充:-p和-P的区别

  • -p(静态
[root@hmm ~]# docker run -tid --name web-test3 -p 8081:80 httpd
efbee0e06554994c394c01668ad83147b8d7b47aafc70b81559841915d3cd1b6
[root@hmm ~]# docker port web-test3
80/tcp -> 0.0.0.0:8081
80/tcp -> [::]:8081
[root@hmm ~]# curl http://10.0.0.10:8081
<html><body><h1>It works!</h1></body></html>
[root@hmm ~]# 
  • -P(动态
[root@hmm ~]# docker run -tid --name web-test2 -P httpd
0b7a0b621f553c8668b274be47aa4da30e80ea038e55f427cbda686742b8e649
[root@hmm ~]# docker ps 
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS          PORTS                                       NAMES
0b7a0b621f55   httpd             "httpd-foreground"       About a minute ago   Up 59 seconds   0.0.0.0:32768->80/tcp, :::32768->80/tcp     web-test2
7461b8286022   httpd             "httpd-foreground"       7 minutes ago        Up 7 minutes    0.0.0.0:8080->80/tcp, :::8080->80/tcp       web-test
34f04786c736   registry:latest   "/entrypoint.sh /etc…"   2 weeks ago          Up 43 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   myregistry
[root@hmm ~]# docker port web-test2
80/tcp -> 0.0.0.0:32768
80/tcp -> [::]:32768
[root@hmm ~]# curl  http://10.0.0.10:32768
<html><body><h1>It works!</h1></body></html>
[root@hmm ~]#  //可以使用多个-p设置任意数量的端口映射

了解容器的网络配置用法

一.设置容器网络连接
1.容器启动时,可以用--network选项设置容器要连接的网络,即网络模式

  • none:使用none模式,容器不联网
  • bridge:使用默认桥接网络
  • hosy:使用默认的主机网络
  • container:容器使用另一个容器的网络
  • 网络名或网络ip:连接自定义网络,通常用这个。

2.案例:
none:

[root@hmm ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
9157d67bb75c   bridge    bridge    local
67bc430327bc   host      host      local
5f92e59bee8f   none      null      local
[root@hmm ~]# docker run --network none -tid --name none-test1 centos
e488e527ebc0b4a9c0b1b3706d47b5338b045d58aba0a8f372934bb4b6b4f7bf
[root@hmm ~]# docker ps 
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                       NAMES
e488e527ebc0   centos            "/bin/bash"              44 seconds ago   Up 43 seconds                                               none-test1
411f6067d60a   centos            "/bin/bash"              2 minutes ago    Up 2 minutes                                                none-test
efbee0e06554   httpd             "httpd-foreground"       12 minutes ago   Up 12 minutes   0.0.0.0:8081->80/tcp, :::8081->80/tcp       web-test3
0b7a0b621f55   httpd             "httpd-foreground"       15 minutes ago   Up 15 minutes   0.0.0.0:32768->80/tcp, :::32768->80/tcp     web-test2
7461b8286022   httpd             "httpd-foreground"       22 minutes ago   Up 22 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp       web-test
34f04786c736   registry:latest   "/entrypoint.sh /etc…"   2 weeks ago      Up 58 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   myregistry

[root@hmm ~]# docker inspect none-test1 --format="{{ json .HostConfig.NetworkMode }}"     //json后面需要空格 表示应用的变量
"none"
[root@hmm ~]#

二.为容器添加网络作用域的别名
1.解释
容器在网络作用域中允许有别名,别名在所在的网络中可以直接访问
使用--network-alias选项指定容器在网络中的别名
2.实例

  1. 网络作用域别名只支持用户自定义网络

错误:

[root@hmm ~]# docker run -tid --name test-alias --network-alias websrv can
docker: network-scoped aliases are only supported for user-defined networks.
See 'docker run --help'.
[root@hmm ~]#
//使用用户默认的网络使用自定义 是不支持的

成功:

[root@hmm ~]# docker network create --driver bridge yun3-nat
167e7d89276f2c1974ee208271a4f97b31ef1f836856360179bc8cff19b5ed7a
[root@hmm ~]# docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
9157d67bb75c   bridge     bridge    local
67bc430327bc   host       host      local
5f92e59bee8f   none       null      local
167e7d89276f   yun3-nat   bridge    local
[root@hmm ~]# docker run -tid --name test-alias01 --network yun3-nat --network-alias ta01 centos
c88e88c2559b8572bcfe84b36d2272525ff0995fc7429d9cfe9ebb9bccd5c2ab
[root@hmm ~]# docker run -tid --name test-alias02 --network yun3-nat --network-alias ta02 centos
59b7a48e36393570e5ff57b4e2dc22ba6e0123adb2ad44972ad95bfdc1dcaed0
[root@hmm ~]# docker exec -ti test-alias01 /bin/bash
[root@c88e88c2559b /]# ping ta02
PING ta02 (172.18.0.3) 56(84) bytes of data.
64 bytes from test-alias02.yun3-nat (172.18.0.3): icmp_seq=1 ttl=64 time=0.247 ms
^C
--- ta02 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.247/0.247/0.247/0.000 ms
[root@c88e88c2559b /]# ping alias02 
ping: alias02: Name or service not known
[root@c88e88c2559b /]# ping test-alias02
PING test-alias02 (172.18.0.3) 56(84) bytes of data.
64 bytes from test-alias02.yun3-nat (172.18.0.3): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from test-alias02.yun3-nat (172.18.0.3): icmp_seq=2 ttl=64 time=0.146 ms
^C
--- test-alias02 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1004ms
rtt min/avg/max/mdev = 0.049/0.097/0.146/0.049 ms
[root@c88e88c2559b /]#

三.设置容器的ip地址
1.介绍
使用--network选项连接自定义网络时,可以使用--ip和--ip6选项指定分配给容器的ip地址
两个前置条件:
1)用户自定义网络
2)用户自定义网络配置了子网
2.实例

  1. 失败:
//第一种情况,失败是因为没有使用用户自定义网络
[root@hmm ~]# docker run -tid --ip 172.17.0.100 centos
docker: Error response from daemon: invalid config for network default: invalid endpoint settings:
user specified IP address is supported on user defined networks only.
See 'docker run --help'.
[root@hmm ~]# //第二种情况,失败是因为用户自定义网络没有配置子网
[root@hmm ~]# docker run -tid --network yun3-nat --ip 10.10.0.15 centos
docker: Error response from daemon: invalid config for network yun3-nat: invalid endpoint settings:
user specified IP address is supported only when connecting to networks with user configured subnets.
See 'docker run --help'.
[root@hmm ~]# 

  1. 成功:
[root@hmm ~]# docker network create --driver bridge --subnet 10.10.0.0/24 --gateway 10.10.0.254 yun3-net
dd334c241b059cd0298a7bc505b0d2d8262571264c770ed7fb5486267db6e019
[root@hmm ~]# docker inspect yun3-net
[
    {
        "Name": "yun3-net",
        "Id": "dd334c241b059cd0298a7bc505b0d2d8262571264c770ed7fb5486267db6e019",
        "Created": "2024-04-09T19:58:27.850763463+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.10.0.0/24",
                    "Gateway": "10.10.0.254"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@hmm ~]# docker run -tid --network yun3-net --ip 10.10.0.15 --name ip-test centos
59bdaaff9ac1788aa92136717de1de15639e68d169ef525cb2b3395977685750
[root@hmm ~]# 

四.设置容器的网络接口mac地址
1.介绍
默认情况,容器mac地址是基于ip地址生成的。
可以通过--mac-address选项为容器指定一个ip地址
2.实例
与自己mac地址一致:

[root@hmm-docker ~]# docker run -tid --name mac-test01 --mac-address 00:0c:29:3d:66:01 centos
3dca5251e90114fc426eb8c17418dbc9552135d2cf00203731b8b514a05a0714
[root@hqs-docker ~]# docker inspect mac-test01 --format="{{json .NetworkSettings.MacAddress}}"
"00:0c:29:3d:66:01"
[root@hmm-docker ~]#

修改mac地址尾数

[root@hmm-docker ~]# docker run -tid --name mac-test02 --mac-address 00:0c:29:3d:66:02 centos
8b108d18769164ce566f0166b21ea83467ebcbde2de9086725037127d78f33f3
[root@hmm-docker ~]# docker inspect mac-test02 --format="{{json .NetworkSettings.MacAddress}}"
"00:0c:29:3d:66:02"
[root@hmm-docker ~]#

五.设置容器的dns和主机名
1.介绍
容器默认继承docker守护进程的dns配置(包括/etc/hosts和/etc/resolv.conf文件),也可以用选项进行覆盖默认配置。
2.实例

  • --dns(为了容器设置)
[root@hmm-docker ~]# docker run -tid --name dns-test --dns 202.103.24.68 centos
86b5e75098680c3804f6463ddc282c3c08d1ea72d122997240d7967496e234fd
[root@hmm-docker ~]# docker exec -ti dns-test /bin/bash
[root@86b5e7509868 /]# cat /etc/resolv.conf 
nameserver 202.103.24.68
[root@86b5e7509868 /]# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=127 time=23.10 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=127 time=24.5 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 23.959/24.216/24.473/0.257 ms
[root@86b5e7509868 /]#
  • --dns-search
  • --dns-option
[root@hmm-docker ~]# docker run -tid --dns-option ma,e:hmm --name dns-opt-test2 centos
5ad01898f38cb072cdc08df2aaed226adfbdff589932add0c3503b3894d7575d
[root@hmm-docker ~]# docker exec -ti dns-opt-test2 /bin/sh
sh-4.4# cat /etc/resolv.conf 
nameserver 114.114.114.114
options ma,e:hmm
sh-4.4#
  • --hostname
[root@hmm-docker ~]# docker run -tid --name host-test --hostname 2022-yun3 centos
143f8bcdc91d160ffd71bbfddbae6e472be996a889563d3f7b118cca85fb7401
[root@hmm-docker ~]# docker inspect host-test --format "{{json .Config.Hostname}}"
"2022-yun3"
[root@hmm-docker ~]# docker exec -ti host-test /bin/bash
[root@2022-yun3 /]# cat /etc/hosts 
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.7	2022-yun3
[root@2022-yun3 /]#

网络管理

docker网络管理用法

  • docker network connect
  • docker network create
  • docker network disconnect

image

posted on   代码你敲我不敲  阅读(290)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)

导航

统计

返回顶端
点击右上角即可分享
微信分享提示