获取不到虚拟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
模式的主要影响包括:
全能力(Capabilities):
- 容器将获得 Linux 所有的 capabilities,与在宿主机上运行的进程几乎相同。
设备访问:
- 容器可以访问和操作宿主机上的所有设备(
/dev
下的设备)。
- 容器可以访问和操作宿主机上的所有设备(
安全限制:
- 绕过了 AppArmor 或 SELinux 的限制,容器可以执行更多的系统级操作。
文件系统:
- 容器可以挂载宿主机上的文件系统,甚至使用一些通常需要更高权限的挂载选项。
网络操作:
- 允许执行一些通常受限的网络操作,如更改网络配置或使用低号端口。
使用场景
使用 --privileged
模式通常适用于以下场景:
开发和测试:
- 当需要模拟或测试接近生产环境的设置时,可能需要更宽泛的权限。
特定的应用需求:
- 某些应用,如 Docker 内部运行的 Docker(Docker-in-Docker)、某些类型的网络代理或监控工具,可能需要更高的权限来执行其核心功能。
安全考虑
尽管 --privileged
模式提供了极大的灵活性,但它也带来了显著的安全风险。该模式基本上允许容器执行任何操作,这可能包括对宿主机进行不安全的更改或攻击。因此,除非绝对必要,否则不建议在生产环境中使用 --privileged
模式。如果需要特定的 capabilities,建议使用 --cap-add
来精确控制容器的权限,这比使用 --privileged
更为安全。
cap add小知识
在 Docker 中,--cap-add
选项允许你向容器添加特定的 Linux 能力(capabilities)。这些能力是对传统的 root 权限的更细粒度控制,允许容器执行一些特定的高权限操作,而无需赋予容器完全的 root 权限。
以下是一些常见的 Linux 能力及其用途:
CAP_NET_ADMIN
:- 允许进行各种网络相关的操作,如接口配置、修改路由表、端口绑定等。
CAP_SYS_ADMIN
:- 这是一个非常强大的能力,几乎等同于 root。它允许执行多种系统级管理操作,如挂载文件系统、配置时钟等。
CAP_NET_RAW
:- 允许使用原始套接字,这通常用于网络协议的开发,如自定义ICMP或其他低级网络协议。
CAP_DAC_OVERRIDE
:- 允许绕过文件的读写和执行权限检查。
CAP_SETUID
:- 允许改变进程的 UID(用户ID)。
CAP_SETGID
:- 允许改变进程的 GID(组ID)。
CAP_SYS_PTRACE
:- 允许使用 ptrace,这通常用于调试和监视其他进程。
CAP_SYS_MODULE
:- 允许加载或卸载内核模块。
CAP_SYS_CHROOT
:- 允许使用 chroot,改变根目录。
CAP_SYS_TIME
:- 允许改变系统时钟。
CAP_AUDIT_WRITE
:- 允许向内核安全子系统写入审计日志。
CAP_MKNOD
:- 允许创建特殊文件,如设备节点。
这些能力可以单独或组合使用,以提供必要的权限,同时限制容器可以执行的操作,从而增强容器的安全性。在使用这些能力时,建议仅添加必要的最小集合,以避免潜在的安全风险。