
上一篇:Docker(4)—镜像
1. 如何保证数据持久化?
到这里我们应该知道,docker技术就是使用下载好的镜像文件生成运行实例—容器,也就是说镜像文件相当于是一个模板,比如mysql的镜像文件,无论在docker上面运行多少次mysql,使用的始终是下载好的同一个mysql镜像文件。那我运行期间产生的数据怎么保存?第二次运行的时候想使用第一次运行期间产生的数据怎么办?
在Docker中,数据卷提供数据持久化功能。数据卷呈现为一种目录或者文件的形式存在于一个或者多个容器中,由docker挂载到容器,但是不属于联合文件系统的一部分,所以当docker关闭或者删除容器的时候,不会影响到数据卷中的数据。数据卷可以用于存储数据,也可以用来在容器间进行数据共享。
2. Dockerfile保留字指令
| 指令 | 描述 |
|---|---|
| FROM | 基础镜像,当前新镜像是基于哪个镜像的 |
| MAINTAINER | 镜像维护者的姓名和邮箱地址 |
| RUN | 容器构建时需要运行的命令 |
| EXPOSE | 当前容器对外暴露出的端口 |
| WORKDIR | 指定在创建容器后,终端默认登录进来工作的目录,一个落脚点 |
| ENV | 用来在构建镜像过程中设置环境变量 |
| ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 |
| COPY | 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 {COPY src dest} |
| VOLUME | 容器数据卷,用于数据保存和持久化工作 |
| CMD | 指定一个容器启动时要运行的命令。Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换。 |
| ENTRYPOINT | 指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。 |
| ONBUILD | 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。 |
3. 数据卷特点?
- 数据卷可以在容器间共享或者重用数据
- 数据卷中的更改不会包含在容器的更新中
- 数据卷中的更改可以直接生效
- 数据卷的生命周期一直持续到没有容器使用它为止
3. 实现宿主机与容器之间的数据共享?
在这里需要明确两个概念:
1. 宿主机:
宿主机指的就是我们通过VMWare-----》CentOs的方式进入的Linux系统就是我们的宿主机。
2. 容器
就是宿主机上拉取的镜像文件生成的运行实例~
需求:
现在我有一个centos镜像,希望centos镜像运行起来的时候其containerdata目录与宿主机的mydata两个目录之间能够进行数据共享;
命令:
docker run -it -v 宿主机中的共享目录(mydata)路径:容器中的共享目录(containerdata)的路径 容器名
示例:
比如mydata在宿主机的根目录下(/mydata),containerdata在容器的根目录下(/containerdata)
下图是宿主机的根目录,现在没有mydata文件夹

下图是容器centos的根目录,现在也没有containerdata文件夹

1.首先进行目录绑定:
docker run -it -v /mydata:/containerdata centos
2.查看宿主机和容器的绑定关系
docker inspect 容器ID

3.查看宿主机和容器中是否分别有mydata和containerdata文件夹
宿主机:

容器:

现在在mydata目录中创建一个文档:
[root@bogon mydata]# touch file.txt
[root@bogon mydata]# ll
总用量 0
-rw-r--r--. 1 root root 0 3月 22 14:57 file.txt
[root@bogon mydata]#
既然mydata目录和centos的容器中的containerdata目录进行了数据共享,那么现在containerdata目录下应该也有一个file.txt文档。查看containerdata目录:
[root@7453e78d6615 /]# cd containerdata/
[root@7453e78d6615 containerdata]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 22 06:57 file.txt
[root@7453e78d6615 containerdata]#
发现containerdata目录下确实有file.txt文档,现在通过容器编辑该文档:

在该文档中输入一段话,按照数据共享的原理,在宿主机的mydata目录下的file.txt文档中应该也会有这样一句话:

此时再次查看宿主机的containerdata下的file.txt:

到这里就实现了宿主机与容器之间的数据共享~
注意:
通过上面的绑定操作之后,即使我们的容器关闭运行了,但是如果我们在宿主机的mydata目录下进行的操作依然会被同步到与其绑定的centos镜像中的containerdata目录下:
示例:
关闭centos的运行并退出:`

查看此时运行的镜像文件:

确认上面的centos镜像文件已经退出运行了~
此时在宿主机的mydata目录下创建一个file001.txt文件,并添加内容:this content is edited in the host

此时再运行centos镜像文件,到containerdata目录下查看:
查看上次关闭的centos镜像ID:docker ps -l

重新启动上次关闭的centos镜像文件:docker start 镜像ID

进入处于运行状态的centos容器:docker attach 镜像ID

查看containerdata目录下是否有新增的file001.txt文档:
[root@e2fde7599c8b /]# cd containerdata/
[root@e2fde7599c8b containerdata]# ls -l
total 8
-rw-r--r--. 1 root root 38 Mar 22 07:22 file.txt
-rw-r--r--. 1 root root 35 Mar 22 07:13 file001.txt
[root@e2fde7599c8b containerdata]# cat file001.txt
this content is edited in the host
[root@e2fde7599c8b containerdata]#
发现我们在宿主机上新建的file001.txt文档以及里面的数据同步到了centos容器相应的绑定位置;
4. 宿主机与容器数据共享的时候添加权限
宿主机与容器进行数据共享的目录绑定命令:
docker run -it -v /宿主机共享文件的绝对路径:/容器共享文件的绝对路径 :ro 镜像名
注:ro就是read only(只读权限)
通过以上命令进行共享数据目录绑定之后,我们可以从宿主机上写数据(增删改),而容器上只能读数据