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
是要执行的命令,param1
和 param2
是该命令所需要的参数。如果要执行的命令是一个脚本文件,那么 executable
应该是解释器的路径,例如 bash
或 python
等。
在 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等一系列知识点的讲解,并且最后总