title: Docker系列之七:Docker网络
categories: Docker
tags:
- Docker
timezone: Asia/Shanghai
date: 2019-02-25
(一).Docker默认的三种网络模式
Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络
Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看:
[root@centos181001 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1d9172a1d121 bridge bridge local
7ff3f15e910e host host local
24e978b44934 none null local
1.none 网络
- 故名思议,none 网络就是什么都没有的网络。
- 挂在这个网络下的容器除了 lo,没有其他任何网卡。
- 容器创建时,可以通过
--network=none
指定使用 none 网络。 - 一些对安全性要求高并且不需要联网的应用可以使用 none 网络。
2.host 网络
- 连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。
- 可以通过
--network=host
指定使用 host 网络。 - 直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。
- 当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。
- Docker host 的另一个用途是让容器可以直接配置 host 网路。
- 比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置
3.bridge网络
- Docker 安装时会创建一个 命名为 docker0 的 linux bridge。
- 如果不指定--network,创建的容器默认都会挂到 docker0 上。
- 可以通过
docker network inspect bridge
命令查看bridge 网络的配置信息:
(二).手动创建user-defined
网络
Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan。
docker network create --driver bridge new-bridge
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 new-bridge
docker network inspect new-bridge
(二).容器之间的连通性
1.两个容器都使用默认的bridge网络,直接可以使用IP地址PING通
## 1.启动两个容器
docker run -it --name centos1 centos
docker run -it --name centos2 centos
## 2.查看连个容器分别分配的IP地址是多少
docker network inspect bridge
## 3.两个容器之间使用IP互PING是可以通的
2.两个容器使用不同的bridge网络,
## 1.创建两个bridge网络
docker network create --driver bridge new-bridge1
docker network create --driver bridge new-bridge2
## 2.运行两个容器,分别指定两个不同的bridge网络
docker run -it --rm --network new-bridge1 --name centos1 centos
docker run -it --rm --network new-bridge2 --name centos2 centos
## 3.分别查看两个容器的IP地址,经过测试两个IP地址之间是不能互通的
centos1 172.19.0.2
centos2 172.20.0.2
## 4.为CentOS1主机添加new-bridge2网卡实现两个主机间互通
## 4.为CentOS2主机添加new-bridge1网卡实现两个主机间互通
docker network connect new-bridge2 centos1
docker network connect new-bridge1 centos2
(三).容器间通信的三种方式
1.IP 通信:
两个容器必须要有属于同一个网络的网卡就可以使用IP互相连接
2.Docker DNS Server:
通过 IP 访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定 IP,部署之后再指定要访问的 IP 会比较麻烦。对于这个问题,可以通过 docker 自带的 DNS 服务解决。
- 使用 docker DNS 需要满足的3个条件:
- 1.只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的。
- 2.两个容器必须在同一个网络中
- 3.必须通过
--name
指定容器名字
## 示例:
## 1.创建一个user-defined 网络
docker network create --driver bridge new-bridge
## 2.启动两个容器
docker run -it --rm --network new-bridge --name centos1 centos
docker run -it --rm --network new-bridge --name centos2 centos
## 3.查看两个容器IP地址
docker network inspect new-bridge
centos1 172.21.0.2
centos2 172.21.0.3
## 4.测试互通性(以下都是可以PING通的)
## 在centos1容器内执行:
ping centos2
ping 172.21.0.3
## 在centos2容器内执行:
ping centos1
ping 172.21.0.2
3.joined容器
joined 容器是另一种实现容器间通信的方式。
joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。
示例:
## 1.先创建一个容器
docker run -it --rm --name centos1 centos
## 2.创建第二个容器,并指定 jointed 容器为centos1
docker run -it --rm --name centos2 --network container:centos1 centos
## 3.登录两个容器分别查看网络信息
yum install -y net-tools
ifconfig
发现两个容器的网卡MAC地址和IP地址完全一样,它们共享了相同的网络栈。他们之间可以直接用127.0.0.1访问互相的服务。
joined 容器非常适合以下场景:
- 不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server 与 app server。
- 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。
附录:docker网络相关命令详解
docker network
[root@centos181001 ~]# 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 connect - 将一个容器连接到某网络
[root@centos181001 ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
将一个容器连接到某网络
Options:
--alias strings Add network-scoped alias for the container
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
添加链接到另一个容器
--link-local-ip strings Add a link-local address for the container
为容器添加链接本地地址
示例:将centos1容器连接到手动建立的new-bridge2网络
docker network connect new-bridge2 centos1
docker network create - 创建一个网络
[root@centos181001 ~]# docker network create --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 copying the configuration
从目前已经存在的某个网络复制配置
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge")
管理网络的驱动程序(默认“桥”)
接受以下3个参数:bridge、macvlan、 overlay
--gateway strings IPv4 or IPv6 Gateway for the master subnet
主子网的IPv4或IPv6网关,格式:192.168.0.1
--ingress Create swarm routing-mesh network
创建swarm routing-mesh网络
--internal Restrict external access to the network
限制对网络的外部访问
--ip-range strings Allocate container ip from a sub-range
设置子网IP分配区间
--ipam-driver string IP Address Management Driver (default "default")
IP地址管理驱动程序(默认为“默认”)
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
允许IPV6网络
--label list Set metadata on a network
为网络设置标签
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
网络范围,支持:local swarm
--subnet strings Subnet in CIDR format that represents a network segment
指定子网,格式:192.168.0.1/24
## 示例:创建一个桥接网络,网络名称为:new-bridge1
docker network create --driver bridge new-bridge1
网友评论