目录
一、镜像结构
自定义 Docker 镜像有很多用途,以下是一些主要的应用场景:
-
一致性环境:通过自定义镜像,您可以确保您的应用在不同的环境中(开发、测试、生产等)运行在完全一致的环境中。这可以避免"在我机器上可以运行"的问题。
-
快速部署:自定义镜像包含了运行应用所需的所有依赖,这使得部署过程变得非常快速和简单。只需运行一个命令,就可以在任何安装了 Docker 的机器上启动应用。
-
版本控制和回滚:每个 Docker 镜像都有一个唯一的标签,这使得版本控制变得非常简单。如果新版本的应用有问题,您可以很容易地回滚到旧版本的镜像。
-
微服务架构:在微服务架构中,每个服务都可以有自己的 Docker 镜像。这使得每个服务可以独立地更新和扩展,而不会影响其他服务。
-
持续集成/持续部署(CI/CD):在 CI/CD 管道中,自定义镜像可以用于构建、测试和部署应用。这使得整个开发过程更加自动化,提高了开发效率。
1. 基本结构
Dockerfile 是一个文本文件,它包含了一组用户可以调用来创建镜像的指令。以下是 Dockerfile 的基本结构:
-
FROM:指定基础镜像,所有操作都基于这个基础镜像。例如:
FROM ubuntu:18.04
-
LABEL:为镜像添加元数据及声明镜像的作者或者维护者的信息。
-
RUN:在镜像中运行命令,这些命令会在新的层上创建新的镜像。例如:
RUN apt-get update
-
CMD:提供容器默认的可执行程序,可以包含可执行程序,也可以省略,如果省略,则必须在运行时通过命令行指定。例如:
CMD ["executable","param1","param2"]
-
EXPOSE:声明运行时容器提供服务的网络端口。例如:
EXPOSE 8080
-
ENV:设置环境变量。例如:
ENV myName="John Doe" myDog=Rex\ The\ Dog
-
ADD 和 COPY:将文件从 Docker 主机复制到 Docker 镜像中。ADD 有自动解压缩功能,COPY 则更为直接明了。
-
ENTRYPOINT:配置容器启动后执行的命令,并且不会被 docker run 提供的参数覆盖。
-
VOLUME:创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保存的数据等。
-
WORKDIR:设置工作目录,所有后续的操作(CMD、ENTRYPOINT、COPY 和 ADD)都会在这个目录下进行。
-
USER:设置运行容器时的用户名或 UID。
-
ONBUILD:当构建一个被继承的 Dockerfile 时运行命令,该指令添加到镜像中,稍后触发。
-
MAINTAINER :用于声明镜像的作者或者维护者的信息,它可以为使用者提供一种联系镜像创建者的方式。
需要注意的是,MAINTAINER 从 Docker 1.13.0 开始,这个指令已经被标记为已废弃,推荐使用
LABEL
指令来替代。
例:
MAINTAINER John Doe <john.doe@example.com>
如:
LABEL maintainer="John Doe <john.doe@example.com>"
LABEL
指令可以用于添加更多的元数据到镜像中,比如版本号、构建日期等等。
这些指令在 Dockerfile 中按照从上到下的顺序执行。每个指令都会在镜像上创建一个新的层,然后提交。
案例:
# 基于官方的 JDK 镜像
FROM openjdk:8-jdk
# 设置环境变量
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
# 安装 MySQL
RUN apt-get update && apt-get install -y mysql-server
# 安装 Tomcat
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
RUN curl -O https://downloads.apache.org/tomcat/tomcat-8/v8.5.61/bin/apache-tomcat-8.5.61.tar.gz \
&& tar -xvf apache-tomcat-8.5.61.tar.gz \
&& rm apache-tomcat-8.5.61.tar.gz
# 暴露端口
EXPOSE 8080
# 启动 Tomcat
CMD ["catalina.sh", "run"]
这个 Dockerfile 会创建一个包含 JDK、MySQL 和 Tomcat 的 Docker 镜像。在构建镜像时,它会先从 Docker Hub 下载官方的 JDK 镜像作为基础镜像,然后安装 MySQL,接着下载并安装 Tomcat,最后设置启动命令为启动 Tomcat。
请注意,这只是一个基础示例,实际使用时可能需要根据具体需求进行修改和优化。例如,可能需要添加更多的环境变量,或者调整安装命令以适应特定的应用需求。
2. 常用命令
以下是您提到的 Dockerfile 指令的详细解释:
-
RUN:用于执行后面跟着的命令行命令。有两种格式:
RUN <command>
(shell 格式)和RUN ["executable", "param1", "param2"]
(exec 格式)。 -
ENV:用于设置环境变量。这些变量以
<key>=<value>
的形式存在,可以在容器中被脚本或程序调用。 -
COPY:将来自 Dockerfile 所在目录的文件或目录复制到容器中的一个新位置。
-
ADD:与 COP