背景:
- 基于springboot的java项目
- 使用yml文件配置日志 或 logback配置日志文件(日志不用说,肯定需要持久化的,我们不希望项目报错然后容器停止了,什么问题都不知道)
- 连接mysql数据库(连接上一篇文章.介绍的mysql容器)
- 项目会输出txt文件(这些文件需要持久化)
重点:因为数据库地址或者我们请求外部动态变化的容器地址,肯定是需要配置文件去配置的,这样可以方便修改,不能和项目打包到一起,不然地址一变就需要重新打包,特麻烦
前言: 配置持久化日志和持久保存txt文件肯定是需要主机和容器共享同一个目录才行的,上一篇文章.有介绍到用-v
参数指定容器的持久化的挂载/共享目录
,可以保证数据不会因为容器停止而丢失,而且可以共享宿主机上的文件。废话不多说,直接开撸
- 在java项目中指定日志在主机上的绝对路径,两种方式:
- yml
- logback
-
这里在
java
项目中指定输出的txt文件持久化,直接配置宿主机路径: -
配置数据库地址或外部请求地址,这里我直接写的本地,到后面修改(后期容器已经运行后需要修改配置文件,下面会说这个问题)
-
配置完成将项目打包成可执行
jar
包 配置好pom
文件使用
IDEA
的maven
工具打包 -
配置
Dockerfile
文件
FROM java:8
EXPOSE 8900
#VOLUME /tmp
ADD smart.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.config.location=/data/java/config/application-dev.yml"]
- FROM java:8:使用
jdk8
作为基础镜像 - EXPOSE 8900:暴露容器的
8900
端口 - VOLUME /tmp:创建一个容器的挂载目录。这里我注释了,没有指定,会在后面的运行命令中指定容器的挂载点
- ADD smart.jar app.jar:将复制指定的
smart.jar
为容器中的app.jar
,相当于拷贝到容器中取了个别名 - RUN bash -c ‘touch /app.jar’: 创建一个新的容器并在新的容器中运行命令
- ENTRYPOINT[]:相当于在容器中用
cmd
命令执行jar
包
大家不懂Ddockerfile的命令可以参考这个,下载书籍:https://blog.csdn.net/qq_25112523/article/details/99192334.
-
将
application-dev.yml
文件拷贝到上面第5步对应的目录(/data/java/config
)下,下面的第9步会挂载此目录,方便我们修改这个文件,然后重启容器即可重新加载该文件 -
将
Dockerfile
文件和可执行jar
包拷贝到linux主机上的同一目录下
在同一个目录下使用命令:(注意最后一个".",表示当前目录)
docker build -t java/smart:2019 .
- -t java/smart:2019:表示构建成
java/smart
的镜像名称,tags
为2019
如果提示错误:“docker build” requires exactly 1 argument.
是因为少了最后面的那个点 “.”
- 查看镜像
java/smart
是否已经创建好,命令:
docker images
可以看到镜像已经存在
- 启动容器,命令:(启动后会出现一串字符串)
docker run -dit \
--name smart \
-p 8900:8900 \
-v /data/java/server:/data/java/server \
-v /data/java/config:/data/java/config \
-v /data/java/logs:/data/java/logs \
-v /data/java/txt:/data/java/txt \
java/smart:2019
- -dit:同时使用
-d,-i,-t
命令 - –name java/smart:容器别名,我们还是将容器的别名和镜像名取一样的
- -p 8900:8900:映射主机和容器之间的端口
- -v /data/java/logs:/data/java/logs:挂载/共享主机上的
/data/java/logs
,方便持久化日志,后面就算java/smart
容器出错停止,我们还是可以通过日志查看问题所在 - java/smart:2019:指定镜像名称和版本号
PS:容器可以挂载多个目录,每个目录功能不一样
- 动态查看
java/smart
容器日志
docker logs -f java/smart
不用-f
只能查看最后十行的日志,-f
即代表动态查看日志
由于项目需要请求外部的地址,如mysql等,所以项目就算打成jar不能修改了,还是要让它扫描外部配置文件,这样方便我们修改,省去了重复打jar包的时间。
上面的第6步已经提到将我们的配置文件放到对应的挂载目录(/data/java/config
)下,对应的容器中运行jar包的命令,加载的也是这个目录下的文件,所以我们修改宿主机上的文件,再重启容器即可让它生效
1.修改/data/java/config
的application-dev.yml
文件
2.重启容器:docker restart smart
这里的重点是保证宿主机和容器进行目录挂载,然后jar
包的运行命令中加载的是容器中挂载目录下的文件。
简单说我们的-v参数后面接的冒号前面的是宿主机的目录,是我们方便修改的地方,冒号后面的是容器的挂载目录,程序启动命令是加载容器中的目录,而不是宿主机的目录