wuqingvika 发表于 2023-5-16 10:12

docker部署java 环境建议

就是springboot项目 application-dev/prod有两个环境
所以在打镜像时 就指定不同环境还是打镜像时不用指定的
就是分不清在启动容器时 指定 呢 因为我需要在一个宿主机启动两个环境(测试和正式)不知道常规做法
上次在打镜像时不指定开发环境会报错。所以想问问大佬们一般你们是怎么操作的

jidesheng6 发表于 2023-5-16 10:31

我们公司没有上docker,但是我自己私底下尝试过

你这个描述有点没看懂,我就简单说下我自己的理解,针对你说的dev/prod两种共存的方法吧

只要你们的代码是一样的,只打包一个就可以了;一般数据库最好还是不在docker搞,我们公司就mysql+redis+nginx这三件套;

把redis、nginx的镜像打好以后,主要启动的就是靠你编写docker-compose的yml文件来进行区分了,常规的docker直接启动我用的不是太多

假设我们镜像都打包好了,然后假设一下下面的是dev环境的yml,另一个prod环境的yml用这个改一改,把两个启动起来,只要端口不冲突就可以了

```yml
version: "3.5" #版本号

services: #定义服务
wscp-nginx: #定义第一个nginx服务名称
image: wscp-nginx #定义镜像
networks: #设置网络
   - wscp-network #加入wscp-network进行互联
ports:#映射容器内部端口
   - "8080:80"
container_name: wscp-nginx#定义容器名称
depends_on:#容器需要在wscp-back启动后再进行启动
   - wscp-back

wscp-redis:#redis服务
image: wscp-redis#使用redis镜像
networks:#加入wscp-network网络
   - wscp-network
container_name: wscp-redis#设置容器名称

wscp-back:#主要的java程序服务
image: wscp-back#本地java程序镜像
container_name: wscp-back#容器名称
volumes:#挂载容器目录到本地目录,左边本地;右边容器
   - "./download_temp:/wscp_project/back_end/download_temp"
   - "./upload_formal:/wscp_project/back_end/upload_formal"
networks:#加入wscp-network网络
   - wscp-network

networks:#添加一个新网络
wscp-network:#网络名称为wscp-network
driver: bridge#使用桥接方式
```

但是我也不确定是不是我理解的这个意思,如果理解错了的话,实在不好意思

15593600257 发表于 2023-5-16 10:40

我们的做法是 通过spring.profiles.acitve来指定哪个环境,在启动的时候指定

pjy612 发表于 2023-5-16 10:44

{:301_1008:}
这个就涉及到 你的项目 怎么搭的了。
如果你有配置中心和一些 对应的环境注解
那么 打一个镜像 然后 启动时 根据入参 -Dspring.profiles.active 啥的来的区分其实就行了。。。
你要两个一起跑 或者 多个一起跑 端口 或者 启动名区分开来就行了吧?

lfglfg11 发表于 2023-5-16 12:27

我一般都用宝塔部署

saszznz 发表于 2023-5-16 13:55

dph5199278 发表于 2023-5-16 15:01

打一个通用镜像就行,在启动时分别指定就可以了
可以给application里面配置
spring.profiles.active=dev
这样不指定开发环境时,自动为dev环境

改prop环境也只要在docker环境变量上修改
SPRING_PROFILES_ACTIVE=prod

Vvvvvoid 发表于 2023-5-16 15:20

profiles:
    active: ${profile.name}


可以通过 环境变量 , java 启动参数 来指定 profile.name

sbwfnhn 发表于 2023-5-16 15:36

本帖最后由 sbwfnhn 于 2023-5-16 15:41 编辑

有两种方式,一种是通过mvn clean package -Dmaven.test.skip=true -P test/prod的方式,打包后会把BOOT-INF\classes\application.yml 中的profiles: active: test/prod替换相应的,直接启动就可以了

第二种就是启动的时候加参数
java -server -jar -Xms512m -Xmx1024m -Dspring.profiles.active=test -Dserver.port=8888




另外dockerfile,下面是我写的,给你个参考,下面这个dockerfile,k8s与docker通用,可以传参,通用模板
FROM java:8


ARG jar_file_name
ARG port
ARG java_other_options
ARG JavaOptionDloggingLevelRoot
ARG java_jvm_app_name

ENV jar_file_name=${jar_file_name}
ENV port=${port}
#java_options没有放run中--env中传的原因,是因为要改create与update,直接打包时更方便
ENV JavaOptionDloggingLevelRoot=${JavaOptionDloggingLevelRoot}
ENV java_other_options=${java_other_options}
ENV java_jvm_app_name=${java_jvm_app_name}

ENV LC_ALL en_US.UTF-8

#ADD admin2.jar admin2.jar
#ADD entrypoint.sh entrypoint.sh
ADD ${jar_file_name} ${jar_file_name}
ADD Determine_whether_the_nas_system_is_successful.sh Determine_whether_the_nas_system_is_successful.sh

RUN bash -c 'chmod 755 /Determine_whether_the_nas_system_is_successful.sh'
#RUN \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime


#EXPOSE 8080-8081/tcp
#EXPOSE 80/tcp
#EXPOSE 8089/tcp
EXPOSE ${port}/tcp

#ENTRYPOINT ["/bin/bash", "-c","java -server -jar -Dlogging.level.root=DEBUG /admin2.jar"]
#ENTRYPOINT ["/bin/bash", "-c","java -server -jar -Xms1024m -Xmx2048m -Dlogging.level.root=INFO -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap /admin2.jar"]
#ENTRYPOINT ["/bin/bash", "-c","java -server -jar -Xms512m -Xmx1024m -Dlogging.level.root=${JavaOptionDloggingLevelRoot} -Dapp.name=${java_jvm_app_name} ${java_other_options} -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemor
yLimitForHeap /${jar_file_name}"]
#在java8u131+及java9,加上-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap才能感知docker的memory limit,这样java程序就不会被OOM了,不用加-Xms1024m -Xmx2048m来限制内存
ENTRYPOINT ["/bin/bash", "-c","/Determine_whether_the_nas_system_is_successful.sh && java -server -jar -Xms512m -Xmx1024m -Dlogging.level.root=${JavaOptionDloggingLevelRoot} -Dapp.name=${java_jvm_app_name} ${java_other_options}
/${jar_file_name}"]
页: [1]
查看完整版本: docker部署java 环境建议