容器学习Day13-Docker容器网络

前言

      网络是虚拟化技术中最复杂的部分,也是 Docker 应用中的一个重要环节,Docker 中的网络主要解决容器与容器、容器与外部网络、外部网络与容器之间的相互通信问题。


一、Docker 容器网络基本原理

      Docker 的网络很好地利用了 Linux 虚拟网络技术,在宿主机的物理网卡和容器内分别创建一个虚拟接口(veth),并让它们通过宿主机的 docker0 网桥进行连接,这样的一对 veth 叫做 veth pair。

二、Docker 网络驱动

      Docker 拥有多种网络驱动程序,以提供核心网络功能。

  • bridge

      默认网络驱动程序,如未指定驱动程序,使用此网络类型。主要用于同一宿主机上不同容器之间的通信。

  • host

      对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用宿主机的网络。

  • none

      容器禁用所有网络,不能与外部通信。none 网络没有办法联网,封闭的网络能很好的保证容器的安全性。

  • overlay

      overlay 网络将多个 Docker 守护进程连接在一起,并使 swarm 服务能够相互通信。还可以使用 overlay网络促进 swarm 服务和独立容器之间的通信,或者在不同 Docker 守护进程上的两个独立容器之间的通信,实现跨主机通信。

  • macvlan

      macvlan 允许将 MAC 地址分配给容器,使其显示为网络上的物理设备。Docker 守护进程通过容器的 MAC 地址将流量路由到容器。有时使用 macvlan 驱动程序是最佳选择,比如在处理遗留应用程序时,希望直接连接到物理网络而不是通过 Docker 主机的网络堆栈路由。

  • Network plugins

      可以在 Docker 中安装第三方网络插件,这些插件可以从 Docker Hub 或第三方获得。

三、Docker 网络管理命令

        使用 docker network --help 命令,可以查看 docker 网络相关的命令。

root@docker:~# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect 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.
  • docker network ls  查看已建立的网络对象。

    常用命令参数:-f,过滤条件,如"driver=bridge"。

                             -q,只回显网络对象的ID。

        安装好 Docker 后,默认会自动创建三个网络,可以使用命令查看。

###查看默认网络。
root@docker:~# docker  network ls
NETWORK ID     NAME      DRIVER    SCOPE
dc322c5dd3bc   bridge    bridge    local
b1e9477f6959   host      host      local
1fbd8be30335   none      null      local

###查看桥接网络。
root@docker:~# docker network ls -f "driver=bridge"
NETWORK ID     NAME      DRIVER    SCOPE
dc322c5dd3bc   bridge    bridge    local

###查看桥接网络的ID。
root@docker:~# docker network ls -qf "driver=bridge"
dc322c5dd3bc
  •  docker network inspect  查看网络详细信息。 
###查看默认bridge网络详细信息。
root@docker:/docker# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "d91e497829267345e0d5ad9cd85f51e5ce25d736455cee57db62d3b0d8ea73c1",
        "Created": "2023-02-22T16:04:44.832948002Z",
        "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": {},
        "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": {}
    }
]
  • docker network create  创建新网络对象。

    常用命令参数:-d,指定网络驱动(默认是"bridge")。

                             --subnet,指定子网网段。

                             --ip-range,指定容器的IP范围。

                             --gateway,指定子网网关。

###创建一个桥接网络,指定子网、IP范围和网关。
root@docker:/docker# docker network create --driver=bridge --subnet=192.168.0.0/16 --ip-range=192.168.100.0/24 --gateway=192.168.100.254 mybridge
e6fd1c4250936fb20cb3726c07fe0fbcddd762fb3839526e13fa25bcacac98d2

###查看创建的网络。
root@docker:/docker# docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
d91e49782926   bridge     bridge    local
b1e9477f6959   host       host      local
e6fd1c425093   mybridge   bridge    local
1fbd8be30335   none       null      local
  • docker run --network 运行容器时指定网络。
###使用创建的mybridge网络运行一个httpd容器。
root@docker:/docker# docker run -d --name httpd -p 80:80 --net mybridge httpd
22fcd650fef5ab06f62cb78335234cb6333b0f0ff9026af73441e2130cfda1a4

root@docker:/docker# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS                               NAMES
22fcd650fef5   httpd     "httpd-foreground"   4 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   httpd

###查看容器ip地址。
root@docker:/docker# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' httpd
192.168.100.0

###使用容器地址访问服务测试。
root@docker:/docker# curl http://192.168.100.0
<html><body><h1>It works!</h1></body></html>
  •  docker network rm  删除网络,需要先将使用该网络创建的容器停止并删除。
###直接删除网络,有报错。
root@docker:/docker# docker network rm mybridge
Error response from daemon: error while removing network: network mybridge id 0c21cd98605cd4e36e59b3af6cd5390c2c05f42cfa2668eaefb383ad0026db8b has active endpoints

###停止并删除使用该网络创建的容器。
root@docker:/docker# docker stop httpd
httpd
root@docker:/docker# docker rm httpd
httpd

###再次删除网络,成功。
root@docker:/docker# docker network rm mybridge
mybridge

root@docker:/docker# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
d91e49782926   bridge    bridge    local
b1e9477f6959   host      host      local
1fbd8be30335   none      null      local


总结

 以上就是今天学习了解的内容。


版权声明:本文为AtobeKegio原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。