Docker的镜像是分层设计的,底层是只读的,通过镜像启动的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层当中,如果要将写入的数据永久生效,需要将其提交为一个镜像然后通过这个镜像在启动实例,然后就会给这个启动的实例添加一层可读写的文件系统。

目前Docker的数据类型分为两种:

  • 一是数据卷,数据卷类似于挂载的一块磁盘
  • 二是数据容器,是将数据保存在一个容器上

使用场景

  1. 输出日志
  2. 静态 web 页面
  3. 应用配置文件
  4. 多容器间目录或文件共享

数据卷

数据卷挂载实际上就是宿主机上的目录或文件,可以被直接挂载到容器中使用。

1
2
$ sudo docker run -it -d --name n1 -p 8080:80 -v /vagrant:/usr/share/nginx/html nginx /bin/bash
5a33e49f245a92049f585ab7c386f0d6f4025bbb1063a64c8b907d7e4c76c6c2

将宿主机的 /vagrant 目录挂载到 Nginx 的主目录 /usr/share/nginx/html

启动 Nginx 服务

1
$ sudo docker exec n1 service nginx start

我们在宿主机 /vagrant 目录下创建个 index.html ,并写入 hello world。在实体电脑的浏览器中输入 http://192.168.33.10:8080/ 就会看 hello world

说明下为什么是192.168.33.10,这里的宿主机是相对于 Nginx 容器说的,其实就是在实体电脑上的虚拟机,这台虚拟机的 IP 是 192.168.33.10。如果是在这台虚拟机上就是打开 localhost:8080

容器卷

数据卷容器可以作为共享的方式为其他容器提供文件共享,类似于NFS共享,可以在生产中启动一个实例挂载本地的目录,然后其他的容器分别挂载此容器的目录,即可保证各容器之间的数据一致性。

采用Ubuntu镜像创建一个卷容器:

1
2
$ sudo docker run -it -d --name v1 -v /vagrant:/usr/share/nginx/html ubuntu /bin/bash
8f8889353949157b7a1f91e8d6aadcad517af294ed2cf8bad47e387b978ab567

将宿主机的 /vagrant 目录挂载到 Ubuntu 的目录 /usr/share/nginx/html 。

这时候我们在创建一个 Nginx 容器 n2,使用 Ubuntu 数据

1
$ sudo docker run -it -d --name n2 -p 8088:80 --volumes-from v1 nginx /bin/bash

启动 n2 的 Nginx 服务

1
$ sudo docker exec -it n2 service nginx start

这个时候宿主机上已经启动了 n1 和 n2 两个 Nginx 服务。n2 用的是 Ubuntu 的数据。在实体电脑的浏览器中输入 http://192.168.33.10:8080/ 也会看 hello world