前言

docker在使用的过程中,总是有很多被忽略的小细节,这种在很多容器提供的命令中并不会写明,或者提供方法,这次就把docker网络中的一些操作写出来:

  1. docker运行容器的时候,并不会关注使用哪个容器网络,其实在启动新的容器的时候,总是会创建一个新的network,命令一看,已经创建了一堆网络了,不过他的创建逻辑我也没去研究,有的时候会使用已有的网络;
  2. 使用一些并不开源的容器的时候,总是会担心其安全性,虽然很多是内网环境,并不会被公网访问,但是容器是能上网的,这个就有操作空间了,家用的时候也不可能经常去检查容器行为,当然可以在路径部署一个监控节点,但直接禁用容器上网,来的更方便省事。

问题解决

容器网络的选择和自定义

常用的命令格式:

  1. 命令格式:
1
2
3
4
5
6
7
8
9
docker run -d \
--name nginx-web \#网络名称
--network my-app-network \#容器接入的网络
--ip 172.25.0.10 \#指定容器 IP
--network-alias web-server \#网络内别名(类似域名)
--hostname nginx-01 \#容器主机名
--dns 8.8.8.8 \#设置容器 DNS 服务器
-p 8080:80 \#端口映射(宿主机:容器)
nginx:alpine
  1. dockercompose格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: '3.8'  # 指定Compose文件版本(推荐3.8,兼容性好)

# 定义服务(对应docker run的容器配置)
services:
nginx-web: # 服务名(对应--name nginx-web,Compose启动后容器名会带项目前缀,可通过container_name覆盖)
container_name: nginx-web # 强制指定容器名,和docker run的--name完全一致
image: nginx:alpine # 对应镜像名
restart: unless-stopped # 可选:容器退出后自动重启(推荐添加)
networks:
my-app-network:
ipv4_address: 172.25.0.10 # 对应--ip 172.25.0.10
aliases:
- web-server # 对应--network-alias web-server
hostname: nginx-01 # 对应--hostname nginx-01
dns:
- 8.8.8.8 # 对应--dns 8.8.8.8(可添加多个,如- 114.114.114.114)
ports:
- "8080:80" # 对应-p 8080:80(格式:"宿主机端口:容器端口")
detach: true # 对应-d,Compose默认后台运行,此参数可省略


# 定义自定义网络(对应--network my-app-network)
networks:
my-app-network:
# 若该网络已通过docker network create创建,可加external: true避免重复创建
# external: true
driver: bridge
ipam:
config:
- subnet: 172.25.0.0/16 # 必须包含--ip指定的172.25.0.10,否则无法固定IP
gateway: 172.25.0.1
命令详细信息表格(点击展开)
  1. 创建网络(docker network create)常用参数
参数 核心作用 实用示例 补充说明
--name 指定网络名称(必选) --name my-app-network 名称需唯一,避免与现有网络冲突
--driver / -d 指定网络驱动类型 --driver bridge 常用:bridge(默认)、overlay(集群)、macvlan(物理网卡绑定)
--subnet 指定子网网段(CIDR格式) --subnet 172.25.0.0/16 自定义IP段,避免与宿主机/其他网络冲突
--gateway 指定网络网关地址 --gateway 172.25.0.1 需在 --subnet 网段内,是容器访问外网的出口
--ip-range 指定IP分配范围 --ip-range 172.25.0.0/24 限制容器从该网段分配IP,缩小分配范围
--opt / -o 自定义网络选项 --opt com.docker.n
etwork.bridge.n
ame=mybr0
常用选项:
- mtu=1500(修改MTU值)
- com.docker.n
etwork.bridg
e.enable_ip_masquer
ade=true(开启IP伪装)
--attachable 允许非Compose容器接入overlay网络 --attachable 仅适用于Swarm集群的overlay网络
  1. Docker 核心网络驱动类型(按使用频率排序)
驱动类型 核心用途 通信范围 核心特点 典型场景 性能 隔离性
bridge 单机容器互通 仅宿主机内的容器 Docker 默认驱动,创建隔离桥接网络,容器通过NAT访问外网;不同bridge网络默认不互通 单机部署的多容器应用(Web + 数据库) 一般(NAT开销)
host 容器共享宿主机网络 与宿主机共享网络命名空间 无独立IP/端口,直接使用宿主机网络;无网络隔离 对网络性能要求极高的场景(高性能服务) 最高(无开销)
none 禁用容器网络 无网络(仅回环地址) 仅保留lo回环接口,无外网/内网通信能力 无需网络的离线任务(数据处理容器) -
overlay 跨主机容器互通 Swarm集群内的所有节点 基于VXLAN封装,实现集群内多主机容器互通;需先初始化Swarm Docker Swarm集群部署(跨主机服务通信) 一般(VXLAN封装)
macvlan 容器接入物理网络 与宿主机同物理网络(二层) 给容器分配物理网卡级别的MAC地址,容器像独立物理机 需要容器拥有物理网络IP的场景(网络设备模拟) 高(二层转发)
ipvlan 轻量级物理网络接入 与宿主机同物理网络 比macvlan更轻量,多容器共享同一MAC地址,仅IP不同 大规模容器需独立IP但无需独立MAC的场景
remote 第三方网络插件 由插件定义 对接第三方网络解决方案(Calico、Flannel) K8s集成/复杂网络策略场景 依插件而定 依插件而定

容器禁用上网

1
2
3
4
5
6
7
8
9
10
11
12
version: '3'
services:
app:
image: nginx:alpine
networks:
- private
networks:
private:
name: network
driver: bridge
driver_opts:
com.docker.network.bridge.enable_ip_masquerade: 'false' # 重要的就是这一行