写在前面的话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,将某个目录制做成数据卷,至关重要。