Docker网络模式详解,bridge、host、none
前言
Docker容器怎么联网的?bridge、host、none这些网络模式啥区别?本文一次讲清楚。
一、Docker网络模式
Docker有5种网络模式:
- bridge:默认模式,桥接网络
- host:主机网络,和宿主机共用
- none:无网络
- container:和另一个容器共用网络
- 自定义网络:自己建的网络
二、bridge模式(默认)
是什么
Docker默认的网络模式。每个容器有自己的虚拟网络,通过docker0网桥和宿主机通信。
特点
- 每个容器有自己的IP
- 容器之间可以通过容器名互相访问
- 外部要访问容器,要靠
-p端口映射
用法
docker run -d --name nginx -p 80:80 nginx
没指定 --network,默认就是bridge。
容器之间通信
docker run -d --name mysql mysql:5.7
docker run -d --name web --link mysql nginx
或者用自定义网络,容器名直接解析:
docker network create mynet
docker run -d --name mysql --network mynet mysql:5.7
docker run -d --name web --network mynet nginx
web容器里直接用 mysql 这个主机名就能连数据库。
三、host模式
是什么
容器直接用宿主机的网络,没有自己的虚拟网卡。
特点
- 没有独立IP,和宿主机共用
- 不用
-p映射,直接用宿主机的端口 - 性能最好,因为少了一层网络转发
- 安全性差点,容器直接暴露在宿主机网络上
用法
docker run -d --name nginx --network host nginx
注意
host模式下,-p 参数无效。容器用什么端口,直接就是宿主机的端口。
比如Nginx监听80,宿主机的80就被占了。
四、none模式
是什么
容器没有网络,完全断网。
特点
- 没有网卡,没有IP
- 只能通过localhost访问
- 适合不需要联网的任务,比如批量处理文件
用法
docker run -d --name test --network none nginx
查看
docker exec test ip addr
只能看到lo回环网卡。
五、container模式
是什么
新创建的容器和一个已有的容器共用网络。
特点
- 两个容器共用同一个网络命名空间
- 用
127.0.0.1就能互相访问 - 适合一个应用拆成多个容器的场景
用法
# 先跑一个web容器
docker run -d --name web nginx
# 再跑一个sidecar容器,和web共用网络
docker run -d --name sidecar --network container:web busybox
sidecar容器里 127.0.0.1 就是web容器的localhost。
六、自定义网络
创建网络
docker network create mynet
使用网络
docker run -d --name mysql --network mynet mysql:5.7
docker run -d --name redis --network mynet redis
好处
- 容器名自动解析,不用写IP
- 网络隔离,不同网络的容器不能互相访问
- 更灵活
查看网络
docker network ls
查看网络详情
docker network inspect mynet
七、常用命令
查看容器网络模式
docker inspect -f '{{.HostConfig.NetworkMode}}' 容器名
查看容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名
查看所有网络
docker network ls
删除网络
docker network rm mynet
八、常见场景选什么模式
场景1:跑Web服务,要外网访问
选bridge,用 -p 映射端口。
场景2:追求高性能,比如数据库
选host,少一层转发,性能好。
场景3:不需要联网的任务
选none,安全。
场景4:两个容器紧耦合
选container,共用网络。
场景5:多容器编排
选自定义网络,容器名自动解析。
九、常见坑
坑1:容器之间ping不通
bridge模式下,容器之间默认是通的,但如果用了none就不通。
检查: 网络模式是什么?
docker inspect 容器名 | grep NetworkMode
坑2:host模式下端口冲突
host模式直接用宿主机端口,端口被占了就起不来。
检查: 宿主机端口有没有被占。
坑3:容器名解析不了
默认bridge网络不支持容器名解析。
解决: 用自定义网络。
坑4:改了网络模式,要重新建容器
网络模式是容器创建时定的,不能改。
解决: 删掉容器重新跑。
总结
记住:
- bridge:默认,端口映射,常用
- host:共用宿主机网络,性能好
- none:断网,安全
- container:和别的容器共用网络
- 自定义网络:容器名自动解析,推荐
最常用:
docker network create mynet
docker run -d --name nginx --network mynet nginx
遇到问题加QQ23979811 协助处理
Linux查看网卡信息,ip addr和ifconfig命令
前言
想知道服务器有几块网卡、IP 地址是多少、MAC 地址是多少?Linux 下有两个常用命令:ip addr 和 ifconfig。本文讲一下它们的用法和区别。
ip addr 命令(推荐)
现在新的 Linux 系统都推荐用 ip 命令,功能比 ifconfig 更强大。
查看所有网卡信息
ip addr
或者简写:
ip a
输出类似:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
输出解释
| 字段 | 含义 |
|---|---|
lo |
本地回环网卡 |
eth0 |
物理网卡名称 |
state UP |
网卡状态是开启的 |
link/ether |
MAC 地址 |
inet |
IP 地址 |
/24 |
子网掩码(255.255.255.0) |
只看 IP 地址
不想看那么多信息,只看 IP:
ip addr show eth0 | grep inet
或者更简洁:
ip a s eth0
只看 IPv4 地址
ip -4 addr
查看网卡统计信息
ip -s link
能看到收发包、丢包等统计信息。
ifconfig 命令(老命令)
ifconfig 是老命令,来自 net-tools 包,现在慢慢被淘汰了,但很多老用户还是习惯用。
安装
CentOS 最小化安装可能没有:
yum install -y net-tools
查看所有网卡
ifconfig
输出类似:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:16:3e:12:34:56 txqueuelen 1000 (Ethernet)
RX packets 12345 bytes 1234567 (1.2 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6789 bytes 987654 (987.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0
只看某个网卡
ifconfig eth0
查看 lo 网卡
ifconfig 默认不显示 lo(回环网卡),要看的话加 -a:
ifconfig -a
ip 和 ifconfig 的区别
| 对比项 | ip addr | ifconfig |
|---|---|---|
| 新老 | 新命令,推荐 | 老命令,逐步淘汰 |
| 包 | iproute2 包(默认装) | net-tools 包(要单独装) |
| 功能 | 更强大 | 基本够用 |
| 输出 | 信息更全 | 简洁 |
其他常用命令
查看路由表
ip route
或者老命令:
route -n
查看 DNS 配置
cat /etc/resolv.conf
查看网卡连接状态
cat /sys/class/net/eth0/carrier
输出 1 表示网线插着,0 表示没插。
查看网卡速率
ethtool eth0 | grep Speed
常见坑
坑1:ifconfig 命令找不到
执行 ifconfig 提示 command not found。
原因: CentOS7 最小化安装不带 net-tools 包。
解决:
yum install -y net-tools
或者直接用 ip addr,不用装包。
坑2:网卡名不是 eth0
新系统网卡名可能是 ens33、ens33、enp0s3 之类的。
原因: CentOS7 用了新的网卡命名规则。
解决: 先 ip addr 看一下实际网卡名是什么,然后替换。
坑3:IP 地址不对
看到的 IP 地址和你预期的不一样。
原因: 可能有多个网卡,或者是云服务器的内网 IP,不是公网 IP。
解决: 先 ip addr 看所有网卡,确认哪个是你要的。
坑4:网卡 down 了
网卡状态是 DOWN,连不上网。
解决: 手动开启:
ip link set eth0 up
或者:
ifconfig eth0 up
总结
| 命令 | 作用 |
|---|---|
ip addr |
查看所有网卡信息(推荐) |
ip a |
简写 |
ip a s eth0 |
只看 eth0 网卡 |
ifconfig |
老命令查看网卡 |
ifconfig eth0 |
只看 eth0 |
ip route |
查看路由表 |
现在都推荐用 ip addr,功能更全,还不用额外装包。
遇到问题加QQ23979811 协助处理
CentOS7重启网络报错,network与NetworkManager冲突处理
前言
CentOS7 里有两套网络管理工具:传统的 network 服务和新的 NetworkManager。两个同时用就会打架,重启网络的时候报错,甚至把网络搞断。本文就讲一下这个冲突怎么解决。
报错现象
执行 systemctl restart network 或者 service network restart 的时候,报类似这样的错:
Restarting network (via systemctl): Job for network.service failed. See 'systemctl status network.service' and 'journalctl -xn' for details.
或者:
RTNETLINK answers: File exists
原因
CentOS7 默认装了 NetworkManager(简称 NM),它也在管理网络接口。传统的 network 服务也在管。两个同时管同一个网卡,配置就会冲突。
解决方法
方法一:关掉 NetworkManager(推荐服务器用)
服务器一般不需要图形界面的网络管理工具,直接关掉:
systemctl stop NetworkManager
systemctl disable NetworkManager
然后重启 network:
systemctl restart network
方法二:让 network 忽略 NetworkManager
编辑网络配置文件:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
在文件里加一行:
NM_CONTROLLED=no
意思是这个网卡不归 NetworkManager 管,只由 network 服务管理。
然后重启网络:
systemctl restart network
方法三:全部交给 NetworkManager 管
如果你想用 NM 管理,那就把传统 network 关掉:
systemctl stop network
systemctl disable network
然后用 NM 的命令管理网络:
nmcli connection show
nmcli connection up eth0
验证
重启网络之后,看看网卡 IP 还在不在:
ip addr
如果 IP 还在,能 ping 通外网,就说明搞定了。
常见坑
坑1:改了配置把自己踢下线
远程 SSH 连上去改网络配置,改完重启网络,结果 SSH 断了,再也连不上。
解决:
- 改配置之前先开个备用 SSH 连接,别关
- 或者直接用云服务器控制台的 VNC 操作
- 不要在生产环境随便重启网络
坑2:重启服务器后网络又坏了
临时重启 network 好了,但重启服务器后又不行了。
原因: NetworkManager 又自动启动了,和 network 冲突。
解决: 把 NetworkManager 禁用掉:
systemctl disable NetworkManager
坑3:网卡名不是 eth0
新一点的系统网卡名可能是 ens33、enp0s3 这种。
解决: 先看一下网卡叫什么:
ip addr
然后改对应的配置文件,比如 ifcfg-ens33。
总结
CentOS7 网络冲突的解决思路很简单:
| 方案 | 操作 | 适用场景 |
|---|---|---|
| 关 NM | systemctl disable NetworkManager |
服务器,推荐 |
| NM_CONTROLLED=no | 网卡配置里加这行 | 只用 network 服务 |
| 全用 NM | 关掉 network,用 nmcli | 桌面环境 |
服务器上推荐直接关掉 NetworkManager,用传统的 network 服务管理网络,简单稳定。
遇到问题加QQ23979811 协助处理