docker学习笔记(四)--DockerFile

发布于:2024-12-18 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、什么是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;可以看见刚才创建的数据库。
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到