Skip to content

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镜像的地方,有各种各样的镜像,例如centosubuntualpinenginx等。

  • Docker有个官方仓库 docker hub,地址是 https://hub.docker.com/。由于国内网络问题,几乎拉不下来镜像,建议使用国内的镜像加速地址。也就是上面的配置文件中的registry-mirrors

  • 还有一种方法是创建一个阿里云私有仓库,里面放一下自己的镜像。具体教程参考国内Docker镜像配置→

全速前进中...