docker构建镜像并运行容器详细过程
1,编写dockerfile
FROM openjdk:8-jre-slimLABEL maintainer="111@sina.com"RUN mkdir -p /blade/visualWORKDIR /blade/visualEXPOSE 9876COPY ./target/blade-visual.jar ./app.jarENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]CMD ["--spring.profiles.active=dev"]
1. **`FROM openjdk:8-jre-slim`** 指定基础镜像:使用OpenJDK 8的JRE(Java运行时环境)精简版(slim)。 - `openjdk:8` 表示基于Java 8版本的OpenJDK - `jre` 表示仅包含运行时环境(而非完整的JDK开发环境),体积更小 - `slim` 是精简版镜像,去除了不必要的工具,进一步减小镜像体积
2. **`LABEL maintainer="111@sina.com"`** 添加元数据标签:声明镜像的维护者邮箱,方便追溯镜像的维护者。
3. **`RUN mkdir -p /blade/visual`** 在镜像构建阶段执行命令:创建目录 `/blade/visual`。 - `mkdir -p` 确保父目录不存在时也能递归创建(避免报错)
4. **`WORKDIR /blade/visual`** 设置工作目录:后续的命令(如COPY、ENTRYPOINT等)都会在 `/blade/visual` 目录下执行(相当于“cd 到该目录”)。
5. **`EXPOSE 9876`** 声明容器运行时暴露的端口:告知Docker该容器会使用9876端口对外提供服务(仅为声明,实际需通过`-p`参数映射到宿主机才能访问)。
6. **`COPY ./target/blade-visual.jar ./app.jar`** 复制文件到镜像:将本地(构建上下文)`target`目录下的`blade-visual.jar`文件,复制到镜像的当前工作目录(`/blade/visual`),并命名为`app.jar`(简化后续命令)。
7. **`ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]`** 定义容器启动时执行的固定命令:启动Java应用。 - `java -jar app.jar` 是运行jar包的标准命令 - `-Djava.security.egd=file:/dev/./urandom` 是优化参数:加快Java应用(尤其是使用Tomcat等组件时)的启动速度,避免因随机数生成阻塞(默认随机数生成器可能较慢)
8. **`CMD ["--spring.profiles.active=dev"]`** 定义容器启动时的默认参数:为`ENTRYPOINT`的命令提供默认参数。 - 这里指定Spring应用的激活环境为`dev`(即使用`application-dev.properties/yaml`配置文件) - 若运行容器时手动指定参数(如`docker run 镜像名 --spring.profiles.active=prod`),会覆盖此默认参数
**总结**:这个Dockerfile的作用是构建一个可运行`blade-visual` Java应用的镜像,基于OpenJDK 8环境,默认使用`dev`环境配置,暴露9876端口,启动时运行`app.jar`。
2,构建镜像
docker build -t visual:dev .
3,查看镜像是否构建成功
docker images
4,构建网络
docker network create my-network
5,运行容器
docker run -d \
-p 9876:9001 \
--network my-network \
--name visual-dev \
-e "SPRING_PROFILES_ACTIVE=dev" \
visual:dev
9876
是宿主机的端口(即你当前运行 Docker 的机器的端口);9001
是容器内部的端口(即容器中运行的应用程序实际监听的端口,比如这里的visual:dev
镜像可能在容器内用 9001 端口提供服务)。
6,docker-compose文件
name: visual-dev
services:visual-1:build:context: .dockerfile_inline: |FROM openjdk:8-jre-alpineLABEL maintainer="chendl@ivdc.chinacdc.cn"RUN mkdir -p /blade/visualWORKDIR /blade/visualEXPOSE 9000ADD ./target/blade-visual.jar ./app.jarENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]CMD ["--spring.profiles.active=test"]image: blade-visual:dev1 container_name: visual-1-dev networks:- tmports:- "9000:9000"visual-2:build:context: .dockerfile_inline: |FROM openjdk:8-jre-alpineLABEL maintainer="chendl@ivdc.chinacdc.cn"RUN mkdir -p /blade/visualWORKDIR /blade/visualEXPOSE 9000ADD ./target/blade-visual.jar ./app.jarENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]CMD ["--spring.profiles.active=test"]image: blade-visual:dev2 container_name: visual-2-dev networks:- tmports:- "9001:9000"networks:tm:driver: bridge
7,构建命令
docker-compose build
8,运行
docker-compose up -d