一、引言
闊愛帥氣的小編又來了 , 那麼麼麼麼今天所寫的文章也是在實際使用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鏡像中的數據。