容器隔离技术原理
1. namespace隔离
安装busybox镜像测试:
可以看到pid=1
2. cgroup限制
查询管控限制的资源:mount -t cgroup
以cpu为例:ls /sys/fs/cgroup/cpu, 其中cfs是重点关注的。
创建独立限制文件: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