声明:作者才疏学浅,如果文章有误,请评论指出。如果有疑问,欢迎关注评论交流。若转载,请注明出处。
一、思考
我们在使用 docker 时,难免会涉及到数据问题。例如
-
问题1:Docker 容器删除后,在容器中产生的数据还在吗?
如下图所示,data1 和 data2 都是MySQL 容器中产生的数据,当mysql 容器被删除了,容器内部数据肯定也被删除掉。这样删除容器,岂不是相当于删库(赶紧跑路!),实在太危险了!那有没有什么办法可以解决这个问题呢?蛋定,有问题就会有解决方案。请继续阅读。
-
问题2:docker 容器和外部机器可以直接交换数据文件吗?
docker 容器和外部机器是不可以直接交换数据文件的。如下图所示,外部机器不能直接访问到 mysql 容器的数据文件。
-
问题3:容器之间想要进行数据交互,怎么办?
我们都知道,docker 采用沙箱机制,容器都是独立互不影响。那么,怎么解决这个问题呢?答案,便是引入数据卷概念。
二、docker 容器数据卷的概念和作用
-
引入数据卷
面对以上三个问题,我们可以引入数据卷来解决问题。数据卷可以理解为宿主机中的一个目录或文件。
请看下图,宿主机中有一个/data/mysql/data
的目录。我们把这个目录挂载到 mysql容器1 和 mysql容器2 中。那么宿主机该目录下的数据就就相当于两个 mysql容器 中的数据。三者之中,只要其中一处改变了数据,其他两处的数据也就改变了。
那么思考的三个问题也就迎刃而解了。
对于问题一,当容器删除了,宿主机中的数据还在。重新建容器时,把目录挂载上,数据就还原了。妈妈再也不用担心,容器删除了,数据也被删除的问题。
对于问题二,外部机器直接访问宿主机的/data/mydql/data
,就可以交换数据文件了。我们测试环境搬移到生产环境时,就需要把这些挂载的数据卷,拉取到生产机器上。
对于问题三,mysql容器1 和 mysql容器2 挂载同一个目录,只要其中一个改变了数据,另外一个容器的数据就相当于改变了。例如 mysql容器1 新增了一张用户表user,mysql容器2也就多了一张用户表 user。从而达到数据交互。 -
数据卷的概念
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
- 数据卷的作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
三、配置 docker 容器数据卷
-
创建启动容器时,使用 –v 参数 挂载数据卷.
docker run … –v 宿主机目录( 文件): 容器内目录( 文件) …
如下:其中\
是换行拼接命令的作用,-v 是挂载数据卷,-e是设置环境变量,-d 是后台运行。docker run --name mysql -p 3306:3306 \ -v /data/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=password \ -d mysql:5.7 注意事项: 1. 挂载目录是绝对路径 2. 如果目录不存在,会自动创建 3. 一个容器可以挂载多个数据卷
最后我们一般都会挂载容器的数据目录、配置文件和日志数据卷,以便我们环境搬迁和持久化数据。
四、小结
本文通过提出的三个问题,进而引入数据卷概念作用,以及配置数据卷。文章到这里就结束了,如有兴趣,请看下一篇文章。