Dockerfile JAVA微服务镜像 构建Jar

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

ARGENV 的效果一样,都是设置环境变量。不同的是,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 :分配一个伪终端

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值