上一篇: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(只读权限)
通过以上命令进行共享数据目录绑定之后,我们可以从宿主机上写数据(增删改),而容器上只能读数据