Java 微服务只需要有JDK的环境就行了,直接执行java -jar就行了,就直接可以将java跑起来了
首先,你需要在Docker Hub上找到一个Java的基础镜像,比如官方提供的 openjdk:11 镜像。
这个是将微服务的jar包直接打进去(只需要有个jdk环境就行),java:8-jdk-alpine还需要测试,因为环境库可能和centos不一样。
1. 安装Docker:首先需要在你的机器上安装Docker。你可以根据你的操作系统类型,前往Docker官方网站下载并安装Docker。
2. 创建Dockerfile:在你的项目根目录下创建一个名为Dockerfile的文件。Dockerfile是一个文本文件,用于定义Docker镜像的构建过程。
3. 编写Dockerfile:在Dockerfile中,你需要指定一个基础镜像以及一些额外的配置,以下是一个基本的Dockerfile示例:
[root@jenkins dockerfile]# cat Dockerfile
FROM openjdk:8-jdk-alpine
LABEL maintainer lucas
ENV TZ=Asia/Shanghai
ENV JAVA_OPTS="-Xms512m -Xmx1024m"
COPY demo.jar /
WORKDIR /
EXPOSE 8000
ENTRYPOINT ["/bin/sh","-c","java $JAVA_OPTS -jar /demo.jar --server.port=8000"]
[root@jenkins dockerfile]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c100f208b70f java-demo "/bin/sh -c 'java $J…" 51 seconds ago Up 50 seconds 0.0.0.0:8888->8000/tcp, :::8888->8000/tcp java
[root@jenkins dockerfile]# docker inspect c100f208b70f
[
{
"Id": "c100f208b70f8febdd921daf3e55b24491486a7474b7b3302ca45ef0b89ff6f2",
"Created": "2024-04-17T07:12:39.945568996Z",
"Path": "/bin/sh",
"Args": [
"-c",
"java $JAVA_OPTS -jar /demo.jar --server.port=8000"
],
[root@jenkins dockerfile]# ps -ef | grep java
root 16988 16966 4 15:12 ? 00:00:05 java -Xms512m -Xmx1024m -jar /demo.jar --server.port=8000
root 17057 8398 0 15:14 pts/1 00:00:00 grep --color=auto java
在这个示例中,这个Dockerfile使用了一个名为openjdk的基础镜像,该镜像中包含了Java开发环境,该镜像已经包含了Java运行时和JDK。WORKDIR 指令设置了容器内的工作目录为 /。
COPY 指令将你的应用程序的JAR文件(这里假设是 your-application.jar)复制到容器中的 / 目录下。你需要将 demo.jar 替换为你自己的应用程序JAR文件的名称。
ENTRYPOINT 指令定义了容器启动时要执行的命令,这里使用 java -jar 来运行你的应用程序JAR文件。
如果你的应用程序需要监听某个端口,你可以使用 EXPOSE 指令来暴露该端口。在上面的示例中,端口号被注释掉了,你可以取消注释并替换为你自己的端口号。
最后,我们使用ENTRYPOINT指令定义容器启动后要执行的命令。在这个例子中,我们将以${JAVA_OPTS}
和${ARGS}
为参数启动Java应用程序。
# NOTE: This is not a production ready Dockerfile.
# Utilize this only for development purposes
# Use a container image that has both Gradle and the JDK
FROM gradle:5.0.0-jdk8-alpine
# Switch to the `gradle` user defined by our container image
USER gradle
# Copy over the project directory into the container
COPY --chown=gradle:gradle . /java-and-docker
# Set our working directory to our project directory that we set above
WORKDIR /java-and-docker
# Run the build
RUN gradle build
# Run the jar file
# Since we are using JDK8 we set some additional flags to be more container aware
CMD ["java", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-jar", "build/libs/java-and-docker-1.0.jar"]
Dockerfile里面一些参数的解释
ENV:设置环境内环境变量
ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45
使用ENV命令设置Java环境变量。例如,我们可以设置JAVA_HOME和PATH环境变量
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
ENV PATH $PATH:$JAVA_HOME/bin
ARG
和ENV
的效果一样,都是设置环境变量。不同的是,ARG
所设置是构建时
的环境变量,在将来容器运行时
是不会存在这些环境变量的。⚠️ 注意,尽量不要在
ARG
放置敏感信息,因为docker history
可以看到构建的过程ARG只在Dockerfile中生效,且在docker build阶段生效,构建好的镜像内不存在此环境变量。意味着在容器启动后ARG定义的变量已经无效,如果想让其生效,需要将其赋值给ENV。
Docker中的ENV ENV指令用于设置环境变量,在容器运行时可以被应用程序使用。环境变量是一种在操作系统中定义的变量,用来存储一些配置信息或者运行时的参数。在Dockerfile中使用ENV指令可以为容器设置一些必要的环境变量,使得我们的应用程序可以根据这些变量来灵活地配置自身的运行环境。
下面是一个简单的Dockerfile示例,其中定义了一个环境变量VERSION为1.0。在运行这个镜像时,我们的应用程序可以通过读取这个环境变量来获取版本信息。
```markdown ```dockerfile
FROM openjdk:11-jre
ENV VERSION=1.0
COPY MyApp.jar /app
WORKDIR /app
ENTRYPOINT ["java", "-jar", "MyApp.jar"]
EXPOSE:声明容器运行的服务端口
EXPOSE 80 443
EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
在Dockerfile中写入这样的声明有好处:帮助镜像使用者理解这个镜像服务的端口,以方便配置映射。
运行容器
完成镜像的构建后,我们可以使用docker run命令来运行容器:
docker run -d -p 16000:16000 --name myjava java:latest
-p 主机端口:容器端口 (常用)
- -d参数表示以后台方式运行容器
- -p 16000:16000参数表示将容器的16000端口映射到主机的16000端口
- –name myjava 参数表示为容器指定一个名字
docker run -it --rm my-java-app
这个命令会创建一个新的容器,并在其中运行my-java-app镜像。"-it"参数用于创建一个交互式的终端,"--rm"参数在容器退出后自动删除容器。
这样,你就成功地使用Docker搭建了Java环境。你可以根据自己的需求对Dockerfile进行修改,例如添加依赖项、配置环境变量等。
[root@jenkins dockerfile]# docker exec -it 34d9ff2cdd9f /bin/sh
docker exec :在运行的容器中执行命令
语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
-
-d :分离模式: 在后台运行
-
-i :即使没有附加也保持STDIN 打开
-
-t :分配一个伪终端