前期已经在idea中编译打包好了jar包,然后部署在xx云服务器上,xx云服务器是ubuntu系统,装了openjdk环境,然后执行
java -jar xxxxx.jar &
nginx上再做端口映射或者反向代理,不详细说了。
最近,云服务器到期,换了一台更商业化的,只有docker环境,不能安装jdk,此为背景
第一种尝试,docker部署ubuntu或者centos
这是顺其自然的想法,既然只能docker,那就docker装个ubuntu/centos,不就行了
sudo docker run --name ubuntu -i -t -d -p 10022:22 homebrew/ubuntu20.04
然后就切换到docker环境中安装部署java环境,开ssh
docker exec -it ubuntu /bin/bash
sudo apt-get update
sudo apt install openssh-server vim openjdk-8-jdk
还包括把jar包拷贝到docker内,创建rc.local自运行脚本等,都是按部就班那套,不详细说了,一切都完成后,发现问题了,用systemctl enable rc-local.service,docker镜像重启后,jar包没有运行,一步步查发现是rc.local中的脚本没有运行,折腾了一天,搞不定,换个思路
既然rc.local不行,那在宿主机里执行容器的命令总行吧
docker exec -it ubuntu /bin/bash -c 'java -jar /home/xxxx.jar &'
实践证明不可行,但是,只要把命令最后的&去掉,就可以了,百思不得其解
直到,发现了docker容器重启后,ssh端口也没了,排查发现是sshd服务没有起来,大概想到什么原因了,看到这篇文章后,证实了想法
rabbitmq - Is there a way to set the run level on the docker? - Stack Overflow
csdn上,还有个哥们也碰到了类似的问题,文章说可以把命令加入entrypoint中执行,我没有尝试
docker镜像中安装rabbitmq报错_invoke-rc.d: could not determine current runlevel-CSDN博客
docker镜像是静态的,后安装的服务,如果以start service方式运行,会随着命令的结束而终止容器,不会保存状态。
第二种尝试,docker部署spingbot环境
上述过程失败了,回想了整个过程,我其实是想找个java运行环境,不得不把操作系统引入尽量,换个思路,找个单纯的java运行环境即可,过程如下:
1. 新建一个目录,里面只放待部署的jar包
2. 新建Dockerfile,内容如下:
FROM openjdk:8
EXPOSE 38000
VOLUME /tmp
ADD xxxxxxx-1.0.1.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
其中端口号和xxx.jar,根据情况修改
3. docker pull openjdk:8
4. docker build -t app:1.0 .
5. docker run --name container_name --restart=always -itd -p 38000:38000 app:1.0
部署结束,打开浏览器输入
http://servierip:38000
至此过程记录结束