寫在前面的話html
學到這裏相信有心的朋友都發現問題了,咱們每次都會去刪掉容器,在建立新的容器。那數據怎麼辦?豈不刪庫跑路了?前端
就算不是數據庫,假設公司有日誌保留的需求,那每一次發佈豈不日誌都被幹掉了?mysql
Data volumenginx
MySQL 鏡像的官方文檔以下,其中涉及到不少參數也是上面的:git
https://github.com/docker-library/docs/tree/master/mysqlgithub
該配置項對應到 Dockerfile 中的關鍵字就是 VOLUME,後面會詳細學習,如下是 MySQL 5.7 的官方 Dockerfile,看看人家是怎麼寫的:web
https://github.com/docker-library/mysql/blob/bb7ea52db4e12d3fb526450d22382d5cd8cd41ca/5.7/Dockerfilesql
首先刪除掉目前全部容器,刪除全部的 volume,運行一個 MySQL 容器,並設置不須要密碼:docker
# 刪除全部容器 docker rm -f $(docker ps -aq) # 刪除全部卷 docker volume rm $(docker volume ls -q) # 建立 MySQL 容器 docker run -d --name db1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
而後進入容器,登入數據庫建立一個名爲 hello 的庫:數據庫
docker exec -it db1 /bin/sh
具體操做如圖:
以後退出容器,再刪除掉它:
docker container rm -f db1
此時查看數據卷:
docker volume ls
結果如圖:
能夠看到,雖然刪除了容器,可是 VOLUME 中仍是保留了一個卷。那這個卷怎麼使用呢?
此時再度新建一個 MySQL 容器,和以前不一樣,此次把這個容器的卷指向這個以前的卷:
docker run -d --name db2 -v 651246525fdde44a562bace3388705562d477d28c200128a7a7af8c1e2bf11c2:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
說明:在 -v 參數後面使用了 /var/lib/mysql,這個目錄來自以前的 MySQL Dockerfile 中有定義一項:VOLUME /var/lib/mysql
此時查看卷:
docker volume ls
發現並無新加新建立的卷,進入容器查看數據庫:
docker exec -it db2 /bin/sh
查看數據庫結果如圖:
發現以前創建的 hello 庫還在,惟一有點小遺憾,那就是 VOLUME NAME 由於是隨機,固然這個是能夠解決的。
新建一個 MySQL 容器,指定 VOLUME 名稱:
docker run -d --name db3 -v my-data:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
查看:
docker volume ls
結果如圖:
此時 VOLUME NAME 就變成本身定義的了。
Bind Mouting
這是數據持久化的第二種方式,相比於第一種以卷的形式存儲,這種方式更適合用於前端靜態文件更新,這裏以 nginx 鏡像爲例:
docker run -d --name web1 -p 8080:80 -v /data/html:/usr/share/nginx/html nginx
進入本地宿主機 /data/html 目錄,增長 index.html:
cd /data/html/
vim index.html
內容以下:
<h1>Hello world</h1>
訪問測試:
這樣實現的效果就至關於把容器裏面某個指定的目錄映射到宿主機本地某個目錄,只須要在本地修改文件就達到了修改容器中文件的目的。
部署 Wordpress 實踐
這裏新增一個實踐用於熟悉傳參和數據持久化的問題。
【1】啓動 MySQL 容器:
docker run -d -v wordpress-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress --name wordpress-db mysql:5.7
設置了數據庫的密碼和新建了一個數據庫,並給數據卷作了重命名。
【2】啓動 Wordpress 容器:
docker run -d --link wordpress-db --name wordpress-web -e WORDPRESS_DB_HOST=wordpress-db:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123456 -e WORDPRESS_DB_NAME=wordpress -p 8080:80 wordpress
具體參數能夠參考:
https://github.com/docker-library/docs/tree/master/wordpress
採起 --link 的方式就行數據庫鏈接。第一次因爲須要下載,可能比較慢,完成之後訪問測試:
小結
在本節中咱們知道了數據的持久化,也接觸了 Dockerfile 中一個新的關鍵字 VOLUME,將某個目錄製做成數據卷,至關重要。