zoukankan      html  css  js  c++  java
  • Docker基础-Docker数据管理

    1、数据卷

      数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。
      数据卷可以提供很多有用的特性:

    1.数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便;
    2.数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
    3.数据卷的更新不会影响镜像,解耦了应用和数据;
    4.卷会一直存在,直到没有容器使用,可以安全卸载它。

    1.在容器内创建一个数据卷

      在使用docker run命令的时候,使用-v参数在容器内创建一个数据卷。多次重复使用可以创建多个数据卷。
      举例如下:

    [root@docker docker]# docker run -itd --name nginx -v /nginxdata -p 80:80 nginx:latest 
    2951cdfdaa53a2a4e0f67ab93bdc395a3587ce09e498d73b7fc83ffac387ea65
    [root@docker docker]#
    [root@docker docker]# docker exec -it 2951cd /bin/bash
    root@2951cdfdaa53:/# ls
    bin  boot  dev    etc  home  lib    lib64  media  mnt  nginxdata  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@2951cdfdaa53:/#

      可以看到容器里内已经存在一个数据卷:nginxdata
      -p参数是暴露指定的容器服务端口到宿主机,其中 -p 80:80中,:前面的是宿主机的端口,:后面的是容器内暴露的端口,可以理解为将容器内暴露的端口绑定到宿主机。

    2.挂载一个主机目录作为数据卷

      使用-v参数也可以指定挂载一个本地目录到容器中去作为数据卷(推荐方式)。
      举例如下:

    [root@docker /]# docker run -itd --name nginx_3 -v /data/nginxdata/:/opt/nginxdata -p 8083:80 nginx:latest
    728014689c945412bc645d7039bbc8c0a33a2ab6812eec0fc21dfe21c19adf26
    [root@docker /]# docker exec -it nginx_3 /bin/bash
    root@728014689c94:/# ls
    bin  boot  dev    etc  home  lib    lib64  media  mnt  opt    proc  root  run  sbin  srv  sys  tmp  usr  var
    root@728014689c94:/# cd /opt/nginxdata/
    root@728014689c94:/opt/nginxdata# touch test.txt
    root@728014689c94:/opt/nginxdata# echo "write in container" > test.txt 
    root@728014689c94:/opt/nginxdata# exit
    [root@docker /]# cd /data/nginxdata/
    [root@docker nginxdata]# ls
    test.txt
    [root@docker nginxdata]# cat test.txt 
    write in container
    [root@docker nginxdata]#

      上面的:-v /data/nginxdata/:/opt/nginxdata是指将本地的/data/nginxdata/挂载到容器中的/opt/nginxdata作为数据卷。
      在容器nginx_3中的/opt/nginxdata目录中创建一个test.txt并写入"write in container"然后退出容器,在/data/nginxdata/中也存在这个文件和内容。

      当然,在本地写入数据之后,在容器中也是立即生效的:

    [root@docker nginxdata]# echo "write in local" >>./test.txt
    [root@docker nginxdata]# cat test.txt 
    write in container
    write in local
    [root@docker nginxdata]# docker exec -it nginx_3 /bin/bash
    root@728014689c94:/# cd opt/nginxdata/
    root@728014689c94:/opt/nginxdata# cat test.txt 
    write in container
    write in local
    root@728014689c94:/opt/nginxdata# 

    3.挂载一个本地文件作为数据卷

      -v参数也可以指定一个本地文件挂载到容器中作为数据卷(不推荐)。

    [root@docker ~]# docker run --rm -itd --name nginx_4 -v /data/nginxdata/index.html:/usr/share/nginx/html/index.html -p 8084:80 nginx:latest
    9838611b1230ad85c96a4215151c281199e330c4b101b9e13f4179976aa338b3
    [root@docker ~]# 

      把指定的index.html文件挂载到容器中nginx的网站空间/usr/share/nginx/html/中,并把原先的index.html替换掉了。
      注意:
        如果直接挂载一个文件到容器中,使用文件编辑工具,包括vi、vim或者sed --in-place的时候可能会造成文件inode的改变,从Dcker1.1.0起,会报错;推荐使用的方式是直接挂载文件所在的目录。

    2、数据卷容器

      如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
      首先,创建一个数据卷容器,并在容器内创建一个数据卷挂载到/dbdata:

    [root@docker ~]# docker run -it -v /dbdata --name dbdata centos:latest
    [root@695f96ac5b87 /]#

      查看/dbdata目录:

    [root@695f96ac5b87 /]# ls
    anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@695f96ac5b87 /]# cd dbdata/
    [root@695f96ac5b87 dbdata]# ls
    [root@695f96ac5b87 dbdata]# 

      在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷:
      创建db1和db2两个容器,都挂载在dbdata上,可以在两个容器中都能看到dbdata目录:

    [root@docker ~]# docker run -it --volumes-from dbdata --name db1 centos:latest 
    [root@6adc3ecfe19d /]# ls   
    anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@6adc3ecfe19d /]# exit
    exit
    [root@docker ~]# docker run -it --volumes-from dbdata --name db2 centos:latest 
    [root@c9cade8bc911 /]# ls
    anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@c9cade8bc911 /]# exit
    exit
    [root@docker ~]#

      在dbdata容器的dbdata目录中写入数据:

    [root@695f96ac5b87 /]# cd /dbdata/
    [root@695f96ac5b87 dbdata]# ls
    [root@695f96ac5b87 dbdata]# echo "write in dbdata:/dbdata" > test.txt
    [root@695f96ac5b87 dbdata]# cat test.txt 
    write in dbdata:/dbdata
    [root@695f96ac5b87 dbdata]#

      分别在db1和db2中查看:

         db1中查看:

    [root@docker ~]# docker exec -it db1 /bin/bash
    [root@6adc3ecfe19d /]# ls
    anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@6adc3ecfe19d /]# cd dbdata/
    [root@6adc3ecfe19d dbdata]# ls
    test.txt
    [root@6adc3ecfe19d dbdata]# cat test.txt 
    write in dbdata:/dbdata
    [root@6adc3ecfe19d dbdata]# echo "write in db1:/dbdata" >> test.txt 
    [root@6adc3ecfe19d dbdata]# cat test.txt 
    write in dbdata:/dbdata
    write in db1:/dbdata
    [root@6adc3ecfe19d dbdata]#

        db2中查看:

    [root@docker ~]# docker exec -it db2 /bin/bash
    [root@c9cade8bc911 /]# cd dbdata/
    [root@c9cade8bc911 dbdata]# ls
    test.txt
    [root@c9cade8bc911 dbdata]# cat test.txt 
    write in dbdata:/dbdata
    write in db1:/dbdata
    [root@c9cade8bc911 dbdata]# echo "write in db2:/dbdata" >> test.txt
    [root@c9cade8bc911 dbdata]# cat test.txt 
    write in dbdata:/dbdata
    write in db1:/dbdata
    write in db2:/dbdata
    [root@c9cade8bc911 dbdata]#

      最后在dbdata容器中查看分别在db1和db2中写入的数据:

    [root@695f96ac5b87 dbdata]# cat test.txt
    write in dbdata:/dbdata
    write in db1:/dbdata
    write in db2:/dbdata
    [root@695f96ac5b87 dbdata]#

      可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。
      举例如下:

    [root@docker ~]# docker run -itd --name db3 --volumes-from db1 centos:latest 
    3cb31e1771c26f3b1dc74b7e00091cf25576c32dbebf824a5b20dbe79e243930
    [root@docker ~]# docker exec -it db3 /bin/bash
    [root@3cb31e1771c2 /]# ls
    anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@3cb31e1771c2 /]#

       注意:

          1.使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
          2.如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v命令来指定同时删除关联的容器。

    3、利用数据卷容器来迁移数据

      可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。=

    1.备份

    [root@docker ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos:latest tar zcf backup/backup.tar dbdata

      命令解释:

    1.首先利用centos:latest镜像创建了一个名为worker的容器,使用--volumes-from参数让worker容器挂载dbdata容器的数据卷/dbdata,使用-v $(pwd):/backup参数来挂载本地当前目录到worker容器的/backup目录。
    2.worker容器启动后,使用了tar zcf backup/backup.tar /dbdata命令来将/dbdata下内容备份到/backup/backup.tar,即当前目录下会生成一个backup.tar的文件。

      查看本地当前目录:

    [root@docker ~]# ll
    total 525288
    -rw-------. 1 root root      1071 Jan 19  2017 anaconda-ks.cfg
    -rw-r--r--  1 root root       180 Nov 29 12:11 backup.tar
    -rw-r--r--  1 root root       109 Nov 29 10:00 daemon.json
    -rwxr-xr-x  1 root root        67 Nov 28 16:13 docker-pid
    [root@docker ~]# 

    2.恢复

      要将备份好的数据恢复到一个容器,先要创建一个带有数据卷的容器dbdata2,然后另建一个新的容器,挂载dbdata2的,并使用untar解压备份文件到所挂载的容器卷中。
      举例如下:

    [root@docker ~]# docker run -itd -v /dbdata --name dbdata2 centos:latest
    60919fece4a797d174b2c40228ccf09558a76d092500ea8428b7f6163fec49a9
    [root@docker ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup --name db4 centos:latest tar xf /backup/backup.tar

      在新的数据卷容器dbdata2中可以查案恢复结果:

    [root@docker ~]# docker exec -it dbdata2 /bin/bash
    [root@60919fece4a7 /]# ls
    anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@60919fece4a7 /]# cd dbdata/
    [root@60919fece4a7 dbdata]# ls
    test.txt
    [root@60919fece4a7 dbdata]# cat test.txt 
    write in dbdata:/dbdata
    write in db1:/dbdata
    write in db2:/dbdata
    [root@60919fece4a7 dbdata]# 
  • 相关阅读:
    Linux部署thinkphp5,nginx服务器一直访问index/index问题解决方法
    如何防止XSS攻击?
    centos7+nginx + php 部署多站点
    dubbo+spring+mybatis分布式框架的使用
    增删改查sql语句
    (转)linux内核参数注释与优化
    php+nginx环境配置注意事项
    vs installer 将.net framework 集成到安装包中
    Method not found: 'System.Data.Entity.ModelConfiguration.Configuration.XXX
    未能加载文件或程序集“XXX”或它的某一个依赖项。
  • 原文地址:https://www.cnblogs.com/jie-fang/p/7920201.html
Copyright © 2011-2022 走看看