Docker-07:Docker网络管理

1. 目录

Docker-07:Docker网络管理_第1张图片

  • 1. 目录
  • 2. 概念
    • 2.1. 默认网络
    • 2.2. Host
    • 2.3. None
    • 2.4. Bridge
    • 2.5. Container
  • 3. 环境准备
  • 4. 自定义网络
    • 4.1. 创建
      • 4.1.1. 创建网络
      • 4.1.2. 创建容器
      • 4.1.3. 自定义Ping
    • 4.2. 网络之间通信

2. 概念

Docker 本身有4种网络工作模式,和一些自定义网络模式,在安装 Docker 时,默认会自动创建 bridgenonehost

  • Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
  • None:该模式关闭了容器的网络功能。
  • host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  • Container模式:使用 --net=container:NAME_or_ID 指定。

2.1. 默认网络

Docker 时,它会自动创建上面的三个网络。如果需要指定某种网络,则用 --network 标志来指定。

2.2. Host

类似虚拟机 Vmware 中的桥接模式,即容器和宿主机在同一个网络中,但没有独立 IP 地址。这是因为 Docker 使用 LinuxNamespaces 技术来进行资源隔离,一个 Docker 容器一般会分配一个独立的 Network Namespace,但是因为使用的是 host 模式,此容器将不会获得一个独立的 Network Namespace ,而是和宿主机共用一个 Network Namespace。所以容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

2.3. None

该模式关闭了容器的网络功能,旨在说明容器并不需要网络。

2.4. Bridge

相当于 Vmware 中的 Nat 模式,容器使用独立 Network Namespace ,并连接到 docker0 虚拟网卡(默认模式)。通过 docker0 网桥以及 Iptables nat 表配置与宿主机通信。

2.5. Container

概念类似 host 模式, Container 模式指定新构建的容器和同已存在容器共享一个 Network Namespace ,而不是和宿主机共享IP、端口范围等。这样,两个容器除网络方面,其他的如文件系统、进程列表等还是隔离的。

3. 环境准备

我通过在 Windows 10 操作系统的虚拟机,安装的 CentOS 7.0CentOS 是最小安装版,安装后需要将服务器内核和补丁全部更新一遍。

CentOS 安装 Docker 后,可以查看 Docker 版本为 20.10.17 ,截止当前是 Docekr 社区版当中的最新版本。

  • Windows 10 Home 64bit
  • VMware Workstation Pro 16
  • CentOS 7.0
  • docker 20.10.17

4. 自定义网络

构建容器,默认使用 bridge 模式,构建命令中默认有 --net bridge ,创建网络避开 bridge 名字,因为这是 docker0 的名字。

docker network create 的基本命令如下:


Flag shorthand -h has been deprecated, please use --help

Usage:  docker network create [OPTIONS] NETWORK

Create a network

Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       Subnet in CIDR format that represents a network segment

4.1. 创建

4.1.1. 创建网络

基于 bridge 模式创建名称为 bridge_nww 的网络。


docker network create -d bridge bridge_nww

4.1.2. 创建容器

创建一个容器,使用上述所创建的网络。


docker run -d -it --name clone_new --network bridge_nww clone-boot

docker network inspect bridge_nww 查看下网络使用情况。


[
    {
        "Name": "bridge_nww",
        "Id": "90eb654cb702b85fc8af44ced8121f06f284dc16d57b45dbff66648885582729",
        "Created": "2022-08-27T22:42:19.07173123-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.22.0.0/16",
                    "Gateway": "172.22.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "a8d257e00caefe4624fba5effbd67ae90ee46dc95793e877313fbc7cef814dd5": {
                "Name": "clone_new",
                "EndpointID": "e7dc1dfb4d0ff05ed02619f2eabd2217665bdd9500e9d64eb13753b5f9f2ec8b",
                "MacAddress": "02:42:ac:16:00:02",
                "IPv4Address": "172.22.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

Containers 中有我们的构建的容器。

4.1.3. 自定义Ping

自己创建网络可以直接使用容器名来互 Ping ,比如我有一个 Redis 的集群,就可以搭一个网络。网络之间是互相隔离的,不同集群使用不同网络。


docker exec -it ${容器1} ping ${容器2}

4.2. 网络之间通信

先用默认 Bridge 模式创建两个容器 ct1ct2 ,新构建一个新的网络工作模式 bridge_ct, 再构建一个使用 bridge_ct 网络的 ct3

  • 默认模式

docker run -itd --name ct1 wentos:7.0 /bin/bash
docker run -itd --name ct2 wentos:7.0 /bin/bash

  • 自定义模式

docker network create -d bridge bridge_ct 
docker run -itd --name ct3 --network bridge_ct wentos:7.0 /bin/bash

  • 添加网络模式

docker network connect bridge_ct ct2

  • 查看网络IP

后面我们依次登录 ct1ct2ct3 ,使用 docker attach ct1 命令,罗列出来各他们的 ip 信息。

名称 ip 网络
ct1 172.17.0.3 bridge
ct2 172.17.0.5、172.23.0.3 bridge
ct3 172.23.0.2 bridge、 bridge_ct
  • 验证结果

    • 在容器 ct2ct1 可以互相 ping

Docker-07:Docker网络管理_第2张图片

  • 在容器 ct2ct3 可以互相 ping

Docker-07:Docker网络管理_第3张图片

  • 在容器 ct1ct3 可以是无法通信的

  • 结论:不同容器间需相互通信,须在同一个网络环境下;使用默认 bridge 网络管理的容器可以使用容器IP进行通信,但无法使用容器名称进行通信;而使用自定义网络管理的容器则可以使用容器IP进行通信

你可能感兴趣的:(容器化,云原生,docker,容器,运维)