文章目录
一、什么是Dockerfile
Dockerfile 是用于构建 Docker 镜像的脚本文件,由一系列指令构成。通过docker build命令构建镜像时,Dockerfile中的指令会由上到下依次执行,每条指令都将会构建出一个镜像,这就是镜像的分层。因此,指令越多,层次就越多,创建的镜像就越多,效率就越低。所以在定义Dockerfile时,能在一个指令完成的动作就不要分为两条。比如下面这个构建指令。
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
上述命令执行之后会创建3层镜像,可简化为以下格式
FROM centos
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
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
二、docker build命令
在 Dockerfile 文件的存放目录下,执行构建动作。以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。docker build -t nginx:v3 .
其中.
是上下文路径。上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
三、dockerfile指令
dockerfile指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像,用于后续的指令构建,必须是第一条指令 | FROM ubuntu:20.04 |
RUN | 用于执行后面跟着的命令行命令。有俩种格式 | ①RUN <命令行命令> ,其中命令行命令等同于,在终端操作的 shell 命令。②RUN [“可执行文件”, “参数1”, “参数2”] ,比如RUN [“./test.php”, “dev”, “offline”] 等价于 RUN ./test.php dev offline |
COPY | 拷贝本地文件到镜像的指定目录COPY [–chown=:] <源路径1>… <目标路径> | COPY hom* /mydir/ |
VOLUME | 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。 | VOLUME <路径> |
3.1 FROM
格式:FROM <镜像>[:<版本>]
说明:指定新镜像的基础镜像。每个 Dockerfile 都必须以 FROM 指令开始。
例子:FROM ubuntu:18.04
3.2 ENV
格式:ENV <键>=<值>
说明:设置环境变量。
例子:ENV MYAPP_COLOR=red
3.3 WORKDIR
格式:WORKDIR <路径>
说明:设置容器内的工作目录,如果目录不存在,则会创建。
例子:WORKDIR /app
3.4 RUN
格式:RUN <命令> 或 RUN [“可执行文件”, “参数1”, “参数2”]
说明:在镜像中执行命令,并创建一个新的层,用于缓存结果。
例子:RUN apt-get update && apt-get install -y curl
3.5 CMD
格式:CMD [“可执行文件”, “参数1”, “参数2”] 或 CMD 命令 参数1 参数2
说明:提供容器启动时默认执行的命令。如果 Docker 命令行中提供了其他命令,则会覆盖 CMD。
例子:CMD [“python”, “app.py”]
3.6 ENTRYPOINT
格式:ENTRYPOINT [“可执行文件”, “参数1”, “参数2”] 或 ENTRYPOINT 命令 参数1 参数2
说明:设置容器启动时执行的命令,可以被 Docker 命令行中指定的其他命令覆盖。
例子:ENTRYPOINT [“/bin/bash”]
3.7 EXPOSE
格式:EXPOSE <端口> [<端口>…]
说明:声明容器运行时监听的端口,不会实际上发布端口,需要在 docker run 时使用 -p 参数来发布。
例子:EXPOSE 80 443
3.8 ARG
【语法】ARG < varname >[=]
【解析】定义一个变量,该变量将会使用于镜像构建运行时。若要定义多个变量,则需要定
义多个ARG指令。
3.9 ADD
格式:ADD <宿主机源文件路径> <存放容器目标路径>
说明:将文件、目录、远程文件URL添加到容器中。如果 <宿主机源文件路径> 是 tar 压缩文件,会自动解压。
例子:ADD app.tar.gz /app
3.10 COPY
【说明】功能与ADD指令相同,只不过src不能是URL。若src为压缩文件,复制到容器后
不会自动解压。
3.11 VOLUME
格式:VOLUME [“dir1”, “dir2”, …]
说明:创建一个可以从本地主机或其他容器挂载的挂载点。
例子:VOLUME /var/www/html
四、dockerfile示例
# 使用官方MySQL镜像
FROM mysql:5.7
# 设置root用户的密码
ENV MYSQL_ROOT_PASSWORD=123456
# 设置字符集
ENV LANG=C.UTF-8
# 挂载mysql数据文件
VOLUME /var/lib/mysql
# 挂载mysql日志文件
VOLUME /var/log/mysql
# 挂载mysql配置文件
VOLUME /etc/mysql
在当前root用户的家目录,创建如上的dockerfile文件,执行命令docker build -t mysqlself .
该命令会在当前目录下查找Dockerfile文件,并构建名为mysqlself的Docker镜像。
使用命令docker run -itd --name mysql --network=blognetwork --ip=172.16.0.3 -p 3306:3306 mysqlself
运行刚才的镜像生成名为mysql的容器。用Navicat工具连接刚才创建的容器,并创建一个名为blogsite
的数据库,进入容器使用命令show databases;
可以看见刚才创建的数据库。