一、Dockerfile简介
Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件。
利用Docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像(自己制作镜像的技术就是dockerfile)
二、Dockerfile基本结构
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时指令
三、Dockerfile指令
3.1、FROM指令
- 作用:指定基础镜像,必须是第一个命令
格式:
# 格式 FROM <IMAGE> 常用 FORM <IMAGE>:<TAG> 常用 FORM <IMAGE>@<DIGTST> # 实例 FROM python:3.8.0 # 注:tag/digest是可选的,如果不使用这两个值。则默认会使用latest版本的基础继续
在执行构建命令之前必须进入Dockerfile文件所在目录----构建镜像的命令:docker build -t {镜像的名称:tag名称} 构建镜像的位置
eg:# 创建Dockerfile文件 vim Dockerfile # 编辑该文件 FROM mysql:8.0 # 利用Docker build 命令执行该文件,构建镜像 docker build Dockerfile(报错,换个命令) docker build -t mysql:v1.0 .
3.2、MAINTAINER指令
- 作用:给镜像添加维护者信息
格式:
#格式 MAINTAINER <name> #实例 MAINTAINER 名字 MAINTAINER 邮箱 MAINTAINER 名字 <邮箱>
3.3、RUN指令
- 作用:在构建镜像时执行的命令(在构建镜像时要执行的初始指令)
格式:RUN用于在镜像容器中执行命令,有以下两种命令执行方式
- shell 执行方式
#格式 RUN <命令>
- exec执行方式
RUN ["executable","param1","param2"]
eg:
# 编辑Dockerfile文件,增加以下代码
RUN /bin/bash -c "echo hello"
RUN ["/bin/bash","-c","echo world"]
# 构建执行
docker build -t mysql:v1.1 .
3.4、ADD指令
- 作用:将本地文件添加到容器中,tar类型文件会自动化解压(网络压缩资源不会被解压),可以访问网络资源
格式:
#格式 ADD 要拷贝的文件 镜像的目录位置 ADD ["<src>",..."<dest>"] #用于支持包含空格的路径
eg:
# 以tomcat:latest 为例
# 编辑 Dockerfile文件, 将test.tar.gz文件添加到镜像tomcat:test下面
FROM tomcat:latest
RUN /bin/bash -c "echo hello"
RUN ["/bin/bash","-c","echo world"]
ADD test.tar.gz /
# 构建镜像
docker build -t tomcat:test .
# 确认镜像构建成功
docker images
# 确认copy的文件已经copy成功
# 基于构建的镜像创建容器并运行
docker run -dti --name tomcat_test tomcat:test
# 查看容器是否创建成功
docker ps -a
# 进入容器内部
docker exec -ti 容器的id /bin/bash
# 回到根目录
cd /
# 查看copy的内容
ll或者ls
3.5、COPY指令
- 作用:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
3.6、CMD指令
- 作用:构建容器后调用,也就是在容器启动时才进行调用。
格式:
- CMD ["executable","param1","param2"] (执行可执行文件,优先)
- CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
- CMD command param1 param2 (执行shell内部命令)
eg:
# 编写Dockerfile 文件
FROM tomcat:latest
RUN /bin/bash -c "echo hello"
RUN ["/bin/bash","-c","echo world"]
CMD echo "hello wrold!!!"
# 构建镜像
docker build -t tomcat:test2 .
# 查看镜像是否创建成功
docker images
# 使用镜像创建容器并启动容器查看输出信息
docker run -ti --name tomcat_test2 tomcat:test2
RUN 指令是在构建镜像时运行的指令,CMD指令是在启动容器时运行的指令
3.7、ENV指令
- 作用:设置环境变量
格式:
- ENV <key> <value> <key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
- ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可 以通过""来进行标示;另外,反斜线也可以用于续行
eg:
# 以centos镜像为基础,配置好java运行环境
# 准备centos基础镜像(自己下载)
# 准备jdk1.8的tar(自己下载)
# 创建Dockerfile ,编辑Dockerfile,将jdk的包拷贝到基础镜像中,设置环境变量
FROM centos:latest
ADD java的文件 /usr/
ENV JAVA_HOME /usr/jdk目录
ENV PATH $JAVA_HOME/bin
CMD java -version
# 执行构建镜像
docker build -t centos:jdk8 .
# 以创建镜像来启动容器,并且默认执行java -version
docker run -ti --name centos_jdk8 centos:jdk8
3.8、EXPOST指令
- 作用:指定于外界交互的端口
- 格式:EXPOSE <port> [<port>...]
eg:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
eg:
# 创建Dockerfile文件
vim Dockerfiel
# 编辑Dockerfile设置EXPOSE指定端口
FROM tomcat:latest
EXPOSE 8080
# 构建自己的镜像
docker build -t tomcat:test2 .
# 创建容器并启动
docker run -dti -p 8080:8080 --name tomcat_test2 tomcat:test2
# 进入创建容器当中
docker exec -ti 974 /bin/bash
ls
# 修改容器内webapps.dist
cd webapps.dist
mv * /usr/local/tomcat/webapps
cd ..
rm -rf webapps.dist
3.9、WORKDIR指令
- 作用:指定工作目录,类似如cd 命令
- 格式:WORKDIR 位置
注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
3.10、其他指令
- ENTRYPOINT:配置容器,使其可执行化。配合CMD可以省去"application",只使用参数;
- VOLUME:用于指定持久化目录;
- USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服 务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户;
- ARG:用于指定传递给构建运行时的变量;
- ONBUILD:用于设置镜像触发器
3.11、Dockerfile使用命令
- 作用:根据dockerfile创建镜像
- 命令格式:docker build [options] PATH|URL| -
参数:
- PATH,Dockerfile所在路径,文件名必须为Dockerfile
- URL,Dockerfile所在URL地址,可选参数
- -t,--tag list 为镜像设置名称和tag
- -f,--file string 指定Dockerfile的路径
四、总结
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。