针对Docker-0006(Docker数据卷容器)和docker数据卷容器这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展167dockerdocker构建nginx容器系列问题docke
针对Docker-0006(Docker数据卷容器)和docker 数据卷容器这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、19.docker 数据卷容器、20200206 Docker 5. Docker容器数据卷、Docker 从入门到进阶四:Docker 容器数据卷等相关知识,希望可以帮助到你。
本文目录一览:- Docker-0006(Docker数据卷容器)(docker 数据卷容器)
- 167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
- 19.docker 数据卷容器
- 20200206 Docker 5. Docker容器数据卷
- Docker 从入门到进阶四:Docker 容器数据卷
Docker-0006(Docker数据卷容器)(docker 数据卷容器)
一、什么是数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
说白了就是在有容器数据卷的容器中,通过--volumes-from来实现容器之间的数据共享
二、实操
执行下面命令启动一个父容器
docker run -it --name dc01 my-self-centos
cd dataVolumeContainer1
touch dc01.txt
ctrl+p+q退出不关闭容器
执行下面命令启动一个与父容器共享的子容器
docker run -it --name dc02 --volumes-from dc01 my-self-centos
cd dataVolumeContainer1/
ls
可以看到,父容器中的文件也共享到了子容器中
以此类推,我们可以创建很多歌共享数据的容器。
167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑
1.nginx服务器根目录问题
docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同
eg:
run一个niginx容器
<span>//80端口被占用,so...</span> $ sudo docker run <span>-it</span><span>-p</span><span>800</span>:<span>800</span> nginx $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES <span>1801</span>a32aab54 nginx <span>"nginx -g ''daemon off"</span><span>2</span> minutes ago Up <span>2</span> minutes <span>80</span>/tcp, <span>443</span>/tcp, <span>0.0</span><span>.0</span><span>.0</span>:<span>800</span><span>-></span><span>800</span>/tcp berserk_kare
进入容器内部
<span>$ </span>sudo docker exec -it <span>1801</span>a32aab54 /bin/bash root<span>@1801a32aab54</span><span>:/</span><span># </span>
查看nginx目录
<span># cd /etc/nginx/</span> conf<span>.d</span>/ koi-utf mime<span>.types</span> nginx<span>.conf</span> uwsgi_params fastcgi_params koi-win modules/ scgi_params win-utf
可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled
继续查看nginx配置
<span># cat /conf.d/default.conf</span><span>server</span> { listen <span>80</span>; server_name localhost; <span>#charset koi8-r;</span><span>#access_log /var/log/nginx/log/host.access.log main;</span> location / { root /usr/share/nginx/html; <span>index</span><span>index</span>.html <span>index</span>.htm; } <span>#error_page 404 /404.html;</span><span># redirect server error pages to the static page /50x.html</span><span>#</span> error_page <span>500</span><span>502</span><span>503</span><span>504</span> /<span>50</span>x.html; location = /<span>50</span>x.html { root /usr/share/nginx/html; } <span>#...省略php-fpm配置,好长..</span> }
根目录配置: root /usr/share/nginx/html;
测试
<span># cd /usr/share/nginx/html</span><span># touch index.html</span><span># echo "test nginx in docker" >index.html</span>
php-fpm配置相关
'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了167 docker docker构建nginx容器系列问题,包括了docker,nginx方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
19.docker 数据卷容器
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
首先,创建一个命名的数据卷容器 dbdata:
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
然后,在其他容器中使用 --volumes-from
来挂载 dbdata 容器中的数据卷。
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
还可以使用多个 --volumes-from
参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容器来挂载数据卷。
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
注意:使用
--volumes-from
参数所挂载数据卷的容器自己并不需要保持在运行状态。
如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v
命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。具体的操作将在下一节中进行讲解。
20200206 Docker 5. Docker容器数据卷
Docker 5. Docker容器数据卷
是什么
先来看看Docker的理念:
- 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
一句话:有点类似我们Redis里面的rdb和aof文件
能干嘛
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
作用:
- 容器的持久化
- 容器间继承+共享数据
容器内添加数据卷
直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
示例:
docker run -it -v /outData:/inData centos
-v
命令有新建文件夹功能
查看数据卷是否挂载成功
docker inspect 容器ID
如果存在数据卷,从json中可以看出
...
"HostConfig": {
"Binds": [
"/outData:/inData"
],
...
容器和宿主机之间数据共享
类似于共享文件夹,文件夹内的文件和文件内容互通
容器停止退出后,主机修改后数据依然同步
命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
ro即read only,表示Docker容器对数据卷的权限为只读。
备注
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true
参数即可
DockerFile添加
根目录下新建mydocker文件夹并进入
可在Dockerfile中使用
VOLUME
指令来给镜像添加一个或多个数据卷VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
出于可移植和分享的考虑,用
-v 主机目录:容器目录
这种方法不能直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。File构建
在mydocker目录下创建dockerfile文件,内容如下:
# volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------success1" CMD /bin/bash
build后生成镜像
docker build -f /mydocker/dockerfile -t hwj/centos .
使用镜像生成容器
进入容器后可以发现在根目录存在两个数据卷目录
查看主机对应的目录地址
docker inspect 容器ID
返回的json串中有相关信息,这里与视频教程不同,应该是因为Docker版本差异导致
"Mounts": [ { "Type": "volume", "Name": "adc7baa50e75533e1fbeab169cdfe532c99b9ec5daf5e85c1b09e9898f6af9e3", "Source": "/var/lib/docker/volumes/adc7baa50e75533e1fbeab169cdfe532c99b9ec5daf5e85c1b09e9898f6af9e3/_data", "Destination": "/dataVolumeContainer1", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "94e57b312fc3e44ee6029b94af08ab265dea04a0ccf34ab717bd17eea0ac419f", "Source": "/var/lib/docker/volumes/94e57b312fc3e44ee6029b94af08ab265dea04a0ccf34ab717bd17eea0ac419f/_data", "Destination": "/dataVolumeContainer2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
容器间传递共享(--volumes-from)
以上面的DockerFile添加创建的镜像,先启动一个父容器dc01
在dataVolumeContainer2新增内容
启动容器dc02/dc03继承自dc01
docker run -it --name dc02 --volumes-from dc01 hwj/centos
回到dc01可以看到02/03各自添加的都能共享了
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
Docker 从入门到进阶四:Docker 容器数据卷
文章目录
-
- 容器数据卷?是什么
- 如何挂载容器卷
- 演示一:数据恢复
- 演示二:宿主机数据传入容器
- 读写规则
- 卷的继承和共享
容器数据卷?是什么
但凡是数据,都逃不开一个最基本的问题:数据丢了怎么办?
所以就衍生出各种备份方案。
Docker 也是如此,你就不怕哪天容器让人给删了吗?
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
如何挂载容器卷
其实这篇内容很简单,就讲一下什么是容器卷,以及怎么挂载,再演示一下就完了。
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
演示一:数据恢复
演示步骤:
1、启动 Ubuntu 容器
2、在启动时挂载容器卷
3、创建一个文件
4、关闭容器
5、删除容器
6、重新并启动容器并挂载容器卷
7、检查文件是否还存在
我对几条重要命令解释一下:
docker run -it --name myu --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash
这里我给它起了个名字,不起也可以,但是想到我自己都有名字,它没名字怪可怜的。
–privileged=true:Docker挂载主机目录访问。如果出现cannot open directory .: Permission denied,那就加上这个参数。
/tmp/myHostData:/tmp/myDockerData:在容器内 /tmp/myDockerData 目录下的所有文件及时同步到 宿主机内的 /tmp/myHostData 目录下,这两个路径可以是本不存在的,会自动创建。
可以看到,在我删除了原 myu 实例之后在启动容器,连目录都丢了,何况目录下的文件。
可以挂载多个目录,每次挂载都来个 -v 就好,下一章会看到。
演示二:宿主机数据传入容器
熟悉吗?我们以前使用 VMware 的时候,也都有从宿主机上传文件进 VMware 上的系统吧。
演示步骤:
1、确定容器未启动
2、在宿主机的挂载路径下新建文件
3、启动容器并挂载
4、查看文件是否出现在容器中
敲错命令了。。。mkdir 是创建目录。。。
演示步骤:
1、确定容器已启动
2、在宿主机的挂载路径下新建文件
3、查看文件是否出现在容器中
由此可见,这个容器卷可不仅仅是一个数据持久化的工具哦,它是可以双向通信的。
有个事儿忘了说,挂在之后一定要确定一下是否挂载上了,有个命令:
docker inspect 容器ID/容器名
看到有如下:
当然,我个人更喜欢直接再挂载路径下新建一个小文件,看它有没有通就知道了。
读写规则
容器卷也是可以设置读写规则的。默认是读写全开。
docker run -it --name myu --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash
等同于
docker run -it --name myu --privileged=true -v /tmp/myHostData:/tmp/myDockerData:rw ubuntu /bin/bash
如果这样写,就是只读权限:
docker run -it --name myu --privileged=true -v /tmp/myHostData:/tmp/myDockerData:ro ubuntu /bin/bash
只读权限下,容器只能从数据卷中读取数据,而不能将数据同步至数据卷中。
那有没有只写?很可惜,莫得。。。
卷的继承和共享
一个容器启动时,可以继承另一个容器的卷规则。
你可能会觉得,就那么几个字符都不愿意去 cv 一下嘛,还要去别的容器那边去继承来。
看似有点鸡肋,但是存在即合理不是吗?
毕竟我们现在容器卷就一个,看着简单,到下一篇我们把集群放上容器的时候你再看哈哈。
命令也很简单:
容器一完成和宿主机间的映射:
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
容器二继承容器一和宿主机间的映射:
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
呐,就这么简单我就不再多解释了吧。
这时候如果有眼尖的人很快就会想到,那如果容器一挂了呢?容器二和宿主机之间还能正常通信么?
可以自己玩玩试试。
本文同步分享在 博客“看,未来”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
今天关于Docker-0006(Docker数据卷容器)和docker 数据卷容器的讲解已经结束,谢谢您的阅读,如果想了解更多关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、19.docker 数据卷容器、20200206 Docker 5. Docker容器数据卷、Docker 从入门到进阶四:Docker 容器数据卷的相关知识,请在本站搜索。
本文标签: