以下是一个学习 Docker 的好网站!
https://docker_practice.gitee.io/
https://yeasy.gitbooks.io/docker_practice/content/
以下摘录一些个人的理解笔记
关于 Docker 镜像
1). Docker 镜像是一个特殊的文件系统
2). Docker 镜像(Image),就相当于是一个 root 文件系统
3). 除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
4). 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
5). 镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成
6). 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层
关于 Docker 容器
1). 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样
2). 镜像是静态的定义,容器是镜像运行时的实体
3). 容器的实质是进程
4). 容器不应该向其存储层内写入任何数据
5). 容器存储层要保持无状态化
6). 所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录
6). 容器运行时应该尽量保持容器存储层不发生写操作
7). 对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中
关于 Docker 仓库
1). 通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像
2). 仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy
3). 前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名
关于 Dockfile
1). docker build -t nginx:v3 . ,最后这个 . 不是在指定 Dockerfile 所在路径,而是指定上下文路径
2). docker build 命令构建镜像,其实并非在本地构建,而是在服务端
3). 一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下
4). Docker 不是虚拟机,容器就是进程
5). CMD 指令就是用于指定这个进程的启动命令的
6). 在指令格式上,一般推荐使用 exec 格式,这类格式会被解析为 JSON 数组
7). Docker 不是虚拟机,容器中的应用都应该以前台执行,容器内没有后台服务的概念
8). ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
9). 在 Shell 中,连续两行是同一个进程执行环境,而在 Dockerfile 中,这两行 RUN 命令的执行环境根本不同,是两个完全不同的容器