以下是一个学习 Docker 的好网站!
https://docker_practice.gitee.io/
以下摘录一些个人的理解笔记
关于 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-proxy3). 前者往往意味着 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 命令的执行环境根本不同,是两个完全不同的容器