一:Dockerfile文件,就是一个脚本文件
Dockerfile 是一个用来构建镜像的文本文件 没有文件后缀名,可以直接使用文本编辑器来编写 就像shell脚本的[xxx.sh] 文件,只是没有.sh作为后缀名。
二:制作这个文件有什么用?
1:版本区分 2:制作镜像的过程都在脚本文件中编写好了,可以清楚知道怎么构建的 3:如本地存储过多镜像文件,镜像文件很大的 4:发送,保存,部署方便
:三:创建Dockerfile文件
linux 系统中使用vim 编写Dockerfile
vim dockerfile
windows系统中使用vscode 直接编写,不设置文件后缀名
四:脚本编写实例
FROM nginx:latest
WORKDIR /root/
RUN ls
CMD pwd
CMD ["yum","install","-y","gcc"]
ENTRYPOINT pwd
ENTRYPOINT ["yum","install","-y","gcc"]
RUN echo a.txt
RUN cd /home && mkdir wenjian
ENV ABC=abc
COPY /home/a.txt /root/
COPY ./b/b.txt /root/
ADD /home/c.txt /root/d.txt
ADD https://luichun.com/e.txt /root/
EXPOSE 80/tcp
EXPOSE 81/udp
VOLUME /home/a/ /home/a/
VOLUME /home2
五:Dockerfile文件编写语法
语句 | 意思 |
---|
FROM <镜像名字>:<标签号> | 这个镜像是用那什么镜像作为基础的, 先找本地有没有这个镜像 如本地没有,会自动去docker hub中下载 | WORKDIR <linux路径地址> | 进入容器的什么路径 例1:
WORKDIR /root/ 进入/root/的文件夹 | RUN <linux语句> | 有多条RUN语句时,都会执行,但显示的为最后一条
在制作为镜像时,执行linux语句 有多条RUN,则会按顺序执行,并且没执行一次就打包一次 所以RUN语句尽量使用&& 符号来拼接 例1:
RUN ls && pwd 列出本目录文件列表,再查看所在路径是什么 例2:
RUN cd /home && mkdir wenjian 进入home路径创建【wenjian】文件夹 例3:
RUN yum -y install wget && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" && tar -xvf redis.tar.gz
| COPY <主机文件路径> <容器路径文件> | 把主机中的文件复制到容器里面 例1:
COPY /home/a.txt /root/b.txt 把主机中home/路径中的a.txt 文件复制到容器/root/文件夹中并且重命名为b.txt 例2:
COPY ./b.txt /root/ 把同Dockerfile路径中的/b文件夹 中的b.txt 文件复制到容器的/root/文件夹中 | ADD <网上的文件下载url> <容器中的路径> | 从网上下载文件到容器的什么路径里面 比COPY多一个功能下载 | ADD <主机文件路径> <容器路径文件> | 把主机中的文件复制到容器里面 例1:
ADD /home/a.txt /root/b.txt 和COPY 一样 | VOLUME <主机路径> <容器路径> | 挂在卷 把主机的什么路径替换到容器里面 该路径中的文件主机能用 该路径中的文件容器也能用 | VOLUME <容器路径> | 挂在卷 在容器里面创建一个文件夹 例1:
VOLUME /home2 等于:
VOLUME ["/home2"] 在容器的根目录中创建home2 文件夹 同时也会主机的/var/lib/docker/volumes/ 的文件夹中创建了一个home2 文件夹 主机可把文件放到该位置给容器内部使用 也就是该文件夹不会因为容器关闭而删除 启动容器后通过命令docker inspect <容器名> 来查看容器挂载卷的信息Mounts 或者docker volume ls 查看挂在卷列表 | ENV <环境变量=什么> | 环境变量,写入容器里面的环境变量 例1:
ENV ABC=abc 在容器的env里面就会多出一个ABC=abc 的变量 | EXPOSE <容器的端口> | 暴露容器的什么端口 例1:
EXPOSE 80/tcp 暴露80端口使用tcp协议 注意: 如果在启动该镜像的语句中docker run -d ----- 使用了-p ,启动语句优先级别高 启动语句的-p 参数会把构建镜像中的端口覆盖 | | 制作成镜像时不执行,当把这个镜像运行为容器时才执行的语句 CMD 与ENTRYPOINT | CMD <linux语句> | 执行一条linux语句 制作镜像时不执行,需等到启动容器时才执行 Linux语句有两种写法
CMD ["yum","install","-y","gcc"] 等于
CMD yum install -y gcc 本语句可以被docker run <镜像名> <linux语句> 中的<linux语句>覆盖掉 也就是Dockerfile中编写的CMD命令不运行 | ENTRYPOINT <linux语句> | 执行一条linux语句 制作镜像时不执行,需等到启动容器时才执行
ENTRYPOINT ["yum","install","-y","gcc"] 等于
ENTRYPOINT yum install -y gcc
本语句也能被运行容器时的命令语句覆盖, 但是需要指定参数,如:docker run <镜像名> --entrypoint <linux语句> |
六:把Dockerfile 脚本文件运行起来
docker build .
语句 | 意思 |
---|
docker build . -t NameA:v1 | build :构建镜像
. :表示当前的目录
-t [自定义镜像名]:[版本号] :指定构建出来的镜像使用什么名字,什么版本号 得到镜像 名为:NameA 标签号:v1 本条语句必须在Dockerfile脚本文件所在的路径中执行本语句, 并且本路径下的Dockerfile脚本文件的文件名为Dockerfile 新制作出来的镜像 的存放位置是本地镜像库
| docker build -f fileB -t NameB:v2 | 用名为fileB 的脚本文件构建NameB 的镜像
-f [自定义的Dockerfile脚本名字] : 制作的Dockerfile 脚本文件名字是自定义的名字 本路径下可能有多个Dockrefile 文件 所以不使用. 的默认使用文件名
|
构建镜像优化技巧:目前是能用就行,不要在这个地方深究,就算是集群部署1000台机器制作10000个镜像,总耗时不会使用多于2分钟
|