Docker file ( 利用docker file 创建一个自己的镜像,产品给客户部署 )
想学习更全面的docker知识可以点击右侧: Docker的概念及基本指令学习(全)
- docker file是用来构建docker 镜像的文件,在开始学习构建镜像之前,我们需要先来了解一下docker镜像的基本结构
- dockerfile由四部分组成
第一部分是基础镜像信息
第二部分是维护者信息(非必须)
第三部分是镜像的操作指令
第四部分是容器启动的时候需要执行的指令
docker file的编写
- docker file是一个文本文件,通常该文件起名是Dockerfile,文件中第一部分需要编写基础镜像信息。使用FROM关键字,例如 FROM nginx 该语句的含义是指,创建的镜像文件是基础镜像是nginx,隐含的含义是新镜像也会包含nginx的基础镜像所以对于docker镜像来讲镜像的基础层都应该是操作系统 - 编写基础镜像后,可以在后面跟镜像的维护人信息,MAINTAINER <用户名 用户邮箱>
- 第三部分需要编写针对目前读写容器进行的操作指令,需要注意的是,每一条指定都会改变镜像,所以每一条指定都会生成新的进行层,在工作中,镜像的层级尽量要少,镜像层多了后,会耗费较大的存储空间。常用的指定包括
1) RUN run指定代表在当前的容器层的shell中要执行的命令,例如在容器中创建一个文件夹(RUN mkdir /root/docker/content)。需要注意的是,每一次执行RUN指令都会需改当前的容器层状态,所以每次修改都会在当前容器中产生新的层,在生产活动中,就一个较为合理的使用建议是,镜像的层次尽量的少,所以建议在容器中采用&&号来连接多个需要RUN的指令,如果指令过长可以使用 “\”进行换行操作。RUN命令的执行时机是在构建镜像的时候。在build时候执行
2) EXPOSE 该指定代表容器运行之后向外开放的端口号。例如 EXPOSE 80 代表默认情况下,使用该镜像创建容器的时候,容器向宿主机开放80端口,如果需要向宿主机开放多个端口,可以直接写为 EXPOSE 90 80 1010
*** 3)*** ENV 设置docker容器的环境变量,在使用镜像启动容器的时候,我们有可能需要向容器中传递一些启动参数,这时候ENV就可以用来实施这个任务。在Dockerfile中,可以使用ENV MY_NAME=value的形式来设置名字叫做MY_NAME的环境变量,并赋予其初始值value,如果在启动容器的时候,需要改变其值,可以使用-e参数来进行重新指定,ENV设置的环境变量,在生效后,将会一直存在。想要观察环境变量的值,可以在容器启动后,进入容器后使用env命令来进行查看。此外,也可以在容器之外,使用 docker inspect命令来查看。在dockerfile中,声明了一个环境变量之后,可以使用 $环境变量的方式来进行引用
4) COPY在构建镜像的时候,如果需要将外部的文件拷贝的镜像内部,则可以使用COPY命令。命令格式为 COPY 宿主机文件 容器内地址。在生产环境下,有一个比较好的实施方式是,将需要拷贝的内容全部放到一个文件夹中,然后再dockerfile所在的目录进行镜像构建,尽量控制context的范围内的文件大小,因为在构建的过程中,docker需要将context中的所有文件都发送到docker的守护进程中,所以如果context内的文件太多,会造成构建镜像过大以及构建过程过长的问题。ADD和COPY相仿,它能够将宿主机的tar压缩包解压陈文件搞到镜像中。也可以下载宿主机没有的
5) USER通常指定为root账号。
6) WORKDIR,该指定会改变从WORKDIR指定之后的RUN以及CMD等相关指定的当前目录,例如 WORKDIR /root/web 则代表之后的指令的工作目录从root目录变更为/root/web目录。
7) VOLUME在构建镜像的时候,我们可以通过VOLUMN来给镜像指定一个挂载目标,在镜像内可以使用挂载目标直接访问在宿主机上的文件,如果没有指定挂载内容,则直接访问宿主机之内的内容。挂载目录或者是挂载文件可以在创建容器的时候使用-v参数来指定。 VOLUME可以接收一个数组型的参数,如果需要多个挂载点,可以在数组内直接声明。具体语法 VOLUME ["/root/vol","/root/tt"]
8) CMD,该指令与RUN的书写模式基本一致,但是她是在docker容器启动的时候需要执行的命令,在dockerfile中只能有一个CMD,如果写了多个也只会执行最后一个。在run或start执行。。demon off 守护模式关闭,进入当前控制台相当于没有-it
例如:
FROM nginx
USER root
RUN mkdir /root/web && mkdir /root/conf
COPY ./dist/* /root/web
COPY ./nginx.conf /root/conf/nginx.conf
EXPOSE 8080
CMD ["ngxin","-g","daemon off;","-c","/root/conf/ngxin.conf"]
FROM adoptopenjdk:11-jre-openj9
ENV ACTIVE=dev
ENV JARNAME=cslcp-0.0.1-SNAPSHOT.jar
RUN mkdir /opt/app && mkdir /opt/file
VOLUME ["/opt/app","/opt/file"]
#CMD ["java", "-jar", "/opt/app/cslcp-0.0.1-SNAPSHOT.jar" ,"--spring.profiles.active=${ACTIVE}"]
CMD java -jar /opt/app/${JARNAME} --spring.profiles.active=${ACTIVE}
制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!