Dockerfile
1.Dockerfile是啥?
定义:Dockerfile 就是镜像描述文件
2.Dockerfile作用?
作用:通过Dockerfile文件构建一个属于自己的镜像
3.如何通过Dockerfile构建自己镜像
a.在指定位置创建一个Dockerfile文件
b.通过Dockerfile构建镜像
docker build -t aa:1.0 . (指定Dockerfile文件所在位置)
4.Dockerfile构建镜像流程
注意:将本次构建不需要文件和目录书写到dockerIgnore中,因为Dockerfile所以目录中就是上下文,Docker中默认会将上下文文件都发给到Docker引擎中去。这样构建起来速度就很慢,因此,需要将不需要的文件和目录写到dockerIgnore中去。
构建中,会产生临时镜像,最终生成一个image.临时镜像存放在缓存中。
5.Dockerfile的命令
FROM 当前镜像是基于哪个镜像 第一个指令必须是FROM MAINTAINER 镜像维护者的姓名和邮箱地址 RUN 构建镜像时需要运行的指令 EXPOSE 当前容器对外暴露的端口号 # 这个命令仅仅声明当前容器中服务端口是谁 WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点。用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续
Dockerfile指令中使用,它也将被创建。
如果指定的目录不存在,那么会自动创建。 ENV 用来 构建过程中设置环境变量 env key value ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包 COPY 类似于ADD,拷贝文件和目录到镜像中,将从构建上下文目录中《原路径》的文件/目录赋值到新的一层的镜像内的<目标路径> 位置。 VOLUME 容器数据卷,用于数据持久化和持久化工作 CMD 指定一个容器启动时要运行的命令,DOckerfile可以有多个CMD指定,但只有最后一个生效,CMD会被docker run之后的参数替换。 ENTRYPOINT 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数。
6.Dockerfile的构建
a.注意创建的文件最好是: Dockerfile
b.每条保留字指定必须大写,且后面都是跟至少一个参数。
c.# 表示注释
d.每条指令都会创建一个新的镜像层,并对镜像进行提交。
7.Dockerfile的指令详解
WORKDIR: 如果不存在文件目录,也会自动创建。在Dockerfile中可以设置多个WORKDIR,会依次进入相应的目录
比如:
WORKDIR /apps
WORKDIR data
# 第二个workdir会进入到 /apps/data
ENV: 构建过程中设置环境变量.
ENV key value 或者 key=value
VOLUME: 数据卷,用于持久化。注意如果Dockerfile中没有指定的话,也是可以通过-v 来声明。
VOLUME /root/data/
CMD & ENTRYPOINT 作用
1.)都是用来指定容器启动时默认执行命令
CMD: 指定一个容器启动时要运行的命令,DOckerfile可以有多个CMD指定,但只有最后一个生效,CMD会被docker run之后的参数替换。
ENTRYPOINT: 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数。
2)使用语法
1.直接命令方式: redis-server 2.json数组方式 ["redis-server"] #### 推荐用这种方法
注意 : 推荐使用第二种json数组方式。
3)区别是什么?
cmd里面命令如果在运行容器时进行覆盖: docker run 镜像:版本号 覆盖自己定义命令
entrypoint里面命令如果在运行容器时进行覆盖: docker run --entrypoint=指令 镜像:版本号 传递的参数
4)如何使用?
entorypoint和cmd配合使用,entrypoint来书写一个容器固定的指令,cmd用来给entrypoint传递参数,使用这种方式必须使用json数组形式。
ENTRYPOINT ["ls"] CMD ["/root/data"]
8.Dockerfile的案例
1.创建一个django项目 2.开发简单的功能,连接数据库 3.测试项目代码 4.编写Dockerfile生成项目镜像 5.运行镜像