什么是 Dockerfile ?
Dockerfile
是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile 核心命令
1、FROM
指定基础镜像构建
- 写法:
FROM 指定基础镜像
2、COPY
复制命令。从上下文目录中复制文件或者目录到容器里指定路径。
- 写法:
COPY 源路径,目标路径
COPY ["源路径","目标路径"]
3、RUN
运行指令。构建的时候运行的指令;
主要在于镜像构建的时候运行,运行 build
命令的时候,后面接的命令就是 shell
输入的命令;
- 写法:
RUN shell命令 参数1 参数2
RUN ["shell命令","参数1","参数2"]
- 例如:
RUN ["echo",">","/usr/share/index.html"]
4、CMD
运行指令。运行容器时候运行的指令;
主要在于镜像运行容器的时候生成,运行run的时候运行。
- 写法:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
- 例如:
CMD ["dotnet","netcore.dll"]
# 缺点:在 run 命令后面可以进行覆盖
docker run -d -P netcore dotnet netcore.dll 进行覆盖掉
5、ENTRYPOINT
运行指令。运行容器时候运行的指令(不会被覆盖)
- 写法:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以和 CMD
动态结合,设置动态的配置参数。
- 例如:
ENTRYPOINT ["nginx", "-c"] 定参
CMD ["/etc/nginx/nginx.conf"]变参
6、EXPOSE
暴露端口指令
仅仅声明端口,就是指定镜像暴露的端口。
在 run
的时候,通过 docker run -p
会自动随机映射到 EXPOSE
端口。
- 写法:
EXPOSE 端口
- 例如:
EXPOSE 5000
EXPOSE 5001
7、WORKDIR
工作目录指令
用于应用在容器内的工作目录,就好比 netcore
目录
- 写法:
WORKDIR <工作目录路径>
- 例如:
WORKDIR /netcore
# or 或者
WORKDIR /nginx
Dockerfile 指令说明简洁版
FROM
# 构建镜像基于哪个镜像
MAINTAINER
# 镜像维护者姓名或邮箱地址
RUN
# 构建镜像时运行的指令
CMD
# 运行容器时执行的 shell 环境
VOLUME
# 指定容器挂载点到宿主机自动生成的目录或其他容器
USER
# 为 RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
WORKDIR
# 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
HEALTHCHECH
# 健康检查
ARG
# 构建时指定的一些参数
EXPOSE
# 声明容器的服务端口(仅仅是声明)
ENV
# 设置容器环境变量
ADD
# 拷贝文件或目录到容器中,如果是 URL 或压缩包便会自动下载或自动解压
COPY
# 拷贝文件或目录到容器中,跟 ADD 类似,但不具备自动下载或解压的功能
ENTRYPOINT
# 运行容器时执行的 shell 命令
使用 Dockerfile 定制镜像
Ubuntu 环境原始配置 Nginx
1、安装 nginx
所需工具
apt -y install gcc make pcre-devel zlib-devel tar zlib
2、下载 nginx
wget http://nginx.org/download/nginx-1.16.1.tar.gz
3、nginx
解压到 /nginx
目录
tar -zxvf nginx-1.16.1.tar.gz
4、切换到 /nginx/nginx-1.16.1
,执行 ./configure , make ,make install
cd nginx-1.16.1 && ./configure && make && make install
5、切换到 /usr/local/nginx/sbin
,执行 ./nginx
启动 nginx
cd /usr/local/nginx/sbin && ./nginx
编写 Nginx 的 Dockerfile 文件
FROM ubuntu
RUN apt -y install gcc make pcre-devel zlib-devel tar zlib
WORKDIR /nginx
COPY nginx-1.16.1.tar.gz /nginx
RUN tar -zxvf nginx-1.16.1.tar.gz
RUN cd nginx-1.16.1 && ./configure && make && make install
EXPOSE 80
CMD /bin/bash
- 运行
Dockerfile
配置构建Nginx
:
docker build -t nginx:v1.16.1 ./
- 耐心等待,最后一步提示:
Successfully built [image-id]
Successfully tagged nginx:v1.16.1
启动 Nginx 命令
- 运行
nginx
docker run -itd -P nginx
# 参数说明:-it 交互式命令,d 后台运行,-P 暴露端口
- 查看运行的容器信息
docker ps
# or
docker container ls
#查看所有,添加参数 -a
- 进入
nginx
docker exec -it nginx /bin/bash
# 参数说明:-it 交互式命令,bash 是 Bash Shell (Linux 默认)
- 切换到
nginx
安装路径
cd /usr/local
- 查看当前目录列表
ls 显示 conf html logs sbin
- 进入
sbin
文件夹
cd sbin
- 再次查看当前目录列表
ls 显示 nginx
- 当前目录直接启动
nginx
./nginx
Dockerfile 指令详解
指令 | 说明 |
FORM | 指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。 |
RUN | 用来执行命令行命令。其基本格式: shell格式: RUN <命令> ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式; exec格式: RUN <"可执行文件", "参数1", "参数2">,此种方式像是函数调用中的格式; |
COPY | 复制文件。 其基本格式: 格式1:COPY <源路径>...<目标路径> 格式2:COPY [“<源路径1>”,....."<目标路径>"] |
ADD | 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压; |
CMD | 容器启动命令。其基本格式: shell格式: CMD <命令> exec格式: CMD ["可执行文件", "参数1", "参数2"...] 参数列表格式: CMD [“参数1”, “参数2”...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数 |
ENTRYPOINT | 入口点。其基本格式分为exec和shell,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行中可以替代,不过比CMD繁琐,需要通过docker run 的参数--entrypoint 来指定。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了: <ENTRYPOINT> "<CMD>" |
ENV | 设置环境变量。(都可以使用这里使用的变量)其基本格式: 格式1:ENV <key> <value> 格式2:ENV <key1>=<value1> <key2>=<value>... |
ARG | 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式: 格式1: ARG <参数名> [=<默认值>] 格式2: 该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖 |
VOLUME | 定义匿名卷。 其基本格式: 格式1: VOLUME ["<路径1>", "<路径2>"...] 格式2: VOLUME <路径> |
EXPOSE | 暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式: 格式1: EXPOSE <端口1> [<端口2>...] |
WORKDIR | 指定工作目录。其基本格式: 格式1: WORKDIR <工作目录路径> |
USER | 指定当前用户。USER是帮助你切换到指定用户。 其基本格式: 格式1: USER <用户名> |
HEALTCHECK | 健康检查,判断容器的状态是否正常。 其基本格式: 格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令 格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检查指令 |