GVKun编程网logo

Docker-0006(Docker数据卷容器)(docker 数据卷容器)

10

针对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 数据卷容器)

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

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

docker构建nginx容器系列问题


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>-&gt;</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" &gt;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 数据卷容器

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容器数据卷

20200206 Docker 5. Docker容器数据卷

Docker 5. Docker容器数据卷

是什么

先来看看Docker的理念:

  • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。

为了能保存数据在docker中我们使用卷。

一句话:有点类似我们Redis里面的rdb和aof文件

能干嘛

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

作用:

  • 容器的持久化
  • 容器间继承+共享数据

容器内添加数据卷

直接命令添加

 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添加

  1. 根目录下新建mydocker文件夹并进入

  2. 可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

    VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

    说明:

    出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能直接在Dockerfile中实现。
    由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

  3. File构建

    在mydocker目录下创建dockerfile文件,内容如下:

    # volume test
    FROM centos
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished,--------success1"
    CMD /bin/bash
  4. build后生成镜像

    docker build -f /mydocker/dockerfile -t hwj/centos .
  5. 使用镜像生成容器

    进入容器后可以发现在根目录存在两个数据卷目录

  6. 查看主机对应的目录地址

    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)

  1. 以上面的DockerFile添加创建的镜像,先启动一个父容器dc01

    在dataVolumeContainer2新增内容

  2. 启动容器dc02/dc03继承自dc01

    docker run -it --name dc02 --volumes-from dc01 hwj/centos
  3. 回到dc01可以看到02/03各自添加的都能共享了

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

Docker 从入门到进阶四:Docker 容器数据卷

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 容器数据卷的相关知识,请在本站搜索。

本文标签: