前言

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
  2. 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网络 | 2. 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' # 重要的就是这一行