Docker的镜像是分层设计的,底层是只读的,通过镜像启动的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层当中,如果要将写入的数据永久生效,需要将其提交为一个镜像然后通过这个镜像在启动实例,然后就会给这个启动的实例添加一层可读写的文件系统。
目前Docker的数据类型分为两种:
- 一是数据卷,数据卷类似于挂载的一块磁盘
- 二是数据容器,是将数据保存在一个容器上
使用场景
- 输出日志
- 静态 web 页面
- 应用配置文件
- 多容器间目录或文件共享
数据卷
数据卷挂载实际上就是宿主机上的目录或文件,可以被直接挂载到容器中使用。
1 | $ sudo docker run -it -d --name n1 -p 8080:80 -v /vagrant:/usr/share/nginx/html nginx /bin/bash |
将宿主机的 /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 | $ sudo docker run -it -d --name v1 -v /vagrant:/usr/share/nginx/html ubuntu /bin/bash |
将宿主机的 /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