获取不到虚拟IP

使用下面的命令时不能获取到虚拟IP

docker run -it --net vipnet --ip 172.18.0.2 vipimage /bin/bash

应该添加参数可以让容器有权限操作网络配置

docker run -it --net vipnet --ip 172.18.0.2 --cap-add=NET_ADMIN vipimage /bin/bash

或者

docker run -it --net vipnet --ip 172.18.0.2 --privileged vipimage /bin/bash

privileged小知识

在 Docker 中使用 --privileged 标志会给容器提供类似于宿主机 root 用户的权限。当容器以 --privileged 模式运行时,它可以绕过 Linux 内核的许多安全限制,从而获得较广泛的操作权限。这通常用于需要执行一些高级系统管理操作的场景,例如直接访问硬件设备或进行某些需要特殊权限的网络操作。

--privileged 模式的主要影响包括:

  1. 全能力(Capabilities)

    • 容器将获得 Linux 所有的 capabilities,与在宿主机上运行的进程几乎相同。
  2. 设备访问

    • 容器可以访问和操作宿主机上的所有设备(/dev 下的设备)。
  3. 安全限制

    • 绕过了 AppArmor 或 SELinux 的限制,容器可以执行更多的系统级操作。
  4. 文件系统

    • 容器可以挂载宿主机上的文件系统,甚至使用一些通常需要更高权限的挂载选项。
  5. 网络操作

    • 允许执行一些通常受限的网络操作,如更改网络配置或使用低号端口。

使用场景

使用 --privileged 模式通常适用于以下场景:

  • 开发和测试

    • 当需要模拟或测试接近生产环境的设置时,可能需要更宽泛的权限。
  • 特定的应用需求

    • 某些应用,如 Docker 内部运行的 Docker(Docker-in-Docker)、某些类型的网络代理或监控工具,可能需要更高的权限来执行其核心功能。

安全考虑

尽管 --privileged 模式提供了极大的灵活性,但它也带来了显著的安全风险。该模式基本上允许容器执行任何操作,这可能包括对宿主机进行不安全的更改或攻击。因此,除非绝对必要,否则不建议在生产环境中使用 --privileged 模式。如果需要特定的 capabilities,建议使用 --cap-add 来精确控制容器的权限,这比使用 --privileged 更为安全。

cap add小知识

在 Docker 中,--cap-add 选项允许你向容器添加特定的 Linux 能力(capabilities)。这些能力是对传统的 root 权限的更细粒度控制,允许容器执行一些特定的高权限操作,而无需赋予容器完全的 root 权限。

以下是一些常见的 Linux 能力及其用途:

  1. CAP_NET_ADMIN

    • 允许进行各种网络相关的操作,如接口配置、修改路由表、端口绑定等。
  2. CAP_SYS_ADMIN

    • 这是一个非常强大的能力,几乎等同于 root。它允许执行多种系统级管理操作,如挂载文件系统、配置时钟等。
  3. CAP_NET_RAW

    • 允许使用原始套接字,这通常用于网络协议的开发,如自定义ICMP或其他低级网络协议。
  4. CAP_DAC_OVERRIDE

    • 允许绕过文件的读写和执行权限检查。
  5. CAP_SETUID

    • 允许改变进程的 UID(用户ID)。
  6. CAP_SETGID

    • 允许改变进程的 GID(组ID)。
  7. CAP_SYS_PTRACE

    • 允许使用 ptrace,这通常用于调试和监视其他进程。
  8. CAP_SYS_MODULE

    • 允许加载或卸载内核模块。
  9. CAP_SYS_CHROOT

    • 允许使用 chroot,改变根目录。
  10. CAP_SYS_TIME

    • 允许改变系统时钟。
  11. CAP_AUDIT_WRITE

    • 允许向内核安全子系统写入审计日志。
  12. CAP_MKNOD

    • 允许创建特殊文件,如设备节点。

这些能力可以单独或组合使用,以提供必要的权限,同时限制容器可以执行的操作,从而增强容器的安全性。在使用这些能力时,建议仅添加必要的最小集合,以避免潜在的安全风险。