如何创建生产 Docker 镜像

2025-06-04

如何创建生产 Docker 镜像

在上一篇文章中,我解释了如何使用创建虚拟开发工作区Docker。因此,我认为如果我使用 来呈现一个略有不同的示例会更好Docker。在本文中,我将向您展示如何创建一个Docker可供部署的生产容器。为了使其更有趣,我将使用JakartaEE、 和MySQL应用程序。因此,您将学习如何使用单个 构建多个构建阶段的Docker镜像Dockerfile。简而言之,本文旨在教您并鼓励您更多地了解Docker,因为它是一项非常有趣的技术。也许在接下来的文章中,我将使用Docker composer或做同样的事情Docker swarm(如果您对此类文章感兴趣,请告诉我)。

我们想要实现什么目标?

首先,我们需要一个可以立即使用的JakartaEE应用程序。幸运的是,我已经准备好了一个应用程序,您可以在此Github 存储库中找到。该JakartaEE应用程序已在 Tomcat 上测试过,并且需要MySQL数据库。因此,我们只需创建一个简单的应用程序Dockerfile即可完成工作。最后一个应用程序应该:

  1. 构建项目。最终,我们将获得一个可运行的.war文件。
  2. .war为我们的Tomcat应用服务器设置生成的文件。
  3. 将 tomcat 目录复制到新Docker映像中,其中我们的MySQL数据库已准备好使用。
  4. 运行应用程序!

话虽如此,我们的单机 开发工作Dockerfile将分为两部分。第一部分,我们将完成上面描述的第一步和第二步(我们称之为TomcatSide);第二部分,我们将完成第三步(我们称之为MySQLSide)。最后,我们将测试我们的应用程序。

替代文本

Tomcat Side:构建应用程序并将其部署到Tomcat应用服务器

本文使用的应用程序依赖于maven构建工具。以下命令可生成该.war文件:

$ mvn package
Enter fullscreen mode Exit fullscreen mode

首先,您可以使用官方页面上的Tomcat合适Docker镜像Tomcat(基于所使用的Linux发行版和版本) 。在本例中,我使用了,并将其命名为。当然,我们将项目文件复制到镜像中并安装以构建项目。构建项目后,只需将生成的文件复制到目录即可轻松将应用程序部署到 。您最终可以使用以下命令执行此操作:JDKDockerHubtomcat:8.5.63-jdk11TomcatSideDockermavenTomcat.wartomcat/webapps

cp -rf ./target/Cabinet_Medical-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps
Enter fullscreen mode Exit fullscreen mode

因此,该Tomcat边将是:

# Create Docker image based on the tomcat:8.5.63-jdk11 base image and name it TomcatSide. 
FROM tomcat:8.5.63-jdk11 AS tomcatside

# Set up work directory
WORKDIR /Cabiner_Medical

# Copy the entire project to your Docker image
COPY . .

# Install maven
RUN apt-get update && \
    apt install maven -y && \
    java -version && \
    mvn -version
# Build the project
RUN mvn package

# Deploy the .war file to Tomcat server
RUN cp -rf ./target/Cabinet_Medical-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps
Enter fullscreen mode Exit fullscreen mode

MySQL Side:设置数据库并运行应用程序

你可能注意到了,本文的前一部分还不够。我们需要数据库!第一部分可以作为如何在 中使用 tomcat 的通用示例Docker,而这一部分同样是一个通用示例,你可以从中获得灵感,准备MySQL数据库并Tomcat在 中运行服务器Docker

因此,为了创建镜像,我使用了官方容器中Docker准备好的MySQL服务器镜像。接下来,我设置了 root 用户密码、数据库名称和数据库模式。之后,我将目录镜像复制到实际镜像。以下步骤仅用于运行服务器。它包括安装适当的版本并准备好应用服务器,以便进行最后一步,即构建生产镜像。DockerMySQL DockerHub/usr/local/tomcattomcatsideTomcatJavaTomcat

FROM mysql:latest

# Set up the password and the database name
ENV MYSQL_ROOT_PASSWORD=Strong@Independent1Password
ENV MYSQL_DATABASE=bd_cabinetmedicale

# Set up the database schema. The following line will result in having a database with tables and content
# To avoid any problems you need to make sure that your SQL code works fine.
ADD ./resources/dataBases.sql /docker-entrypoint-initdb.d

WORKDIR /usr/local/tomcat

# Copy the tomcat directory from tomcateside to this image
COPY --from=tomcatside /usr/local/tomcat /usr/local/tomcat

# Set up tomcat, and JDK
WORKDIR /usr/local/tomcat/webapps

ENV CATALINA_BASE=/usr/local/tomcat
ENV CATALINA_HOME=/usr/local/tomcat
ENV CATALINA_TMPDIR=usr/local/tomcat/temp
ENV JRE_HOME=/usr
ENV CLASSPATH=/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

RUN apt-get update && \
    apt-get install openjdk-11-jdk -y && \
    apt-get update && \
    apt-get install ca-certificates-java && \
    apt-get clean && \
    update-ca-certificates -f && \
    java -version

ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk

RUN export JAVA_HOME && \
    export CATALINA_BASE && \
    export CATALINA_HOME && \
    export CATALINA_TMPDIR && \
    export JRE_HOME && \
    export CLASSPATH

# WORKDIR /var/run

# RUN cp mysqld/ mysqld.bc -rf
# RUN chown mysql:mysql mysqld.bc/

EXPOSE 8080

# Run the application
WORKDIR /usr/local/tomcat/bin
RUN chmod +x catalina.sh

CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
Enter fullscreen mode Exit fullscreen mode

这是最终版本Dockerfile

替代文本

最后一步

恭喜,您创建了您的Dockerfile只需要以下命令来构建Docker图像:

$ docker build --pull --rm -f "Dockerfile" -t cabinetmedical:latest "."
Enter fullscreen mode Exit fullscreen mode

此外,您还需要此命令来运行您的容器:

$ docker run --name="temp"-it  -p 3306:3306/tcp -p 33060:33060/tcp -p 8080:8080/tcp cabinetmedical:latest
Enter fullscreen mode Exit fullscreen mode

并加入集装箱外壳终端:

$ docker exec -it temp
Enter fullscreen mode Exit fullscreen mode

最后:

替代文本

现在你已经完成了Dockerfile,可以构建镜像了。你可能会在终端上看到类似这样的内容:
替代文本

结论

本文是一个简单的示例,我使用 Docker 多阶段构建技术创建了一个Dockerfile生产Docker镜像。我之所以对这篇文章感到兴奋,是因为学习之后,Docker我们在项目中很少使用它了。现在,我们只需要Dockerhub在需要数据库镜像或任何类型的镜像时才使用它。请不要误会,我对此没有任何异议,这对我来说完全正常。但是,您可以使用 Docker 做出更精彩的事情。因此,我强烈建议您在自己的项目中尝试实现与本文类似的功能。希望您喜欢我的文章,谢谢!

文章来源:https://dev.to/abdorah/how-to-create-production-docker-image-ready-for-deployment-4bbe
PREV
React 中表单的完整指南:如果表单无效,则禁用提交按钮
NEXT
如何构建虚拟工作空间