Docker组件介绍
守护进程daemon:运行docker的后台进程
客户端client:与用户交互,打包,拉/推镜像,运行/停止/删除容器
镜像images:只读的,把环境和程序代码打成的包
仓库registries:保存镜像的地方
容器containers:从镜像创建的应用运行实例,在内存中实例化的应用
Docker镜像
1)镜像的种类
基本镜像是没有父镜像的镜像,通常是操作系统的镜像,如ubuntu、alpine或debian
子镜像是建立在基础镜像上的镜像,增加了额外的功能
官方镜像是Docker认可的镜像
用户镜像是用户创建和分享的镜像。建立在基础镜像的基础上,并增加了额外的功能镜像的格式是user/image-name
2)镜像标签
使用tag为容器镜像打标签:和hash id相比语义清晰,latest自动用在最新的镜像上
采用USERNAME/CONTAINER_NAME:TAG的命名方法
Docker仓库
用户可以创建一个本地仓库供内部使用,可以使用官方提供的工具docker-registry,并获取官方registry镜像来运行。仓库会被创建在容器的/var/lib/registry目录:
docker run --name registry -d -p 5000:5000 --restart=always –v /opt/data/registry:/var/lib/registry registry
推送到本地仓库:docker push localhost:5000/session-web:latest
查看私有仓库中镜像:curl localhost:5000/v2/_catlog
推荐使用仓库软件工具Harbor和Quay。
Docker运行过程
$ sudo docker run -i -t ubuntu /bin/bash
以上为例运行ubuntu镜像,按照顺序,Docker执行以下流程
拉取ubuntu镜像: Docker检查ubuntu镜像是否存在,如果在本地没有该镜像,Docker会从Docker Hub镜像仓库下载。如果镜像本地已经存在,Docker会使用它来创建新的容器。
使用本地ubuntu镜像创建一个新的容器,使用chroot创建根目录
分配文件系统并且挂载一个可读写的层: 容器会在这个文件系统中创建,并且一个可读写的层被添加到镜像中。
分配网络/桥接接口: 创建一个允许容器与本地主机通信的网络接口。
设置一个IP地址: 从池中寻找一个可用的IP地址并且服加到容器上。
指定运行的程序: 运行指定的程序/bin/bash
捕获并且提供应用输出: 连接并且记录标准输出、输入和错误可以看到程序是如何运行的
Docker核心原理
对Docker项目来说,它最核心的原理实际上就是为待创建的用户进程:
启用Linux Namespace配置
设置指定的Cgroups参数
切换进程的根目录chroot
Rootfs保证了容器的一致性,使得容器无论是在本地、物理机、云服务器上都处于同样的运行环境