写在前面
使用来定义并构建,加载镜像来运行容器,可以说定义了后面的玩耍范围和规则。定义了容器内部运行的一切环境,很好的进行了资源隔离,包括访问网络和磁盘,因此需要映射网络端口和指定需要拷贝的文件到镜像中。
Dockerfile
官方Dockerfile实例
创建一个空目录,然后新建一个文件,写入以下内容
requiremtns.txt内容如下:
app.py内容如下:
其实不懂python也没关系,这段代码其实创建了一个http服务,打印一些信息。
构建app
语法形式 :
根据和镜像构建上下文()来构建一个镜像。构建上下文是指或里面的一系列文件。构建过程中可以使用上下文中的任何文件,比如和命令。
这里的指的是上下文路径,比较容易和路径混淆。实际上 的文件名并不要求必须为 ,而且并不要求必须位于上下文目录中,可以用来指定某个文件作为 。
一般大家习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中。
从上述过程看中的每一条语句都相当于创建了一个临时镜像, 执行了所要求的命令,最后提交了这一层并且移除了临时镜像。可以设置不移除临时镜像,请自行参考命令行格式。
文件可以忽略上下文中的文件打包到镜像里面。
运行app
整个流程比较清晰,重点是的语法格式
Dockerfile 基础语法(部分)
指定基础镜像
必须 是 Dockerfile 中第一条非注释命令。可以从上找到很多正式官方的基础镜像,比如,或者系统镜像 ,等。
除了这些现有基础镜像外,还存在一个特殊的镜像 ,它表示一个空白的镜像,直接 会让镜像体积更加小巧。
复制文件
指令将从构建上下文目录中 的文件/目录复制到新的一层的镜像内的
语法形式:
COPY …
COPY ["",… ""]
支持通配符;
如果 不存在会在复制文件前自动创建,不需要手动重建;
可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)
复制文件
指令和 的格式和性质基本一致。但是增加了一些功能,比如文件自动解压缩。所有的文件复制均使用 指令,仅在需要自动解压缩的场合使用
执行命令
指令是用来执行命令行命令的,有两种形式:
shell 格式:RUN
exec 格式:RUN ["可执行文件", "参数1", "参数2"]
写 其实就是在定义每一层该如何构建,每个 会创建一层,结果就是产生很多层的镜像,极大增加了构建部署的时间,可以使用下面这中形式:
指令
用于指定默认的容器主进程的启动命令。
shell 格式:CMD
exec 格式:CMD ["可执行文件", "参数1", "参数2"…]
对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。比如启动进程,正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行:
设置环境变量
指令可以支持环境变量展开: ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD
示例:
指定工作目录
该目录不存在,后台会自动建立目录
声明端口
指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在运行时使用 映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
参考资料
Docker Get Started,Part 2
https://docs.docker.com/get-started/part2/
2. 构建上下文
https://yeasy.gitbooks.io/docker_practice/content/image/build.html
领取专属 10元无门槛券
私享最新 技术干货