容器隔离技术原理
1. namespace隔离
安装busybox镜像测试:
可以看到pid=1
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K7vYFyUS-1626792109234)(C:\Users\lonk\AppData\Roaming\Typora\typora-user-images\image-20210720150645441.png)]](https://i-blog.csdnimg.cn/blog_migrate/d92dbf2a27030df4fb4d0b386c57fc24.png)
2. cgroup限制
查询管控限制的资源:mount -t cgroup
以cpu为例:ls /sys/fs/cgroup/cpu, 其中cfs是重点关注的。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQG4Deqn-1626792109238)(C:\Users\lonk\AppData\Roaming\Typora\typora-user-images\image-20210720150956783.png)]](https://i-blog.csdnimg.cn/blog_migrate/f3dbb6080685083343518f26552b84e9.png)
创建独立限制文件:mkdir container
默认生成一下文件:

设置cpu限制:
每 100 ms 的时间里,被该控制组限制的进程只能使用 20 ms 的 CPU 时间,也就是说这个进程只能使用到 20% 的CPU 带宽: echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
设置限制的进程:
echo 226 > /sys/fs/cgroup/cpu/container/task
其他资源控制:
blkio,为 块 设 备 设 定 I/O 限 制,一般用于磁盘等设备;
cpuset,为进程分配单独的 CPU 核和对应的内存节点;
memory,为进程设定内存使用的限制。
在容器中配置cgroup:
$ docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
3. docker分层设计
Docker 在镜像的设计中,引入了层(layer)的概念。也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量 rootfs。
Union File System 也叫 UnionFS,最主要的功能是将多个不同位置的目录联合挂载(union mount)到同一个目录下。
应用的容器镜像简单实战
- 启动Docker
sudo systemctl start docker
- 创建一个镜像的目录
mkdir docker_demo
- 上传web应用
demo-0.0.1-SNAPSHOT.jar
- 编写dockerfile文件
# touch Dockerfile
# vi Dockerfile
# 基础镜像
FROM java:8
# 将 context 的 jar 包, 拷贝到 容器的工作目录下, jar 包名称不变
ADD demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar
# spring boot 的 web 应用, 默认占用 8080 端口, 所以把它 暴露出去 即可
EXPOSE 8080
# 入口命令, 启动服务器
ENTRYPOINT ["java", "-jar", "demo-0.0.1-SNAPSHOT.jar"]
- 创建镜像
docker image build -t jardemo:v1 .
# 启动服务
docker run -d -p 8080:8080 jardemo:v1

- 查看启动镜像服务
docker ps
docker stop 0f0bf5deb7f3
- 删除容器与镜像
docker rm jardemo
docker rmi jardemo:v1
本文介绍了Docker的容器隔离技术,包括namespace和cgroup的使用,详细阐述了如何通过cgroup限制资源如CPU和内存的使用。此外,还探讨了Docker的分层设计,以及如何通过Dockerfile创建镜像并启动容器服务。最后,提供了从创建镜像到启动、查看和管理容器的实战步骤。

1270

被折叠的 条评论
为什么被折叠?



