写在前面的话

学到这里相信有心的朋友都发现问题了,我们每次都会去删掉容器,在创建新的容器。那数据怎么办?岂不删库跑路了?

就算不是数据库,假设公司有日志保留的需求,那每一次发布岂不日志都被干掉了?

Data volume

MySQL 镜像的官方文档如下,其中涉及到很多参数也是上面的:

https://github.com/docker-library/docs/tree/master/mysql

该配置项对应到 Dockerfile 中的关键字就是 VOLUME,后面会详细学习,以下是 MySQL 5.7 的官方 Dockerfile,看看人家是怎么写的:

https://github.com/docker-library/mysql/blob/bb7ea52db4e12d3fb526450d22382d5cd8cd41ca/5.7/Dockerfile

首先删除掉目前所有容器,删除所有的 volume,运行一个 MySQL 容器,并设置不需要密码:

# 删除所有容器
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,将某个目录制作成数据卷,相当重要。

【07】循序渐进学 docker:数据持久化的更多相关文章

  1. Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)

    Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ...

  2. Docker数据持久化与容器迁移

    上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据.如果想做到数据持久化,Docker提供数据卷(Data volume)或 ...

  3. 【01】循序渐进学 docker:到底是啥

    写在前面的话 首先说一下,我本身是做运维的,4 年工作,多家公司.所以可能接下来谈到的更多的是一些在工作过程中积累的个人看法.且有些并不具备普遍性,有不合适的地方,全当我在吹牛逼就行. 一开始我们得谈 ...

  4. docker数据持久化

    转载/参考: https://www.jianshu.com/p/ef0f24fd0674 Docker的数据持久化主要有两种方式: bind mount docker managed volume ...

  5. docker数据持久化/共享---volume,bind-mount,tmpfs-mount

    一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供 ...

  6. Docker | 数据持久化与数据共享

    数据持久化(安装MySQL) 参考另一篇Docker安装mysql: https://www.cnblogs.com/all-smile/p/16778376.html MySQL的数据持久化问题 # ...

  7. 【08】循序渐进学 docker:docker compose

    写在前面的话 在之前的操作中,即使是单个容器每次都需要敲很长的命令,当需要多个容器组合着用的时候更加麻烦,此时我们急需找到一种一次配置,随便运行的方法. 这就是这一节重点,单机容器编排工具:docke ...

  8. 【09】循序渐进学 docker:docker swarm

    写在前面的话 至此,docker 的基础知识已经了解的差不多了,接下来就来谈谈对于 docker 容器,我们如何来管理它. docker swarm 在学习 docker swarm 之前,得先知道容 ...

  9. 【06】循序渐进学 docker:跨主机通信

    写在前面的话 目前解决容器跨主机通信的方案有很多种,这里给出的只是其中的一种,而且还不是最好的方案,不过归根结底,大同小异.在学习 docker swarm 之前,大家可以先看看这种. 啥是 over ...

随机推荐

  1. 网卡流量监控脚本 ( Shell )

    #!/bin/bash # Traffic Monitor # author: Xiao Guaishou get_traffic_info(){ recv=`cat /proc/net/dev | ...

  2. 使用net.sf.fjep.fatjar插件将第三方JAR包打包进自已的JAR包中

    一般单个工程,在没有应用别人的jar包时导出为jar很简单,只要设置一个Main-Class就行了,也就是选择程序入口(main所在类).但是涉及到了数据库或需要用到第三方的JAR,就需要用到相应的数 ...

  3. input子系统分析之一:框架

    内核版本:3.9.5 输入设备总类繁杂,包括按键,键盘,触摸屏,鼠标,摇杆等等,它们本身都是字符设备,不过内核为了能将这些设备的共性抽象出来,简化驱动的开发,建立了一个Input子系统.Input子系 ...

  4. Excel另存为_有些Excel打开时会出现一些提示

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  5. Bug of VS2015+WDK

    1>  Signability test failed.1>  1>  Errors:1>  22.9.7: DriverVer set to incorrect date ( ...

  6. GC类

    [GC类] GC是一个静态类. 垃圾回收器跟踪并回收托管内存中分配的对象.垃圾回收器定期执行垃圾回收以回收分配给没有有效引用的对象的内存.当使用可用内存不能满足内存请求时,垃圾回收会自动进行.或者,应 ...

  7. 【LA2238 训练指南】固定分区内存管理 【二分图最佳完美匹配,费用流】

    题意 早期的多程序操作系统常把所有的可用内存划分为一些大小固定的区域,不同的区域一般大小不同,而所有区域的大小之和为可用内存的大小.给定一些程序,操作系统需要给每个程序分配一个区域,使得他们可以同时执 ...

  8. android-tip-SocketException之ETIMEDOUT

    异常出现时间 如果我们有一个长连接,此时网络被关闭,或者暂时失去信号, 此时就会出现此异常. 如果出现此异常,则不得不重连.

  9. 2015年2月编程语言排行榜:JavaScript排名达到历史最高

    JavaScript在赢得2014年最后一个月的TIOBE编程语言奖后,并且还在不断走强.在二月份JavaScript就超过了PHP,并 且达到它有史以来最高的位置,排行到TOP 6.另一方面,Obj ...

  10. IPP库下FFT的基本实现

    首先感谢韩昊同学,他的傅里叶分析入门给我们对数学公式不熟悉的人了解傅里叶算法打开了一扇窗户,其原文发表于知乎:https://zhuanlan.zhihu.com/p/19763358 在了解其基本原 ...