7. Docker——Dockerfile

本章讲解知识点

  • Dockerfile
  • Dockerfile 常用命令
  • Dockerfile 综合示例
  • Docker Compose

<br>

当我们理解了镜像的基本原理后,我们就可以开始 Dockerfile 的学习了。

1. Dockerfile

Dockerfile 是用于构建 Docker 镜像的脚本。它包含一组指令,按顺序执行以创建 Docker 镜像,从而使其可以用于运行容器。

在 Dockerfile 中,可以定义容器运行时所需的操作系统、软件包、文件和配置。Dockerfile 还可以定义如何将应用程序和依赖项打包到 Docker 镜像中,并配置容器的环境变量、端口和启动命令等。

使用 Dockerfile 构建镜像可以确保在不同的环境中部署容器时,每个容器都是一致的。

<br>

2. Dockerfile 常用命令

2.1. FROM

FROM 用于指定基础镜像。在构建 Docker 镜像时,使用 FROM 命令指定一个基础镜像作为构建的起点。Docker 将会在该基础镜像的基础上,按照 Dockerfile 中定义的命令一步步构建新的镜像。

使用 FROM 命令的格式如下:

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y python3

在该 Dockerfile 中,使用 FROM 命令指定了基础镜像为 ubuntu:18.04。在构建镜像时,Docker 将会下载并使用该镜像作为构建的起点。接着,通过 RUN 命令安装了 Python3。最终构建出一个包含 Python3 环境的新镜像。RUN 命令就是在基础镜像上叠加了新分层

需要注意的是,FROM 命令必须是 Dockerfile 的第一个命令,且每个 Dockerfile 中必须至少有一个 FROM 命令。

2.2. MAINTAINER

MAINTAINER 用于指定维护者信息。在构建 Docker 镜像时,使用 MAINTAINER 命令可以记录该镜像的作者和联系方式,方便其他用户了解该镜像的来源和相关信息。可选,不是必须的

FROM ubuntu:18.04

MAINTAINER John Doe <johndoe@example.com>

MAINTAINER 命令在 Docker 1.13 之后被标记为过时的命令,推荐使用 LABEL 命令来记录镜像的元数据。

LABEL maintainer="John Doe <johndoe@example.com>"

2.3. RUN

RUN 用于在镜像中执行命令。在构建 Docker 镜像时,使用 RUN 命令可以在镜像中运行任意命令,例如安装软件包、创建用户、下载文件等等。

使用 RUN 命令的格式如下:

RUN <command>

其中,<command> 表示要执行的命令。可以是任何合法的 Linux 命令或 Shell 命令。比如通过 RUN 命令安装 Python3:

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y python3

需要注意的是,每个 RUN 命令都会在镜像中创建一个新的中间层。如果需要多次执行命令,可以将多个命令组合到一起,以减少镜像的层数。例如,可以使用以下命令来替代上面的 Dockerfile:

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y \
    python3 \
    git

在这个例子中,将 apt-get install 命令中的多个软件包放到了一行中,以减少镜像的层数。

2.4. CMD

CMD指令用于设置容器启动时执行的默认命令。这个命令会在容器启动时自动执行,如果在 docker run 命令中指定了其他命令,则会覆盖这个默认命令

CMD指令的格式为:

CMD ["executable", "param1", "param2"]

其中,executable 是要执行的命令,param1param2 是该命令所需要的参数。如果要执行的命令是一个脚本文件,那么 executable 应该是解释器的路径,例如 bashpython 等。

在 Dockerfile 中,可以使用多个 CMD 指令,但只有最后一个 CMD 指令会生效。如果之前的 CMD 指令不带参数,则最后一个 CMD 指令会覆盖之前的指令;如果之前的 CMD 指令带参数,则最后一个 CMD 指令会与之前的指令参数合并。

下面是一个简单的 Dockerfile 例子,其中使用 CMD 指令设置容器默认执行的命令为 “python app.py”:

FROM python:3.8-slim-buster
WORKDIR /app
COPY . .
CMD ["python", "app.py"]

当我们运行这个 Docker 镜像时,容器会自动执行 “python app.py” 命令,启动我们的 Python 应用程序。

还比如:

以下示例使用 CMD 指令来传递参数给应用程序:

FROM python:3.8
WORKDIR /app
COPY . /app
CMD ["python", "app.py", "--port", "8080"]

这个 Dockerfile 会在容器启动时运行 "python app.py --port 8080" 命令来启动 Python 应用程序,并且应用程序将会监听 8080 端口。

CMD指令用于设置容器启动时执行的默认命令。但如果在 docker run 命令中指定了其他命令,则会覆盖这个默认命令。例如 docker run my-python-app ls,容器启动后运行的命令将变为 ls

2.5. EXPOSE

EXPOSE 指令用于声明容器运行时要监听的端口。它不会创建实际的端口,也不会将端口暴露给主机。相反,它只是向 Docker 运行时环境记录了容器在哪个端口上运行。

EXPOSE 指令的格式为:

EXPOSE <port> [<port>/<protocol>...]

其中,<port> 是要暴露的端口号,可以指定多个端口。如果要指定协议,则可以使用 <protocol> 参数,如 tcp 或 udp 等。

使用 EXPOSE 指令并不会自动将容器的端口暴露给主机。如果要将容器端口暴露给主机,则需要在运行容器时使用 -p 或 -P 参数来指定要映射的端口

以下是一个简单的 Dockerfile 示例,其中使用 EXPOSE 指令来声明容器将监听的端口:

FROM node:14-alpine
WORKDIR /app
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

这个 Dockerfile 会将容器暴露在 3000 端口上,并在容器启动时运行 "npm start" 命令来启动 Node.js 应用程序。

同时在使用中,需要使用 docker run 命令来启动容器并将容器的端口映射到主机上的端口:

$ docker run -p 8080:3000 myapp

这个命令会将容器的 3000 端口映射到主机上的 8080 端口上,使得我们可以通过访问主机的 8080 端口来访问容器中运行的应用程序。

2.6. WORKDIR

WORKDIR 指令用于设置容器的工作目录。该指令可以多次使用,每次使用都会覆盖前面设置的工作目录。

WORKDIR 指令的格式为:

WORKDIR /path/to/workdir

其中,/path/to/workdir 是要设置的工作目录的路径。如果该目录不存在,则会自动创建

在 Dockerfile 中使用 WORKDIR 指令可以让容器在运行时默认进入指定的工作目录。这样,在容器中运行命令时就可以相对于工作目录来进行,而不必使用绝对路径。

以下是一个简单的 Dockerfile 示例,其中使用 WORKDIR 指令来设置工作目录:

FROM node:14-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]

这个 Dockerfile 会将容器的工作目录设置为 /app,然后将当前目录中的所有文件复制到容器的 /app 目录中。然后,它会在容器中运行 "npm install" 命令来安装 Node.js 应用程序所需的依赖。最后,它会在容器启动时运行 "npm start" 命令来启动应用程序。

使用 WORKDIR 指令可以让我们更加方便地管理容器中的文件和目录,使得我们可以使用相对路径来引用容器中的文件和目录

2.7. COPY

COPY 指令用于将本地文件或目录复制到容器中。它可以用于将应用程序代码、配置文件、依赖文件等复制到容器中,以便在容器中运行应用程序。

COPY 指令的格式为:

COPY <src> <dest>

其中,<src> 是要复制的文件或目录的路径,可以是相对路径或绝对路径。如果是目录,则会递归地复制该目录及其子目录中的所有文件和子目录。<dest> 是要将文件或目录复制到的容器路径。

比如上面的例子会将当前目录中的所有文件和子目录复制到容器的 /app 目录中。

需要注意的是,使用 COPY 指令时要确保源文件或目录存在,并且目标路径不存在或是一个目录。如果目标路径不存在,则会自动创建该路径

2.7. ADD

ADD 指令用于将本地文件或目录复制到容器中,类似于 COPY 指令。不同之处在于,ADD 指令还支持自动解压缩和下载远程文件的功能

ADD 指令的格式为:

ADD <src> <dest>

其中,<src> 是要复制的文件或目录的路径,可以是相对路径或绝对路径。如果是目录,则会递归地复制该目录及其子目录中的所有文件和子目录。如果 <src> 是一个 URL,则 Docker 将下载该 URL 指定的文件并将其复制到容器中。如果 <src> 是一个 tar 文件,则 Docker 将自动解压缩该文件并将其复制到容器中。<dest> 是要将文件或目录复制到的容器路径。

2.8. ENV

ENV 指令用于设置环境变量。在容器中运行应用程序时,可以使用这些环境变量来配置应用程序。

ENV 指令的格式为:

ENV <key> <value>

其中,<key> 是环境变量的名称,<value> 是环境变量的值。可以在 Dockerfile 中使用多个 ENV 指令来设置多个环境变量。

以下是一个 Dockerfile 示例,其中使用 ENV 指令设置了一个环境变量:

FROM node:14-alpine
ENV NODE_ENV=production
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]

这个 Dockerfile 会设置一个名为 NODE_ENV 的环境变量,其值为 production。然后,它会在容器中运行 "npm install" 命令来安装 Node.js 应用程序所需的依赖。最后,它会在容器启动时运行 "npm start" 命令来启动应用程序。

使用 ENV 指令可以方便地设置容器中的环境变量,以便在运行应用程序时进行配置。这些环境变量可以在容器内部的应用程序代码中使用,或者可以在容器启动时通过命令行参数传递给应用程序。

2.9. VOLUME

VOLUME 指令用于创建一个挂载点,将

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

云计算面试题全解析 文章被收录于专栏

本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总

全部评论
🐴🉑
点赞 回复 分享
发布于 2023-05-08 22:39 广东
多多点赞,会变好看,多多留言,会变有钱
点赞 回复 分享
发布于 2023-05-08 16:27 广东
面试题好全
点赞 回复 分享
发布于 2023-05-08 13:07 广东

相关推荐

头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
评论
8
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务