Docker 学习之一:镜像

构成Docker 的三驾马车:镜像,仓库和容器。先说明一下镜像的相关内容。

镜像

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

获取镜像

1
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

下载时的文件是经过压缩的。

查看镜像、容器、数据卷的空间

1
docker system df

镜像运行

1
docker run

镜像退出

1
exit

列出镜像

1
docker image ls

虚悬镜像:发布新版本后的,新下载的和原有的同名,就会导致这样的情况,docker build 也可能出现这样的问题。

清理虚悬镜像

1
docker image prune

清理镜像

1
docker image rm [选项] <镜像1> [<镜像2> ...]

实际上,删除镜像分为untagged 和deleted两种状态。当某一镜像的所有的tag都删除了,没有被引用,才会被删除。

commit 命令的说明,可以修改镜像,并保存。

docker exec 命令进入容器,修改内容。

commit类似于版本控制,在镜像的上一层再写一个存储层,形成新的镜像。

1
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

尽管很方便改镜像,但是不推荐,后期维护不方便,最佳方案是使用dockerfile创建定制化镜像。

1
docker run --name webserver -d -p 80:80 nginx

这条命令会用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。

#Dockerfile定制镜像

它本身是一个文本文件,包含了一条条指令,每一条指令构建一层,例如下面的例子:

1
2
3
FROM nginx        从一个基础镜像,类似于一个导入的功能  from scratch 是一个空白镜像,建立的镜像是作为第一层镜像
RUN echo '<h1>Hello, Docker!</h1>' > 执行命令 每个run 就是一个执行命令,建议一层只行一次,多个可以使用&& 命令来执行。
/usr/share/nginx/html/index.html

构建镜像
在利用Dockerfile定制化好镜像后,需要利用Dockerfile进行定制

1
docker build [选项] <上下文路径/URL/->

docker build命令 最后通常会有一个. .表示当前目录。是只上下文路径

为理解上下文的概念,需要理解docker build的原理

docker build 工作原理:

docker 运行时分为服务端引擎和客户端工具。

在实际运行时,是通过Docker Remote API和服务器进程进行交互,最后的动作完成是在服务器端完成。

docker build 时是在服务器进行完成的。当输入命令时,会将路径下的所有的内容打包,然后传递给Docker服务器引擎,Docker引擎收到这个上下文包后,就会获得构建镜像的所有文件。

有人可能会觉得上下文路径就是Dockerfile所在的路径,并非如此。

默认情况下建议将Dockerfile和所需的各种文件以及包放在同一个目录下,理所当然,此时所构建的上下文路径就是指Dockerfile所在的路径。

但是并不是一定要这样做,-f 参数可以指定Dockerfile的所在路径以及名字,但是大多时候都是使用默认的名字即可。

使用时注意,不要将Dockerfile置于根目录下进行编译,你会发现整个镜像会将你的磁盘进行打包!!!
最佳实践是建一个空目录,创建Dockerfile,并将你要用的文件和所有包置于该目录下。

docker build 其他用法:

使用git repo进行构建
使用给定的tar包进行构建
从标准输入中读取Dockerfile
标准输入中读取上下文压缩包进行构建