Docker概念
镜像(Docker image)
- 上一章提到,一个完整的镜像系统是由
bootfs+rootfs组成的。 - 容器image镜像其实就是把
rootfs打包到一起(镜像的本质就是一种压缩包),这个rootfs系统里包含了各种依赖文件,以及你的应用程序文件都在一起。例如打包成了一个centos,ubuntu操作系统,一般都是非常精简版的。 - 有这样一个问题,如果同时开多个相同容器,用到的镜像是同一个,那么底层的镜像
rootfs是分开隔离的,还是共享的?
答案是:共享的。这个实现就是用到了UnionFS(联合文件系统)。

- UnionFS(联合文件系统)
联合文件系统由多个层组成,每个层叫作一层layer。可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。
lowerdir层:挂载的是镜像层,init里放的是一些hosts、hostname、resolv.conf文件,因为每个容器启动
肯能指定的网络,还有主机名都不一样,所以这些文件会单独挂载,docker引擎启动时候会动态修改保证每个容器
的主机名等信息不一样
upperdir层:是容器的可写层,改动的文件都在这里
merged层:upperdir层+lowerdir层的内容共同构成了merged的内容,一切以upperdir为准,没有的去lowerdir中要

Docker的三大底层核心技术
- UnionFS(联合文件系统)见上图
- Cgroup(控制组)
作用:限制资源给容器分配一定资源,并且锁住。可以有效限制防止单个容器把宿主机 CPU / 内存 / 磁盘 IO 占满 - Namespace(命名空间)
作用:隔离资源给容器画独立隔离边界,每台容器互相隔离。
| Namespace | 中文名称 | 核心作用(Docker场景) | 通俗说明 |
|---|---|---|---|
| PID | 进程ID隔离 | 容器内进程PID从1开始,隔离宿主机及其他容器的进程,容器内看不到外部进程 | 容器内进程编号独立,与外部进程互不可见 |
| Mount | 挂载隔离 | 容器拥有独立根文件系统(/),隔离宿主机磁盘目录和挂载点,避免文件操作互相影响 | 容器有专属“磁盘空间”,不干扰宿主机文件,也看不到宿主机文件 |
| UTS | 主机名隔离 | 容器有独立主机名和域名,修改容器hostname不影响宿主机及其他容器 | 容器可自定义主机名,独立于宿主机存在 |
| Network | 网络隔离 | 为容器分配独立网卡、IP、端口、路由,与宿主机、其他容器网络隔离 | 容器有专属“网络环境”,端口、IP互不冲突 |
| User | 用户/用户组隔离 | 容器内用户与宿主机隔离,容器内root≠宿主机root,权限被限制 | 容器内管理员权限被隔离,保障宿主机安全 |
| IPC | 进程间通信隔离 | 隔离容器内进程间通信(消息队列、共享内存),外部进程无法访问容器内IPC资源 | 容器内进程通信独立,外部进程无法干预 |
配置文件
路径: /etc/docker/daemon.json
json
{
"data-root": "/var/lib/docker", // Docker数据储存目录
"live-restore": true, // 开启容器实时恢复,也就是说有些情况需要重启docker时候,容器不受影响不会挂
"log-driver": "json-file", // 日志格式,默认是json-file
"log-opts": { // 日志放在/var/lib/docker/containers/容器ID/容器ID-json.log文件中
"max-file": "3", // 日志文件数量,默认是3个
"max-size": "10m" // 日志文件大小,默认是10m
},
"registry-mirrors": [ // 镜像加速地址
"https://docker.xuanyuan.me", //轩辕镜像仓库
"https://docker.1ms.run", //1ms镜像仓库
"https://docker.aityp.com" //渡渡鸟镜像仓库
]
} docker
由于国内的docker镜像网站也经常被下线墙掉,所以需要使用其他能用的镜像源。
下面是镜像源汇总都会更新
https://github.com/dongyubin/DockerHub
https://github.com/dqzboy/Docker-Proxy
https://github.com/DaoCloud/public-image-mirror Docker仓库
说明
顾名思义,Docker仓库就是存储很多Docker镜像的地方,有各种各样的镜像,例如
centos、ubuntu、alpine、nginx等。Docker有个官方仓库
docker hub,地址是https://hub.docker.com/。由于国内网络问题,几乎拉不下来镜像,建议使用国内的镜像加速地址。也就是上面的配置文件中的registry-mirrors。还有一种方法是创建一个阿里云私有仓库,里面放一下自己的镜像。具体教程参考国内Docker镜像配置→