如何创建生产 Docker 镜像
在上一篇文章中,我解释了如何使用创建虚拟开发工作区
Docker
。因此,我认为如果我使用 来呈现一个略有不同的示例会更好Docker
。在本文中,我将向您展示如何创建一个Docker
可供部署的生产容器。为了使其更有趣,我将使用JakartaEE
、 和MySQL
应用程序。因此,您将学习如何使用单个 构建多个构建阶段的Docker
镜像Dockerfile
。简而言之,本文旨在教您并鼓励您更多地了解Docker
,因为它是一项非常有趣的技术。也许在接下来的文章中,我将使用Docker composer
或做同样的事情Docker swarm
(如果您对此类文章感兴趣,请告诉我)。
我们想要实现什么目标?
首先,我们需要一个可以立即使用的JakartaEE
应用程序。幸运的是,我已经准备好了一个应用程序,您可以在此Github
存储库中找到。该JakartaEE
应用程序已在 Tomcat 上测试过,并且需要MySQL
数据库。因此,我们只需创建一个简单的应用程序Dockerfile
即可完成工作。最后一个应用程序应该:
- 构建项目。最终,我们将获得一个可运行的
.war
文件。 .war
为我们的Tomcat
应用服务器设置生成的文件。- 将 tomcat 目录复制到新
Docker
映像中,其中我们的MySQL
数据库已准备好使用。 - 运行应用程序!
话虽如此,我们的单机 开发工作Dockerfile
将分为两部分。第一部分,我们将完成上面描述的第一步和第二步(我们称之为Tomcat
Side);第二部分,我们将完成第三步(我们称之为MySQL
Side)。最后,我们将测试我们的应用程序。
Tomcat Side
:构建应用程序并将其部署到Tomcat
应用服务器
本文使用的应用程序依赖于maven
构建工具。以下命令可生成该.war
文件:
$ mvn package
首先,您可以使用官方页面上的Tomcat
合适Docker
镜像Tomcat
(基于所使用的Linux
发行版和版本) 。在本例中,我使用了,并将其命名为。当然,我们将项目文件复制到镜像中并安装以构建项目。构建项目后,只需将生成的文件复制到目录即可轻松将应用程序部署到 。您最终可以使用以下命令执行此操作:JDK
DockerHub
tomcat:8.5.63-jdk11
TomcatSide
Docker
maven
Tomcat
.war
tomcat/webapps
cp -rf ./target/Cabinet_Medical-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps
因此,该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
MySQL Side
:设置数据库并运行应用程序
你可能注意到了,本文的前一部分还不够。我们需要数据库!第一部分可以作为如何在 中使用 tomcat 的通用示例Docker
,而这一部分同样是一个通用示例,你可以从中获得灵感,准备MySQL
数据库并Tomcat
在 中运行服务器Docker
。
因此,为了创建镜像,我使用了官方容器中Docker
准备好的MySQL
服务器镜像。接下来,我设置了 root 用户密码、数据库名称和数据库模式。之后,我将目录从镜像复制到实际镜像。以下步骤仅用于运行服务器。它包括安装适当的版本并准备好应用服务器,以便进行最后一步,即构建生产镜像。Docker
MySQL
DockerHub
/usr/local/tomcat
tomcatside
Tomcat
Java
Tomcat
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"]
这是最终版本Dockerfile
:
最后一步
恭喜,您创建了您的Dockerfile
只需要以下命令来构建Docker
图像:
$ docker build --pull --rm -f "Dockerfile" -t cabinetmedical:latest "."
此外,您还需要此命令来运行您的容器:
$ docker run --name="temp"-it -p 3306:3306/tcp -p 33060:33060/tcp -p 8080:8080/tcp cabinetmedical:latest
并加入集装箱外壳终端:
$ docker exec -it temp
最后:
现在你已经完成了Dockerfile
,可以构建镜像了。你可能会在终端上看到类似这样的内容:
结论
本文是一个简单的示例,我使用 Docker 多阶段构建技术创建了一个Dockerfile
生产Docker
镜像。我之所以对这篇文章感到兴奋,是因为学习之后,Docker
我们在项目中很少使用它了。现在,我们只需要Dockerhub
在需要数据库镜像或任何类型的镜像时才使用它。请不要误会,我对此没有任何异议,这对我来说完全正常。但是,您可以使用 Docker 做出更精彩的事情。因此,我强烈建议您在自己的项目中尝试实现与本文类似的功能。希望您喜欢我的文章,谢谢!