赢咖2招商97916

为实现持久化,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
来看下具体命令:
docker中数据卷探究与总结

那么我们到标红的那段里面看看,是否和/var/lib/mysql一样呢?结果是一样的
docker中数据卷探究与总结

那老是匿名不是个事,我们能指定吗?
第一种方法-v不就行了吗?
下面试试:
docker中数据卷探究与总结
结果发现是可以了,/var/lib/mysql里的东西全部到/data/mysql1里面了,这里其实是容器的目录复制到指定目录,宿主机的指定目录再挂载到容器的指定目录中,这理解起来可能有些困难,但是确实是这样。
那么我们就很好解决了上面gerrit数据卷的问题了,因为它的dockerfile里面也是有VOLUME标签的。

三.使用--volumes-from参数指定挂载的容器的宿主机目录
上图,不多bb
docker中数据卷探究与总结
可以发现mysql1和mysql用的是用一个宿主机目录/data/mysql1

好了,数据卷东西就写到这了

原文地址:http://blog.51cto.com/14204961/2351091

时间: 2024-10-19 17:41:07

赢咖2招商97916的相关文章

赢咖2主管97916

用友云开发者中心是基于Docker容器进行微服务架构应用的落地与管理.相信各位同学在使用的过程中,会发现随着Docker镜像的增多,占用磁盘空间也约来越多.这时我们需要清理私有镜像仓库中不需要的镜像.但在实际操作时,才会发现这本以为很简单的任务中却暗藏玄机,遇到了不少的麻烦.在这里我们分享一下清理镜像仓库时遇到的坑点.想要直接寻求解决方案的同学可以直接看第二部分.一.那些年,我们在清理镜像仓库时走过的坑坑点1:官方提供的接口并不能真正的删除镜像这着实是最大的坑点.很多同学查资料发现,官方已经提供

赢咖二招商主管753731之开源,基础软件最好的商业模式

虽然已经 2019 年,但还是有不少人(甚至是大部分人),一提到“开源”,想到的就是“免费”与“个人开发的业余(低水平)软件”.然而事实恰恰相反,今天“开源”正是基础软件最好的生长模式.“开源”能对基础软件公司提供三方面的助力:技术/品牌推广,用户/开发者拓展,人才吸引. 是不是言过其实?让我们一起细细探究什么是“开源”. “开源”简史 “开源”( Open Source )这个口号源于 1998 年的一次软件黑客峰会.当时,自由软件运动已经进行了 15 个年头. 软件自由 1969 年, Un

小组赛赢局,和局不赢,有何区别?

现在比较想买喜欢的是高斯和那样的太棒了进攻上路高地真的有毒,那地方翻车好几次了吧 那个发帖说欠公道的弱智呢?为啥删我帖子....有国外的,能爬墙的朋友,赶快去站上传韩文.英文,台湾版本的总决赛四场解说,老子晚上通宵了,就这下尴尬了 想看湾湾解说们解说最后的比赛今天发挥不错,但不能骄傲,需多练几套阵容小时候玩街机拳皇,我总是在赢对手三四把的时候让对手一把,不然老是赢,就没人敢接币了,一个人玩恭喜恭喜恭喜同样为加油,最后心疼扣肉和破篓子下棋,越下越臭,整个赛区互相拖后腿,现在已经和湾湾五五开了,再过

打造最火的新零售野人参招商平台

中国供销集团野山参新零售:全新的项目模式.让投资变得无风险第一:合情合理合法(属于央企)第二:不伤人脉资源第三:公司客户是共赢的模式第四:稳定靠谱,安全没有风险第五:能赚到钱,能帮助更多的人赚到钱第六:公司有超强的经济实力和造血功能,这才是很多人都在找的好项目第七:能稳定长久持续赚到大钱1,上市准备,上市公司备案审查上市企业通信中心授权成员认定,授权成员达成协议,签署所列物种的赞助协议;发起人应当将产品可行性报告提交中央审批;授权成员提交有关上市公司的信息;中心是否有上市标准,上市保荐人应经审批

创业的小伙伴们,九牛双创孵化基地隆重招商!你还在等什么?

听说关注了我们的人都创业啦!!!听说关注了我们的人都创业九牛双创孵化基地隆重招商九牛双创孵化基地为了响应"大众创业,万众创新"号召扶持大学生创业就业,为帮助勇于创业.善于创业的青年人才,培育和孵化一批创新企业,带动一批创业青年,营造良好的创业环境,九牛双创孵化基地以创新引领未来,创业改变生活.奋斗成就梦想的宗旨,积极为大学生提供创业优惠政策.项目指导.资金帮扶,带动和扶持一批大学生创业项目,搭建的大学生成长发展平台.九牛双创孵化基地现面向全国乃至全世界隆重招商! 九牛双创孵化基地请添加

Unity大中华区技术经理成亮:我们一直在和开发者共建一个开放共赢的平台

2018中国杭州云创大会将以"开放·生态·赋能"为主题,汇聚行业领袖.技术大咖及产业链从业者,探讨数字化浪潮下云计算.大数据的发展方向和应用趋势,分享教育.游戏.制造.金融等行业精英的前沿实践,重点解析工业智能互联网和数字化产业园区的升级之路. 此次大会还将基于开放技术和创新模式与大家一起探索打造联合生态圈,推动产业智能化升级,引领互联网+企业数字化转型:以知识共享促进云计算.大数据普惠化的道路,形成数字经济共同体,成为未来中国经济增长的新引擎. 为了帮助大家进一步了解这场全球前言技术

直播预告|【芯咖秀?第六期】MCU热的前因后果以及未来到底如何发展!

何谓MCU?我相信从事电子行业的都很清楚,MCU本质为一片单片机,它将计算机的CPU.RAM.ROM.定时计数器和多种I/O接口集成在一片芯片上组成的芯片级的计算机.它存在于我们每天接触到得各种家电.数码产品.办公设备.汽车电子以及各种仪器仪表中. 现在比较流行的物联网中数据处理.加工.传输都离不开MCU,在物联网发展趋势下,节能.安全感测.3C产品.医疗及汽车电子应用等,均已成为MCU的热门应用领域. 那么为何MCU会如此火热呢?未来它到底会怎样发展? 带着这样的疑问,芯播荟请到了深圳市航顺芯

学赢亿家是什么?是一款什么样子的APP?

各位学赢亿家的家人们,大家好,我是启航,有很多朋友问学赢亿家到底是什么?那么今天就给大家讲一讲什么是学赢亿家?学赢亿家是一个以实现企业和个人全方位发展崛起,在双创时代通过新模式转型学习.孵化使企业和个人快速盈利为核心的一站式落地平台:在过去我们需要花几千块.几万块才能听得到的高端新商业盈利模式.营销招商.股权融资.运营管理等课程:今天能够以一天一块钱的价格:以线上学习这样非常便捷的方式传送到更多人身边:所以,学赢亿家是一款不受时间空间限制,用最少的投资.最方便的时间.最前沿的资讯助力企业和个人业

人生,别认输,因为没人希望你赢

别认输,因为没人希望你赢:别靠人,因为只有自己最可靠:别乞求,因为别人等着看笑话: 别落魄,因为一堆人在等着落井下石:别回首,因为看到的是未修复的裂痕:别离愁,因为只会才下眉头却上心头: 别低头,因为地上没有黄金只有石头:别强求,因为硬摘的果实,没有甜头.有些事情不要太计较,睁一只眼,闭一只眼,就会过去的. 别哭穷,因为没人会给你钱:别喊累,因为没人会帮你做:别想哭,因为大家并不在乎: 最难打开的是心门,最难走的路是心路,最难过的桥是心桥,最难调整的是心态.世界上最难干的工程是改造人的内心世界.