Docker安全优化与隔离
一。Docker的安全优化:
1.当docker创建了一个容器的时候,Docker在后台为容器创建一个独立的命名空间,命名空间提供了最基础也最直接的隔离(/sys/fs/cgroup/cpu/docker)
2.与虚拟化方式相比,通过Linux namespace来实现的隔离不是那么的彻底(时间或者存储可能不彻底,很多内容还是依赖于宿主机)
3.容器只是运行在宿主机的严重特殊的进程,那么多容器之间使用的就还是同一个主机的操作系统内核
4.确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它防止拒绝服务攻击(DDoS)方面必不可少
二。Docker的资源限制
Docker和其他的虚拟化不同,因为docker使用的是安全隔离,而不是物理隔离,和系统公用很多内容,系统通过限制docker是通过cgroup的机制,系统当创建了一个docker容器后,会在/sys/fs/cgroup/cpu/docker下对于每一个系统资源都做了一个目录,并且把上层资源进行复制到这个文件,通过这个文件里面的值进行对docker内容的限定
1.限制cpu的使用
docker run --rm -it --name test1 --cpu-period 10000 --cpu-quota 2000 centos:7
cat /sys/fs/cgroup/cpu/docker/容器id/cpu.cfs_quota_us :查看时间调度
cat /sys/fs/cgroup/cpu/docker/容器id/cpu.cfs_period_us :查看时间周期
--cpu-period 10000
:用于设置 CPU CFS(Completely Fair Scheduler)调度周期,单位为微秒。这里设置为 10000 微秒,它定义了一个时间周期,在这个周期内,CPU 资源会被分配给容器。--cpu-quota 2000
:与--cpu-period
配合使用,用于设置容器在每个 CPU 调度周期内可以使用的 CPU 时间配额。这里设置为 2000 微秒,意味着在每 10000 微秒的周期内,该容器最多可以使用 2000 微秒的 CPU 时间,即该容器最多能使用 20% 的 CPU 资源。
dd if=/dev/zero of=/dev/null &
第二个命令是在容器内(或在一般的 Linux 系统中)将/dev/zero
产生的空字节流丢弃到/dev/null
,并且在后台运行这个操作。
docker run --rm -it --name test1 --cpu-shares centos:7
--cpu-shares:设定cpu的优先级,最大和默认为1024,值越大优先级越高cat /sys/fs/cgroup/cpu/docker/容器id/cpu.shares :查看cpu的优先级
2.限制内存的使用
docker run --rm -it --name test1 --memory 200M --memory-swap 200M centos:7
--memory 200M表示限制存储大小为200M, --memory-swap 200M表示限制交换存储的大小
cat /sys/fs/cgroup/memory/docker/容器id/memory.memsw.limit_in_bytes
注释:容器内存大小:1024*1024*200
yum install libcgroup:cgexec
是一个用于在指定的控制组(cgroup)环境中执行命令的工具。控制组是 Linux 内核提供的一种机制,可用于对进程的资源使用(如 CPU、内存、磁盘 I/O 等)进行限制和监控。
cgexec -g memory:docker/容器id/ dd if=/dev/zero of=/dev/shm/bigfile bs=1M count=190
if=/dev/zero
:if
即 input file
(输入文件),/dev/zero
是一个特殊的设备文件,它会持续不断地提供无限的空字节(\0
)流,作为 dd
命令的输入源。
of=/dev/shm/bigfile
:of
即 output file
(输出文件),/dev/shm
是 Linux 系统中的共享内存挂载点,通常以 RAM 作为存储介质,读写速度极快。bigfile
是要创建的文件名,这意味着 dd
命令会将从 /dev/zero
读取的数据写入到 /dev/shm
目录下的 bigfile
文件中
3.限制docker磁盘的io速率
docker run --rm -it --name test1 --device-write-bps /dev/nvme0n1:30M centos:7
该命令用于创建并启动一个基于 centos:7
镜像的 Docker 容器,同时对容器内针对 /dev/nvme0n1
设备的写入操作进行带宽限制。
dd if=/dev/zero of=bigfile bs=1M count=500 oflag=direct
该命令使用 dd
工具将 /dev/zero
设备的空字节流写入到名为 bigfile
的文件中,同时采用直接 I/O 模式以提高写入性能。
三。docker容器的信息隔离:
LXFS是一个为LXC容器童工增强文件系统功能的工具
主要功能:
1.资源可见性:LXFS可以使容器内的进程看到更准确的CPU,内存以及磁盘I/O等资源的使用信息,在没有LXFS时候,容器内看到的资源信息可能不准确,这会影响到容器内运行的应用对资源的评估和管理
2.性能监控:方便对容器内的资源使用情况进行监控和性能分析,通过提供准确的资源信息,管理员和开发人员可以更好的了解容器化应用的性能瓶颈,并进行相应的优化
LXFS的安装与使用
1.安装:yum install lxcfs.x86_64 -y
2.使用:lxcfs /var/lib/lxc/lxcfs/ &
注释:在使用上述命令后,会在/var/lib/lxc/lxcfs下创建系统的控制组,进程和cpu等
隔离内存和cpu以及磁盘:
docker run -it --rm --name test
-v /var/lib/lxc/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw
-v /var/lib/lxc/lxcfs/proc/meminfo:/proc/meminfo:rw
-v /var/lib/lxc/lxcfs/proc/diskstats:/proc/diskstats:rw
-v /var/lib/lxc/lxcfs/proc/stat:/proc/stat:rw
-v /var/lib/lxc/lxcfs/proc/swaps:/proc/swaps:rw
--memory 200M centos:7
以上隔离了:cpu,内存,磁盘,系统信息,交换分区
四。docker的容器特权
--privileged=true的权限特别大,接近于宿主机的权限,为了防止用户的滥用,需要添加限制,只提供给容器必要的权限,此时Docker提供了权限的白名单的机制,使用--cap-add添加必要权限
docker run -it --rm --name test2 --privileged busybox
容器的特权白名单:
docker run --rm -it --name test --cap-add NET_ADMIN busybox
--cap-add添加的权限网址参考:http://man7.org/linux/man-pages/man7/capabilities.7.html