dockerfile入门
dockerfile介绍
docker容器启动的时候在最上层挂载了一个可写层,比如说我在容器里面创建一个文件,这个文件是存放在可写层的,这时候容器要是销毁了,那么我们对容器的一些写入操作也就没了,我这个文件也会随着容器销毁而销毁了,我们要是想要保存我们对容器的一些写入操作的话,可以使用commit命令然后将容器制作成一个镜像,这样下次run起来该镜像的时候,我们之前的写入操作就还存在了。除了使用commit方式制作镜像,还有一种方式就是编写Dockerfile 然后使用build命令来制作镜像了。
Dockerfile的规则
格式
#是注释
指令建议要大写,内容小写
执行顺序
docker是按照Dockerfile指令顺序依次执行的,也就是说从上到下
指令
FROM
这个FROM指令是dockerfile的第一个指令,然后指定了基础镜像,后面的所有指令都是运行在该基础镜像环境上的
MAINTAINER
该指令是描述的维护者信息
USER
USER 指令指明docker里面主进程,也就是pid是1的那个进程是用什么用户跑的,可以在容器终端中whoami来测试
WORKDIR
WORKDIR 是指下面的指令都在WORKDIR 指定目录下面工作,这个与linux 里面的cd 差不多
ADD
ADD指令是用来将宿主机某个文件或目录放到(复制)容器某个目录下面
COPY
COPY 指令类似ADD 指令,但是ADD指令范围更广些,ADD能够自动解压文件,能够访问网络资源,而COPY指令做不到。
EXPOSE
EXPOSE 指令用于暴露容器里的端口,我们在3.5里面演示过了,nginx暴露的端口是80,但是启动容器的时候需要指定宿主机端口来映射你暴露的端口。需要暴露多个端口的话可以使用多个EXPOSE,也可以一个EXPOSE指令后面跟多个端口,端口之间用空格隔开
ENV
ENV指令是用于设置环境变量的
RUN
RUN指令用于在容器中执行命令。我们常用来安装基础软件
CMD
CMD 指令是你在容器启动的时候帮你运行的命令,而RUN 这个指令是构建镜像的时候帮你运行的命令
ADD VS COPY
当你要发布的时候,一般都会把应用程序打包到镜像里,这时你就需要下面两个指令: ADD 、COPY 。它们两个都能把文件拷贝并添加到容器里的指定路径中,而且使用形式也相同。(注意:当路径中有空格时,使用下面的一种形式。)
docker如何创建自己的基础镜像
创建基础镜像
Docker 提供了两种方法来创建基础镜像,一种是通过引入tar包的形式,另外一种是通过一个空白的镜像来一步一步构建,本文使用的是第二种方法,既FROM scratch
scratch是Docker保留镜像,镜像仓库中的任何镜像都不能使用这个名字,使用FROM scratch表明我们要构建镜像中的第一个文件层。
如果我们有一个Linux下可执行的二进制文件,可以构建一个简单的镜像,仅执行这个二进制。
构建的过程很简单,执行如下命令。
$ docker build -t chello:0.1 .
通过 docker images 命令可以本地的镜像。
$ docker images
这样就可以创建一个基础的镜像,但是如果需要基础镜像发挥更多的作用,我们还需要其他的工作。Docker中的容器运行在操作系统中,共享了操作系统的内核。对于在Mac、Windows平台下,则是基于Linux虚拟机的内核。而Linux内核仅提供了进程管理、内存管理、文件系统管理等一些基础的管理模块。除此之外,我们还需要一些Linux下的管理工具,包括ls、cp、mv、tar以及应用程序运行依赖的一些包。因此我们就需要首先构建一个Minimal的操作系统镜像,在此基础上构建Python环境,再构建应用镜像。这样就实现了镜像文件分层,今后如果我们需要更新Python版本,那么只需要对这一层进行更新就可以。
Docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是上文说到的UnionFS。在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。Docker在bootfs之上的一层是rootfs(根文件系统)。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。Docker 核心技术与实现原理 这篇文章,作者阅读了 rootfs 的规范,指出构建rootfs一些必须的文件夹。
创建 Linux 镜像:alpine
目前比较流行的 rootfs 应该就是 alpine 了,因为他的体积特别小,最简单的环境只需要 5M
下载了 alpine 之后,我们就可以构建 Dockerfile
构建镜像并运行就可以了
**Dockerfile 中相关参数
FROM 指的是依赖的基础镜像,如scratch表示的是空白的,从零开始的。依赖的镜像可以是本地的,也可以是远程库的
ADD 指的是添加本地文件到镜像中,如果遇到linux可解压格式文件,会自动解压,这就是为什么整个文件中没有对tar.gz进行显式解压
RUN 运行命令,如安装软件的相关命令
CMD 设置启动Container时默认执行的命令,这个可以在启动容器时覆盖