[Docker 5] Docker 网络

13 篇文章 0 订阅
7 篇文章 0 订阅

第 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 将容器与外部世界连接

  1. 容器访问外部世界 —— NAT

  2. 外部世界访问容器 —— 端口映射

声明:该篇博文,仅记录个人学习笔记,详细内容参考《每天5分钟玩转Docker容器技术.CloudMan》。如有侵权,请告知删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值