大纲
如何为容器提供资源配额?
如何访问共享内存?
如何以特定用户身份运行程序?
如何控制容器对主机进行的更改?
1. 设置资源配额
1.1 内存限制
docker container run -d --name $containerName -m 256m $imageName:$tag
1.2 CPU限制
docker container run -d --name $containerName \
-m 256m \
--cpus 0.75 \ #最多使用0.75个CPU
$imageName:$tag
1.3 访问设备
docker container run -d --name $containerName \
--device /dev/video0:/dev/video0 \ #挂载video0设备
$imageName:$tag
2 共享内存
Docker默认为每个容器创建唯一的IPC命名空间。若要两个容器访问共用的共享内存
docker container run -d --name ipc_producer \
--ipc shareable \ #生产者指定ipc
$imagename:$tag
docker container run -d --name ipc_consumer \
--ipc container:ipc_producer \ #消费者访问生产者的ipc
$imagename:$tag
3 用户
3.1 使用运行时用户
docker container run -d --name $containerName \
--user nobody \ #将运行时用户设置为nobody
$imageName:$tag
docker container run -d --name $containerName \
-u nobody:nogroup \ #将运行时用户设置为nobody,运行时组为nogroup
$imageName:$tag
3.2 用户和卷
默认情况下,容器内的用户与主机系统上的用户共享相同的用户ID空间。即,主机上的root用户拥有的文件,挂载到容器中后,容器中的root用户也可以读取该文件。
echo "test read" > myfile #主机上创建新文件
chmod 600 myfile #修改为只读
sudo chown root myfile #所有者为root
docker container run --rm -v "$(pwd)"/myfile:/test/myfile \ #挂载到容器中
-u root ubuntu:16.04 cat /test/myfile # 使用容器中的root读取该文件
#输出 "test read" #能够读取
4 操作系统功能集
创建新容器时,Docker默认会删除大部分功能,只保留运行大多数程序必须且安全的功能。
4.1 删除某项功能集
docker container run --rm -u nobody \
--cap-drop net_raw \ #删除NEW_RAW功能集
ubuntu:16.04 \
/bin/bash -c "capsh --print |grep net_raw"
4.2 以完全特权运行容器
docker container run --rm \
--privileged \
ubuntu:16.04 capsh --print