[Docker 5] Docker 网络
第 5 章 Docker 网络
docker network ls
查看 host 上的网络,Docker 安装时会自动创建 bridge、host、null 三个网络。
[root@i ~]# docker network ls
NETWORK ID NAME DRIVER
2df86fa81fa0 bridge bridge
80286d6ed4fb host host
f72c16f0775d none null
5.1 none 网络
none 网络,封闭的隔离网络,安全性要求高且不需要联网的应用可以使用。比如某个容器唯一用途是生成随机密码,可以放到 none 网络中避免密码被窃取。
# 容器创建时,通过 --network=none 指定使用none网络
docker run -it --network=none <container>
5.2 host 网络
连接到 host 网络的容器共享 Docker host 的网络栈。传输效率性能高,但容易产生端口冲突。
# 容器创建时,通过 --network=host 指定使用host网络
docker run -it --network=host <container>
5.3 bridge 网络
Docker 安装时会创建一个命名为 docker()
的 Linux bridge。如果不指定 --network
,创建的容器默认都会挂到 docker()
上。
[root@i ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024219110166 no
示例:查看新建容器的网络配置
# 创建一个 httpd 容器
docker run -d httpd
# 进入容器
docker exec -it "短ID" bash
# 查看容器的网络配置
ip a
# 发现容器有一个网卡 ech0,网卡 eth0 和 docker() 的 interfaces 是一对 veth pair。veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头 eth0 在容器中, 另一头 veth 在网桥 docker() 上。
# 查看 bridge 网络的配置
docker network inspect bridge
5.4 user-defined 网络
# 通过 bridge 驱动创建类似默认的 bridge 网络
docker network create --driver bridge my_net
# 出现一个 "长ID"
# 查看 host 的网络结构变化
brctl show
# 新增了一个网桥 br-xxx,和 my_net 的 "短ID"
# 查看 my_net 配置信息
docker network inspect my_net
# 创建网段时指定 --subnet 和 --gateway 以指定IP网段 子网和网关
docker network create --driver bridge --subnet xxx.xxx.xx.0/24 --gateway xxx.xxx.xx.xxx my_net2
# 查看 my_net2 配置信息
docker network inspect my_net2
# --network 为容器指定新网络
docker run -it --network=my_net2 <容器名>
# --ip 为容器指定静态IP
docker run -it --network=my_net2 --ip xxx.xxx.xxx.xxx <容器名>
`注意:只有使用 --subnet 创建的网络才能指定静态 IP。否则会报错。`
- 同一网络中的容器、网关之间可以通信:挂在同一网络的不同容器可以通信
- 不同网桥的网络不同通信
- 使用同一网卡的容器可以通信
示例:容器使用同一网卡通信
# 第1个容器添加 my_net2 网卡
docker network connect my_net2 < 容器1的 "短ID" >
# 第2个容器添加 my_net2 网卡
docker network connect my_net2 < 容器2的 "短ID" >
# ping
ping -c 3 xxx.xxx.xxx.xxx
5.5 容器间通信
1. 同一网卡通信
见上示例:容器使用同一网卡通信。
2. Docker DNS Server
- 启动时使用
--name
为容器命名,就可以使用 DNS Server 通过 ”容器名“ 通信。 - 只能在 user-defined 网络中使用,默认的 bridge 网络无法使用。
# 第1个容器
docker run -it --network=my_net2 --name=bbox1 <容器名>
# 第2个容器
docker run -it --network=my_net2 --name=bbox2 <容器名>
3. joined 容器
joined 容器非常特别,它可以使多个容器共享一个网络栈,共享网卡和配置信息,可以通过 127.0.0.1 直接通信。比较适合:
- 不同容器中的程序希望通过本地回环 loopback 高效快速地通信,比如 Web Server 与 App Server。
- 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。
# 创建一个httpd容器,名为web1
docker run -d -it --name=web1 httpd
# 创建 busybox 容器并通过 --network=container:web1 指定 joined 容器为 web1
docer run -it --network=container:web1 busybox
# 分别查看 httpd 和 busybox 容器的网络配置信息
docker exec -it web1 bash
ip a
docker exec -it <busybox的"短ID">
ip a
`会发现 busybox 和 web1(httpd) 的网卡 MAC 地址和 IP 完全一样!它们共享了相同的网络栈。`
# busybox 通过 127.0.0.1 访问 web1 的 http服务
# docker exec -it <busybox的"短ID">
wget 127.0.0.1
cat index.html
5.6 将容器与外部世界连接
-
容器访问外部世界 —— NAT
-
外部世界访问容器 —— 端口映射
声明:该篇博文,仅记录个人学习笔记,详细内容参考《每天5分钟玩转Docker容器技术.CloudMan》。如有侵权,请告知删除。