1.基础知识
- 每条保留字指令都必须为大写字母且后面要跟至少一个参数(即不能只写关键字然后不跟参数)
- 指令按照从上到下,顺序执行
-
是注释的意思
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
2.执行dockefile的大致流程
- docker从基础镜像中运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
3.指令介绍
- FROM:基础镜像,当前新的镜像是基于哪个已经存在的镜象的
- MAINTAINER:镜像作者及其邮箱
- RUN:容器构建时需要执行的命令
- EXPOSE:暴露镜像的端口号
- WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
- ENV:用来在构建镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY:跟ADD类似,拷贝文件和目录到镜像中
- VOLUME:容器数据卷,用于数据保存和持久化工作
- CMD:指定一个容器启动时要执行的命令,dockefile可以有多个cmd指令,但只有最后一个生效,cmd会被docker run之后的参数替换
- ENTRYPOINT:指定一个容器启动时要执行的命令,和CMD的目的一样,都是在指定容器启动程序及参数
- ONBUILD:当构建一个被继承的dockefile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
4.案例
4.1 Base镜像
<b>scratch</b>: Docker中99%的镜像都是通过在base镜像中安装配置构建成的
4.2 编写dockefile文件
# 命令行
flynngod@flynngod:~/FlynnGod/Code/DockerDir$ cat Dockerfile
# 基于哪个镜像制作的新镜像
# 如果是空的镜像,则写scratch
FROM python
# 作者信息
MAINTAINER MoonMonsters qxinhai@yeah.net
# 设置环境变量
ENV MAIN_PATH /usr/local
# 当启动容器时,在shell终端中默认进入的目录
WORKDIR $MAIN_PATH
# 执行命令
RUN pip install flask
# 容器暴露给宿主机的端口
EXPOSE 80
# CMD命令,从上往下依次执行
CMD echo $MAIN_PATH
CMD echo "build success..."
# 打印pip版本
CMD echo pip -V
# 打印python版本
CMD echo python -V
当启动容器时,默认打开shell终端
CMD /bin/bash
4.3 执行dockerfile文件,创建镜像
[图片上传失败...(image-ee8b95-1540119959172)]
具体解释:
(1)编译镜像命令,-t后面的是生成的镜像的名称以及TAG;有个问题有点在意,编译的路径需要是目录名称,然后自动在该目录下寻找Dockfile名称的文件自动编译。
(2)编译步骤,就是在Dockefile文件中的代码顺序。
(3)会执行pip install flask
命令,然后从网上或者缓存中下载,由于之前测试过了,所以这步中它自动从缓存中加载了。
(4)编译成功提示。
(5)使用docker images
查看已经创建好的镜像。
4.4 由镜像创建容器
flynngod@flynngod:~/FlynnGod/Code/DockerDir$ docker run -it --name=mypython customer_python:v2
root@e6e67c899b38:/usr/local# python
Python 3.7.0 (default, Oct 16 2018, 07:10:55)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
# flask确实已经下载完成
>>> flask.__version__
'1.0.2'