一、Docker 网络模式
Docker 容器的网络有五种模式:
模式名称 | 功能 | 是否支持多主机 | 南北向通信机制 | 东西向通信机制 |
---|---|---|---|---|
bridge | 默认设置,为容器创建独立的网络命名空间,容器具有独立的网卡等所有单独的网络栈。如果在容器运行时不加 --net 参数,就默认采用这种网络模式。 | 否 | 宿主机端口绑定 | 通过Linux bridge |
host | 没有独立的网络环境,直接使用宿主机的 ip 和端口。 | 是 | 按宿主机网络通信 | 按宿主机网络通信 |
none | 为容器创建独立网络命名空间,但不为它做任何网络配置,容器中只有lo,用户可以在此基础上,对容器网络做任意定制。 | 否 | 无法通信 | 通过link通信 |
container | 指定一个容器与其共享 IP 和端口 | 否 | 宿主机端口绑定 | 通过link通信 |
自定义 | Docker 1.9版本以后新增的特性,允许容器使用第三方的网络实现或者创建单独的bridge 网络,提供网络隔离能力。 | 按网络实现而定 | 按网络实现而定 | 按网络实现而定 |
注:南北向通信指容器与宿主机外界的访问机制,东西向通信机制指同一宿主机上,与其他容器相互访问的机制。
二、自定义网络模式
在自定义网络模式下,用户可以创建一个新的 Bridge 、Overlay 或 Macvlan 网络。与 Bridge 不同 Overlay 和 Macvlan 网络主要用于创建跨主机访问。
2.1 Bridge 网络
Bridge
网络是 Docker
中最常用的网络类型,创建一个 Bridge
网络的语法如下:
docker network create --driver bridge --subnet 网络ip段 --gateway 网关IP --ip 指定静态IP 网络段名称
注:
--driver bridge
是默认项,可以不显示写出来--ip
必须配合--subnet
参数一起使用
2.2 Overlay 网络
overlay 网络驱动程序在多个 Docker 守护进程主机之间创建一个分布式网络。这个网络在允许容器连接并进行安全通信的主机专用网络之上(overlay 覆盖在上面)。Docker 透明地处理每个 Docker 守护进程与目标容器之间的数据包的路由。
当初始化 swarm 集群(注1)或将一个 Docker 主机加入已经存在的 swarm 集群时,Docker 主机上会创建两个新网络:
- 一个称为
ingress
的 overlay 网络
用来处理与 swarm 服务相关的控制和数据流。当创建的 swarm 服务没有连接到用户自定义的 overlay 网络时,这个服务会默认连接到 ingress 网络。
一个称为
docker_gwbridge
的bridge 网络用来将单个的 Docker 守护进程连接到 swarm 中的其他守护进程。
可以使用 docker network create
命令创建用户定义的 overlay
网络,就像可以创建用户定义的 bridge 网络一样。服务或容器一次可以连接到多个网络。服务或容器只能通过它们各自连接的网络进行通信。在创建 overlay
网络前,宿主机需要满足如下先决条件:
宿主机防火墙指定端口开放
- TCP 端口 2377:用于集群管理通信 - TCP 和 UDP 端口 7946:用于节点之间通信 - UDP 端口 4789:overlay 网络流量
将宿主机加入到 swarm 集群
# 将容器初始化为 swarm 集群 docker swarm init 或 # 将其加入到一个已存在的热情 docker swarm join
创建 Overlay
网络:
docker network create -d overlay 网络名
要创建可以用于 swarm 服务和独立容器跟其他 Docker 守护进程中运行的独立容器通信的 overlay 网络,添加 --attachable
标志:
docker network create -d --attachable overlay 网络名
其他选项可以查看 docker network create --help
命令。
注1:Docker Swarm
是 Docker
自己的容器本地集群解决方案。
三、使用指定网络模式创建容器
使用默认 bridge
模式 , --net bridge
可以不用写
docker run -di --name=myNginx -p 80:80 nginx
使用 host
模式
docker run -di --name=myNginx --net host -p 80:80 nginx
使用 none
模式
docker run -di --name=myNginx --net none -p 80:80 nginx
使用 container
模式
docker run -di --name=myNginx --net container:指定容器名 -p 80:80 nginx
使用自定义模式
1.创建自定义网段
docker network create --subnet=192.168.0.0/16 mynetwork
2.自定义网络模式创建容器
docker run -di --name=myNginx --net mynetwork -p 80:80 nginx