一、引言
阔爱帅气的小编又来了 , 那么么么么今天所写的文章也是在实际使用docker所遇到的问题。
新开发一个项目、或者新写一个功能需求,那肯定避免不了调试开发,然后测试,测试完又要改源码。
但每次修改一次源码都需要重新build的一下镜像,我滴天,这么麻烦的吗?
如果你也是遇到类似相同的问题,请问继续往下看......
二、数据持久化之Bind Mouting
遇到这个问题小编首先想到的就是,能不能把容器的项目和我本地项目的目录关联一下,了解过docker容器的小伙伴,容器是可以进行读写操作的。
小编之前使用容器搭建了一套Mysql做为测试环境用,但考虑到了数据持久化的问题,最后也是通过把文件持久化的方式存放到本地,这样就不会因为容器的丢失导致数据也没了的情况。
然后小编就看了Bind Mouting,咦~ 这个好像符合我的需求 ,然后小编就使用Nginx镜像容器测试了一下。
# 使用nginx做为基础镜像
FROM nginx:latest
# 指定启动容器之后所在当前路径
WORKDIR /usr/share/nginx/html
# 把当前目录下的index.html 拷贝过去
COPY index.html index.html
以上是小编所编写的DockerFile文件内容,然后我们直接build一下,最后生成镜像 。
使用Bind Mouting的关键所在就是启动的时候需要加一个选项 : -v
docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web 172.0.0.0.1:5000/web
$(pwd) ,这个代表本地电脑的当前目录,小伙伴可以在命令窗口尝试输入pwd,显示的应该是当前所在目录的路径
冒号后面这个路径/usr/share/nginx/html,这个是容器中nginx存放html静态页面的路径,然后两个目录就好像进行了关联绑定。
现在只需要修改本地电脑的index.html,对应容器这个这个目录(/usr/share/nginx/html)下的index.html内容也会随之而更改。
三、实际项目演示
既然方法找到了,小编就随便拿个springboot的项目来试试
需求:在我们修改源代码之后,只需要在开发环境重新编译源码,然后重启容器即可。
准备:小编新建了一个文件夹叫docker-jar(路径在:/var/docker-jar),在使用Maven的install的时候,会自动往这个文件夹添加编译后的源码(也可以直接使用默认targer目录下的也行)
Dockerfile文件内容:build命令小编就不多讲了,最后得到镜像名称是:jiannan/springboot
# 首先我们需要依赖一个JDK
FROM hub.c.163.com/library/java:8-alpine
# 将targer下的jar文件,添加到容器的/jar目录下
ADD target/*.jar /jar/app.jar
# 这个就代表我们容器启动之后需要执行的命令
ENTRYPOINT ["java","-jar","/jar/app.jar"]
启动容器:这里记得加上-v的选项,将两个目录进行关联绑定,后面我们每一次install,jar文件都会自动更新到容器当中。
docker run -d -p 8080:8080 -v /var/docker-jar:/jar --name web jiannan/springboot
重启容器:更换后到jar文件,因为我们这个是jar,并不是静态文件,所以我们得重启一下docker容器。
docker restart web(容器ID或者容器名称)
四、最后插两句嘴
这个Bind Mouting最主要的目的是使容器中的文件和本地磁盘某一个路径,两者文件可以相互进行同步,以防容器被删除导致文件也被删除了。
因为我们部署在容器中的程序,可能会有文件上传到功能,如果这个时候你直接保存到容器当中并且没有持久化,就很有可能容器没了,那数据就都没了。
docker持久化的方式当然不止这一种啦,小编下篇docker文章再讲如何持久化mysql镜像中的数据。