文章目录
- 基本概念
- 三个核心概念:镜像、容器、仓库
- 联合文件系统 UnionFS
- 常用命令
- Docker File
基本概念
- 一次配置,处处使用
- 运行在同一宿主机上的容器是相互隔离的,各自拥有独立的文件系统
- 容器模型和虚拟机模型的主要区别
- 相较于虚拟机而言,容器虚拟化是更轻量级的,Docker 是容器虚拟化的一种实现
- 每个虚拟机都依赖于专用的操作系统;容器不会独占操作系统,运行在相同宿主机上的容器共享一个操作系统
- 虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且没有进行硬件虚拟
三个核心概念:镜像、容器、仓库
- 镜像:类比 Java 类
- 镜像的基础是联合文件系统
- 操作系统分为内核和用户空间,对于 Linux 而言,内核启动后,会挂载
root
文件系统为其提供用户空间支持,而 Docker 镜像就相当于是一个root
文件系统 - Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
- 镜像不包含内核,容器共享所在主机的内核
- 容器:类比 Java 对象
- 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间
- 因此容器可以拥有自己的
root
文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间
- 仓库:存放镜像
悬虚镜像
- 名称和版本显示为 :
- 出现的原因是,构建新的镜像时,新镜像和原镜像名和版本重复
- 移除悬虚镜像的命令
docker image prune
联合文件系统 UnionFS
- 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加
- 镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,实际并非由一个文件组成,而是由多层文件系统联合组成
- 联合文件系统是 Docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像的镜像),可以制作各种具体的应用镜像
- 不同 Docker 容器可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率
- 镜像层是只读的,容器层是可写的,容器启动时创建容器层(或者说,前一层是后一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层)
- 在构建镜像的时候,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉
常用命令
docker system df # 概览
docker images # 查看本地镜像
docker pull [IMAGE] # 从远程库拉取镜像
docker search [IMAGE] # 从远程库搜索镜像
docker run [IMAGE]
# -d: 后台运行容器(守护式)
# -it: 交互模式启动容器
# -P/p: 随机端口映射/指定端口映射
# --name: 命名
ctrl+p+q # 从容器退出,不终止容器
docker exec -it [CONTAINER ID] [ARGS] # 返回运行中的容器
docker attach [CONTAINER ID] # 返回运行中的容器
举例:返回正在运行CentOS的容器
docker exec -it 95dc01c22d9a /bin/bash
docker attach 95dc01c22d9a
区别:
exec 在容器打开了新的终端,exit 不会导致容器停止
attach 直接进入容器的终端,不会启动新的进程,exit 会导致容器停止
docker ps # 查看运行容器
docker start/restart/stop/kill/rm [CONTAINER(ID)] # 启动/重启/停止/强制停止/删除 容器
docker cp [CONTAINER ID: CONTAINER PATH] [SERVER PATH] # 从容器中拷贝文件到主机
docker export [CONTAINER ID] > [PATH] # 导出容器为.tar镜像文件
cat [PATH] | docker import - [USER]/[IMAGE]:[VERSION] # 从.tar导入镜像
docker commit [...] [CONTAINER ID] [REPOSITORY] # 将容器提交到本地镜像库
docker commit
的问题- 任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层
- 如果使用
docker commit
制作或修改镜像,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,即使根本无法访问到 - 使用
docker commit
意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知
Docker File
- 官方文档
- 最主要的用途是指导 Docker 进行应用的容器化(创建一个包含当前应用的镜像)
- 大部分指令都会创建一层新的镜像并进行提交
FROM [基础镜像] # 首行,指定基础镜像
RUN [执行命令] # build 时执行的命令
EXPOSE [端口号] # 暴露端口号
WORKDIR [工作目录] # 设置工作目录,不会创建新镜像层
ENV [K] [V] # 配置环境变量
COPY [宿主机文件地址] [容器文件地址] # 将宿主机文件拷贝到容器
ADD [宿主机文件地址] [容器文件地址] # 将宿主机文件拷贝到容器,并自动解压.tar
CMD [执行命令] # 容器启动后执行的命令
# 如果有多个,只有最后一个生效
# 会被 docker run 之后的参数替换
# 如果同时存在 ENTRYPOINT,则只作为 ENTRYPOINT 的参数
ENTRYPOINT [执行命令] # 容器启动后执行的命令