docker中数据卷探究与总结 精选 原创 ziwenzhou 2019-02-15 14:56:47 博主文章分类:Linux ©著作权 文章标签 docker数据持久化 文章分类 运维 ©著作权归作者所有:来自51CTO博客作者ziwenzhou的原创作品,请联系作者获取转载授权,否则将追究法律责任 为实现持久化,docker引入了挂载数据卷的方法,以实现数据的可持久化。具体是以下三种: 一.通过docker run命令 命令: docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/test.txt:/var/spool/cron/crontabs/root openfrontier/gerrit:2.15.3 此时将宿主机的/data/mysql1挂载到容器的/var/lib/mysql下,这里需要注意的还分以下几种情况: A.挂载本地不存在的文件,到容器中已存在的文件,无法启动 docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/review_site_test/root:/var/spool/cron/crontabs/root openfrontier/gerrit:2.15.3 结果无法启动 B.挂载本地不存在的文件夹,到容器内已存在的文件夹,可以启动,但会清空容器内的指定目录/var/spool/cron/crontabs下的所有文件 docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/review_site_test:/var/spool/cron/crontabs openfrontier/gerrit:2.15.3 结果可以启动 但需要注意的是挂载本地不存在的文件夹过去,会清空当前容器的指定文件夹。如果容器中对该文件夹有启动依赖,例如上面的gerrit镜像: 使用下面的命令就无法启动: docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/review-site21a:/usr/share/gitweb openfrontier/gerrit:2.15.3 原因:gerrit依赖于gitweb C.挂载本地存在的文件,到容器内指定文件,可以启动,该文件会覆盖你指定的文件 [root@zzw docker]# cat test.txt askdkjajksdk [root@zzw docker]# docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/test.txt:/var/spool/cron/crontabs/root openfrontier/gerrit:2.15.3 c86aac5a73d551163c262bdf4db8cc4253322ac4c41d2d2418675c5b4f63e62a bash-4.4# cd /var/spool/cron/crontabs bash-4.4# ls root bash-4.4# vim root bash: vim: command not found bash-4.4# cat root askdkjajksdk D.挂载本地存在的文件夹test,到容器里已存在的文件夹,发现test目录中的文件,直接到容器内指定目录下 [root@zzw docker]# docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/test:/var/spool/cron/crontabs openfrontier/gerrit:2.15.3 9c32db2cff1d8d7ed3636a812302470d9408f4c60786067a57da770b930ae01f [root@zzw docker]# docker exec -it gerrit /bin/bash bash-4.4# cd /var/spool/cron/ bash-4.4# ls crontabs bash-4.4# cd crontabs bash-4.4# ls test.txt bash-4.4# vim test.txt bash: vim: command not found bash-4.4# cat test.txt askdkjajksdk F.挂载本地存在的文件夹test,到容器里不存在的文件夹,会在容器内创建该test文件夹 E的变种 [root@zzw docker]# docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/test:/var/spool/cron/test openfrontier/gerrit:2.15.3 53fb24583eb65278599975ca515000080267e8348e945f1fcbd4fc4f8e6cb165 [root@zzw docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 53fb24583eb6 openfrontier/gerrit:2.15.3 "/gerrit-entrypoin..." 4 seconds ago Up 2 seconds 0.0.0.0:9001->8080/tcp, 0.0.0.0:29419->29418/tcp gerrit d114a167bbcc nginx:1.15.2-alpine "nginx -g 'daemon ..." 41 hours ago Exited (0) 35 minutes ago test_nginx_1 641508207b44 mysql:5.7 "docker-entrypoint..." 41 hours ago Exited (0) 35 minutes ago test_db_1 [root@zzw docker]# docker exec -it gerrit /bin/bash bash-4.4# cd /var/spool/cron/ bash-4.4# ls crontabs test bash-4.4# cd test/ bash-4.4# ls test.txt G.挂载本地是文件test.txt,到容器内指定的目录crontabs,报错 [root@zzw docker]# docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/test/test.txt:/var/spool/cron/crontabs openfrontier/gerrit:2.15.3 e63487c08abce10c8bdbcf834714ad0994a93118abdd5126969856f862ca7f0b /usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:364: container init caused "rootfs_linux.go:54: mounting \"/home/docker/test/test.txt\" to rootfs \"/var/lib/docker/overlay2/5b0428b09a0727e114f06d312106e4fb28bc31d728abd27dab2f30328497c3c7/merged\" at \"/var/lib/docker/overlay2/5b0428b09a0727e114f06d312106e4fb28bc31d728abd27dab2f30328497c3c7/merged/etc/crontabs\" caused \"not a directory\""" : Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type. 看过第一种肯定有一些疑惑,因为有些镜像是违背第一种原则,即宿主机不存在某个目录,-v参数指定的宿主机目录:容器目录,容器目录里的东西立马都到宿主机指定的目录下了,不是因为宿主机的空目录覆盖掉容器的指定目录吗?怎么容器目录里的东西全都过来呢? 例如你用这条命令试试: docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/test1:/var/gerrit/review_site openfrontier/gerrit:2.15.3 别着急等会儿解释。 二.通过dockerfile中的volume创建挂载点 下面我们看下mysql的dockerfile FROM debian:stretch-slim # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN groupadd -r mysql && useradd -r -g mysql mysql RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/* # add gosu for easy step-down from root ENV GOSU_VERSION 1.7 RUN set -x \ && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \ && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ && export GNUPGHOME="$(mktemp -d)" \ && gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ && gpgconf --kill all \ && rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true \ && apt-get purge -y --auto-remove ca-certificates wget RUN mkdir /docker-entrypoint-initdb.d RUN apt-get update && apt-get install -y --no-install-recommends \ # for MYSQL_RANDOM_ROOT_PASSWORD pwgen \ # for mysql_ssl_rsa_setup openssl \ # FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db: # File::Basename # File::Copy # Sys::Hostname # Data::Dumper perl \ && rm -rf /var/lib/apt/lists/* RUN set -ex; \ # gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \ export GNUPGHOME="$(mktemp -d)"; \ gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ gpg --batch --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \ gpgconf --kill all; \ rm -rf "$GNUPGHOME"; \ apt-key list > /dev/null ENV MYSQL_MAJOR 5.7 ENV MYSQL_VERSION 5.7.25-1debian9 RUN echo "deb http://repo.mysql.com/apt/debian/ stretch mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list # the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql) # also, we set debconf keys to make APT a little quieter RUN { \ echo mysql-community-server mysql-community-server/data-dir select ''; \ echo mysql-community-server mysql-community-server/root-pass password ''; \ echo mysql-community-server mysql-community-server/re-root-pass password ''; \ echo mysql-community-server mysql-community-server/remove-test-db select false; \ } | debconf-set-selections \ && apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \ && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \ # ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime && chmod 777 /var/run/mysqld \ # comment out a few problematic configuration values && find /etc/mysql/ -name '*.cnf' -print0 \ | xargs -0 grep -lZE '^(bind-address|log)' \ | xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \ # don't reverse lookup hostnames, they are usually another container && echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf VOLUME /var/lib/mysql COPY docker-entrypoint.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 3306 33060 CMD ["mysqld"] 很明显有个标签: VOLUME 这个标签我理解是将容器目录暴露出去,简单理解就是容器中的目录可以挂载到宿主机的某个匿名目录,一般是在docker的主程序目录下,一般没做修改的话就是/var/lib/docker下,我这里是/data/docker 来看下具体命令: 那么我们到标红的那段里面看看,是否和/var/lib/mysql一样呢?结果是一样的 那老是匿名不是个事,我们能指定吗? 第一种方法-v不就行了吗? 下面试试: 结果发现是可以了,/var/lib/mysql里的东西全部到/data/mysql1里面了,这里其实是容器的目录复制到指定目录,宿主机的指定目录再挂载到容器的指定目录中,这理解起来可能有些困难,但是确实是这样。 那么我们就很好解决了上面gerrit数据卷的问题了,因为它的dockerfile里面也是有VOLUME标签的。 三.使用--volumes-from参数指定挂载的容器的宿主机目录 上图,不多bb 可以发现mysql1和mysql用的是用一个宿主机目录/data/mysql1 好了,数据卷东西就写到这了 赞 收藏 评论 分享 举报 上一篇:ansible模块编写 下一篇:centos7下在线扩容根分区 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 Java中JSON数据处理方式总结 一、序列化(obj->str)1.1 Gson-好用1、依赖<!--json序列化--><dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</ve json spring LVM逻辑卷管理 一、LVM简介LVM(Logical Volume Manager,逻辑卷管理器)是Linux系统用于对硬盘分区进行管理的一种机制,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来, 逻辑卷 LVM Linux 在Docker中运行Nextcloud:数据存储路径问题和解决方案 在Docker环境中运行Nextcloud时,数据存储路径的问题是用户常见的困惑之一。本文将为您提供一种简洁易懂的方法来解决这个问题,并确保您能够在Docker容器中顺利地找到和访问Nextcloud文件。 Docker 数据存储 nextcloud 关于数据中台的深度思考与总结 都在说中台,那么数据中台该如何做? 数据 离线 运维 干货:数据中台的深度思考与总结 来源 |http://dwz.date/aHTb本文将总结下数据中台的相关理论知识,参考《数据中台》。数据中台数据汇聚数据汇聚是数据中台必须提供的核心工具,把各种异构网络、异构数据源的... 数据中台 大数据技术 关于数据中台的深度思考与总结(干干货)关于数据中台的深度思考与总结(干干货) 本文将总结下数据中台的相关理论知识。 Flink平台化需要改进的点等等。 其他 Redis回顾与总结(持续更新中) 前一段时间公司某项目使用了Redis作为缓存服务器,年前不忙了总结回顾一下,同时整理一下学习笔记。(不断更新中...) 数据库 运维 memcached redis 数据 docker中配置数据卷 docker数据卷原理 以下是Docker相关笔记总结,方便自己以后复习,同时也希望对大家有所帮助。标题链接ubuntu下Docker 安装Docker常用命令Dockerfile使用介绍(入门教程) 文章目录概念使用数据卷方法一 直接使用命令挂载方法二 匿名挂载方法三 具名挂载扩展(读写权限)数据卷容器 概念什么是数据卷?docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化 docker中配置数据卷 docker 容器 后端 数据 docker 卷 参数 docker中的数据卷 1.什么是数据卷 容器数据卷是宿主机中一个目录或文件,通过把目录或文件挂载到容器中,可以将主机和容器之前数据同步,一个数据卷目录可以同时挂载多个容器,解决多容器之间文件交换问题,删除容器时不会删除其挂载的数据卷。2.特点:(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中(2)数据卷可以在容 docker 卷 参数 数据 docker centos docker 容器追加 数据卷 docker中的数据卷 1、什么是数据卷将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的容器之间希望有可能共享数据Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不 docker 容器追加 数据卷 数据 docker centos docker 数据卷挂载原理 docker中的数据卷 1.生产环境使用docker的过程中,往往需要对数据进行持久化保存,或者需要更多容器之间进行数据共享,那我们需要怎么要的操作呢?答案:数据卷和数据卷容器。数据卷实现容器到宿主机之间的映射;而数据卷容器实现容器到容器之间的映射。2.什么是数据卷? 数据卷:容器内数据直接映射到本地主机环境。就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机中对数据进 docker 数据卷挂载原理 数据卷 容器 数据 docker docker运行中添加数据卷 docker的数据卷 数据卷的作用Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。数据卷管理基础docker提供 docker运行中添加数据卷 docker 数据 Docker docker 数据卷 docker 数据卷插件 在docker中,对接外部存储我们通常需要docker的数据卷插件。docker中简要可分为两类 docker卷插件和CSI插件,其中docker卷插件分为两个版本,旧版的传统插件(legacy plugin/non-managed plugin)和新版的托管插件(managed plugin)。下面分章节讨论这几个问题一、传统插件(legacy plugin/non-managed plugin docker 数据卷 docker volume Powered by 金山文档 Docker docker数据卷 docker数据卷原理 什么是docker镜像?docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等);镜像不包含任何动态数据,其内容在构建之后也不会被改变。如何获得镜像?1:远程下载2:朋友拷贝3:自己制作镜像的分层系统因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时 docker数据卷 docker mysql 数据 docker 运行 本机数据卷在哪找 docker中的数据卷 文章目录Docker——数据卷的概述和使用1、数据卷简介2、-v 创建数据卷3、实战:MySQL 同步数据4、具名挂载和匿名挂载5、Dockerfile 创建数据卷6、数据卷容器 Docker——数据卷的概述和使用1、数据卷简介问题发现Docker 容器删除后,在容器中产生的数据也会随之销毁,类似删库跑路,不安全Docker 容器怎么和外部机器交换文件容器之间怎么进行数据交互解决:使用数据卷什么 docker 运行 本机数据卷在哪找 Docker run 镜像 数据卷 docker 数据卷的创建和挂载 docker中的数据卷 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。 它的作用相当于生活中的活动硬盘,那么数据卷容器就相当于把多个活动硬盘再挂载到一个活动硬盘上,实现数据的传递依赖。 docker 数据卷的创建和挂载 docker linux 数据 Docker docker exec数据卷 docker容器数据卷 docker(二)进阶--容器数据卷、Dockerfile docker(二)进阶--容器数据卷、Dockerfile 1:docker容器数据卷容器数据卷是什么?docker 镜像启动后,所有的数据都是存储在docker运行的容器中的,如果误操作把容器删除了,那么所有的数据都删除了。容器数据卷就是为了解决容器数据持久化和同步操作,容器间也可以 docker exec数据卷 docker Dockerfile 数据 docker自动数据卷 docker数据卷原理 前几篇Blog是对Docker的一个入门和初识,本篇Blog开始就详细学习下一个新的理论基础概念:Volume,也就是容器数据卷,听起来名字高大上,实际上就是一个宿主机的目录而已,为什么需要容器数据卷呢,可以类比Redis来理解,Redis运行在内存中,一旦停了数据都丢了怎么办?只能通过持久化的手段,Redis的持久化方案是RDB+AOF,感兴趣的可以看看我这篇Blog【Redis核心知识 二】R docker自动数据卷 容器 docker 容器数据卷 数据 docker 数据容器卷 docker数据卷原理 Docker 数据卷是一种广泛使用的工具,用于确保容器在运行时的数据持久性。Docker 数据卷是安装在 Docker 容器上的文件系统,用于保存正在运行的容器生成的数据。 docker 数据容器卷 docker 云原生 网络 数据卷 docker数据卷 windows docker数据卷特点 docker容器数据卷一、什么是docker容器数据卷'''docker的理念: 1.将运用与运行的环境打包形成容器运行,我们对数据的要求希望是持久化的 2.容器之间希望有可能共享数据docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。'''二、数 docker数据卷 windows 数据 docker centos