容器镜像存储
容器镜像具有不变和分层的特点,运行中的容器在其基础容器镜像上获取新层,这个层就是容器存储,这个层是唯一供容器读写的存储,它用于创建工作文件、临时文件和日志文件。这些文件被视为临时性。如果这些文件丢失,应用不会停止工作
容器存储层由运行中的容器独占使用,因此,如果从同一基础镜像创建另一个容器,它会获得另一个读写层
这是基于一个理念:容器化应用的运作方式应当假定它们始终都使用空存储启动,这使得创建和销毁容器成为开销相对较低的
操作,因而容器存储被认为是临时的,其内容不会在容器移除后保留
所以:容器化的应用不应使用容器存储来存储持久数据,因为它们无法控制其内容保留的时间。即便可以长时间保留容器存储,分层的文件系统对密集 I/O 工作负载而言也性能不佳。
那么如何长久保存容器数据,即使容器被销毁,也可以保留数据,以便下次启动容器或者给其它容器使用呢?
持久化存储
把本地或远程的文件系统(目录)挂载到容器中去,这样,容器可以访问目录中的数据,就是容器删了,目录中的数据也还在,还可以给别的容器使用。在实际企业运行中,通常会单独设置一台或多台文件存储服务器,供外部应用或服务器访问。这里我们举个例子,把一台主机当作文件存储服务器,然后把主机目录挂载到容器中去,具体步骤如下:
1 本地目录给本地容器使用
此时文件服务器与容器所在服务器是同一台
新建目录
mkdir /dbfiles
设置权限
容器用户必须能够在该目录中写入文件。如果主机计算机不含有容器用户,应当通过来自容器的用户 ID (UID) 来定义权限
chown -R 30:30 /dbfiles # 这里假设给mysql用户设权限,mysql用户的uid是27
设置SELinux标签
chcon -R -t svirt_sandbox_file_t /dbfiles #如果服务器开启selinux服务
挂载目录到容器
挂载目录到容器需要使用-v选项到 docker run 命令,并指定主机目录路径和容器存储路径,其中用冒号 (:) 分隔,比如现在有个容器叫mysql,我们要把主机目录/dbfiles 挂载到mysql容器的/var/lib/mysql目录
docker run -v /dbfiles:/var/lib/mysql mysql
2 本地目录给远程容器使用
此时文件服务器与容器所在主机不是同一台
文件服务器主机操作步骤:
新建目录
mkdir /dbfiles
修改访问权限
chown nfsnobody:nfsnobody /dbfiles
chmod 700 /dbfiles
设置共享权限
vim /etc/exports
/dbfiles ip address (rw,all_squash) # 远程容器所在的主机或主机网段
# 这里需要注意本地是否安装nfs ,如果没有需要先执行* yum install nfs* 进行安装
systemctl restart nfs-server
showmount -e localhost
之后是容器主机剩余步骤等同前面,不再赘述。