Docker如何创建一个Jar服务容器
作者:çüιẋıασȷıαฅ
Docker创建一个Jar服务容器
- 将jar包构建成为docker镜像
- 启动镜像生成容器
- 将镜像上传至镜像仓库
1. 构建Docker镜像
创建一个Dockerfile文件内容如下:
// 指定镜像源 FROM java:8 MAINTAINER cuixiaojian // 将文件复制到容器中,COPY [宿主机路径] [容器内路径] COPY config-1.0.0.jar /usr/local/config-1.0.0.jar // 开放端口 EXPOSE 26999 // 需要开放多个端口则多一条expose // EXPOSE 27000 // 生成容器后,容器启动时执行的命令 ENTRYPOINT ["java -Xms256M -Xmx256M -XX:MaxMetaspaceSize=256M", "-jar", "/usr/local/config-1.0.0.jar -server -Dfile.encoding=UTF-8"]
在Dockerfile所在目录执行以下命令
build命令后的 “.” 符号代表为当前目录,会将本目录当做为docker build上下文,copy或add命令在执行时候,文件需要在上下文中可以找到,所以需要复制进容器的文件也需要和dockerfile在同一目录
此命令需要在dockerfile所在目录执行
docker build -t [自定义镜像名]:[版本号] -f Dockerfile .
构建完成后查看镜像
docker images
2. 启动镜像生成容器
执行命令:
docker run --name [自定义容器名] -it -p 26999:26999 [自定义镜像名]:[版本号] /bin/bash
指定容器后台运行(增加d参数表示后台运行):
docker run --name [自定义容器名] -itd -p 26999:26999 [自定义镜像名]:[版本号] /bin/bash
3. 上传镜像至远程仓库
标记本地镜像,将其归入某一仓库
docker tag [镜像ID] [远程文件路径 + 镜像名]:[版本号]
推送镜像至远程仓库
docker push [远程文件路径 + 镜像名]:[版本号]
Docker Jar项目启动慢
问题描述
jar包项目,启动后外面不能访问,要过很长时间才可以访问,日志也没有报错。
开始了 漫长的 填坑之路。
lsof -i:端口(方向不对)
第一张图带ipv4是创建容器指定了端口,并且没有配置 --network host参数
第二张图不带ipv4是创建容器配置 --network=host 没有指定端口(这种方式不能指定端口)
结果还是没有解决问题,一直以为是因为使用 --network=host 方式没有ipv4绑定呢,这里走了很多弯路,没有解决,但是为什么没有ipv4也不知道为什么。
下面说一说我对docker network的理解,安装好docker后自动创建下面三种。
1、bridge:桥接网络 默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了
2、none:无指定网络 使用 --network=none,docker 容器就不会分配局域网的IP。
3、host: 主机网络 使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。 例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。这时配置 -p 端口参数是无效的
注:--network=host 和 --net=hos 好像是一样的,说下我的简单理解,如果所有docker 容器都在一台机器上,使用bridge或host都可以,如果是分布在不面的物理机上,必须选择host,如果不指定host那么两台物理机上的容器不能相互访问。
docker exec 不能进入容器
出现这样的问题是由于镜像系统不一,使用错误shell解释器导致,可尝试以下其中一种方案。
docker exec -it container-test /bin/bash docker exec -it container-test /bin/sh docker exec -it container-test /bin/csh
正确的解决方法
方法一:
进入容器的 JAVA安装目录 /jre/lib/security/
vi java.security 修改这个文件
找到 securerandom.source=file:/dev/random 修改为 securerandom.source=file:/dev/./urandom
然后重启容器,发现就正常了
方法二:
-Djava.security.egd=file:/dev/./urandom 加入JVM的这个启动参数
也是可以的,这个主要是使用tomcat 随机数引起的,用jetty或undertow在不配置此参数时不知道会不会有这种情况,也不知道为什么会存在这么大的一个问题。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。