Docker服务安装以及使用

Docker服务安装和使用

Docker相关介绍

A)虚拟化

虚拟化我们可以简单的理解为一种资源管理方式。有如下几种虚拟化的方式:
完全虚拟化:对底层硬件实现完全虚拟。例如:Vmware Workstation
部分虚拟化:只对部分硬件资源的虚拟。
操作系统级虚拟化:内核通过创建多个虚拟操作系统实例来隔离各个进程。
docker就是属于操作系统级的虚拟化。

B)Docker的理解

docker的思想来源于集装箱,试问集装箱解决了什么问题?
试想,在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会相互影响。那么我就不需要专门运送水果的船和专门运送化学物品的船了。只要这些货物在集装箱里装的好好的,那我就可以用一艘大船把它们都运走。
docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮,而docker就是集装箱。

C)Docker的特点

docker 容器之间是相互隔离的。
docker 比较轻量,启动非常快,秒级实现。资源利用率比较高,一台机器可以跑上千个docker容器,内核级别的虚拟化,不需要额外的hypevisor支持。
内核版本最低2.6.32-573.18.1.el6,centos至少在6.5或以上,容易迁移,平台依赖性不强,更快的交付和部署,一次创建配置,任意地方运行

D)Docker三板斧

1. 镜像
Docker在英语当中的本意是“物件/码头工人”,docker容器的意思为物件的容器。关于镜像,举个简单的例子,我们经常安装的windows操作系统,先要从网上下载ISO镜像文件,经解压后才能安装和使用。Docker也是一样,我们要向创建docker容器,就需要创建容器的类似于ISO镜像文件的docker镜像文件。

2. 容器
关于容器,大家肯定并不陌生。没错,docker容器就是来管理不同架构的应用程序的。从本质上来说,容器是从镜像创建的运行实例。容器与容器之间是相互隔离的,每个容器都是保证安全的平台。

3. 仓库
仓库是集中存放镜像文件的场所,但是在这里要区分两个概念:仓库和仓库服务注册器。仓库注册服务器往往存放着多个仓库,每个仓库又包含着多个镜像。
仓库分为公开仓库和私有仓库,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快速的访问。
除此之外,用户可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。

容器、镜像、仓库三者转换关系如下:

 

 

本人的docker纯手工源码编译镜像存储:https://hub.docker.com/search?q=yangsir&type=image

 一. docker 安装方法

1. docker参考网址

Docker 官方网站                   -------->         https://www.docker.com/
Docker中文文档                    -------->         http://www.dockerinfo.net/document
Docker安装地址 --------> https://docs.docker.com/engine/install/centos Docker命令网址 --------> http://www.cnblogs.com/ivictor/archive/2015/09/08/4791274.html 注意:容器追求的是速度快,容器是用来跑服务的,提供计算能力,不是用来存储大量文件的 Dockerhub : 是 docker 官方的镜像存储站点

2.  Docker网络分析

网络几种模式简介如下:
Host: 相当月VMware中的桥接模式网络,与宿主机同一个网络,使用宿主机的IP和端口,不会虚拟出自己的网卡,配置自己的IP,虚拟出自己的网卡。
Bridge(默认): 相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡,通过docker0网桥以及Iptables nat表配置与宿主机通信。
None: 该模式将容器放置在它自己的网络栈中,该模式关闭了容器的网络功能,在个别情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
Container: 新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
自定义网络: 一般为了避免和主机内网ip冲突,都会自定义bridge网络或者其他网络类型(由于生产环境用的阿里云,所以基本上都采用自定义Bridge网络)

3.  centos7.X 安装方法

方法一:
yum  remove docker docker-common docker-selinux  docker-engine
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum  install  -y  yum-utils  device-mapper-persistent-data  lvm2  docker-ce
systemctl start docker
# 官方源
# yum-config-manager   --add-repo   https://download.docker.com/linux/centos/docker-ce.repo
//扩展:
//想安装最新版本的 Docker CE 请使用以下命令:
yum-config-manager --enable docker-ce-edge
yum  -y install  docker-ce

方法二:
//使用脚本安装
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
systemctl start docker
--------------------------
注:修改默认存储路径
//修改docker.services文件
cat /usr/lib/systemd/system/docker.service
    //在里面的EXECStart的后面增加后如下:
    ExecStart=/usr/bin/dockerd --graph /app/docker

//若想对默认使用的网段进行修改,添加修改配置如下:(前提:IP尽量调整为不同于宿主机网段的ip地址,虽然网络是隔离的,但是也有不可知的故障出现,有时会令你很崩溃)/
cat  /etc/docker/daemon.json
    {"bip":"192.168.0.1/24"}

4.  修改docker安装源

如果默认安装的docker,下载镜像比较慢时,可以进行修改docker源

Docker官方中国区 docker源
https://registry.docker-cn.com

ustc docker源
https://docker.mirrors.ustc.edu.cn

//推荐使用 json 配置文件的方式,默认为daemon.json 
cat /etc/docker/daemon.json { "registry-mirrors":["https://registry.docker-cn.com"] }
//重新加载docker服务 ----------------------------------------------------------------------------------- 问题: 如果下载镜像出现中断,如下报错 read tcp 50.17.62.194:443: connection reset by pee 解决办法:(建议换上面提供的docker源后,并且添加强制解析IP) dig registry.docker-cn.com //找出对应解析ip cat /etc/hosts registry.docker-cn.com 106.14.52.175 //重新加载服务

二. docker 用法实战

     docker 常用参数
               -i            以交互模式运行容器,通常与-t 同时使用;
               -t           为容器重新分配一个伪输入终端,通常与-i同时使用
               --name  容器实例名    //容器命令语法(运行时,指定容器名字)
               --h         自定义一个主机名(启动时进行定义,这里的h,就是hostname)
               -c          后面接待完成的命令

1. 下载centos镜像方法

//下载 OS7.X系统镜像,后面需要添加版本+日期,个别系统镜像是没有的
docker   pull  centos:7.2.1511

//下载OS6.X系统镜像,后面只需要添加版本就行,还可以下载6.9版本,个别系统镜像是没有的
docker  pull  centos:6.8

2. 容器重命名

docker rename 旧容器名 新容器名                   //随时可以改名,但不要瞎改
docker  run  -it  centos    bash               //这种方式,用exit退出,即停止容器运行

3. Docker 日志

docker log <container_ID | container_name>

4. 复制文件 将宿主机上的文件复制到容器内的目录下(容器可以用ID或名字来表示)

docker   cp   a.sql   web1:/root

5. 连接容器四种方法(不推荐第三种)

1) docker exec -it                      这种是重新建立一个伪装输入终端,退出后,容器依然运行
2) docker exec web yum install apache   这种是可以在物理机上执行,容器里的安装命令或其他的命令
3) docker attach <容器名>                这种连接一旦退出,容器意味着就停止了           note:如果这里连接上后,想要退出但不停止该容器,有一个快捷键“Ctrl + p + q”
4) ssh连接                               需要在容器里 安装 openssh-server
    a) //如果 还有出现自动闪退(退出)的现象,可以修改一下配置文件如下;如果没有问题就不要修改了
       cat /etc/ssh/sshd_config
           PermitRootLogin yes
           UsePAM no
b) //宿主机上控制容器内的命令使用 Eg:docker exec centos ls /

6. 删除 container | image

docker rm    <container_ID | container_name>
docker rm -f <container_ID | container_name>            强制删除,无论是否处于运行状态

//若同一个镜像ID具有多个不同的镜像名字,有弃用的镜像,可以删除(弃用的镜像名) 或 (弃用的镜像名)+ (镜像ID),不能单独强制删除镜像ID,否则,所有的镜像全部删除了
//删除方法如下:
docker  rmi  <image_name>     删除弃用的镜像名
docker  rmi  -f  <imange_id>  强制删除此镜像ID以及所依赖关联的所有镜像,切记谨慎操作,正常情况下,有容器在用镜像,镜像是删除不掉的

7. 导出本地镜像                 

语法: docker   save   -o   <导出的镜像名>.tar    本地镜像名

docker save  yangsir/centos  >  <image_name>.tar             
或
docker save  -o centos-httpd-docker-image.tar    centos:httpd

 8. 导入本地镜像

docker load  -i centos-httpd-docker-image.tar   
或
docker load  <  centos-httpd-docker-image.tar

9. 修改镜像标签

docker tag <镜像名 | 镜像ID> <新的镜像标签名>

10. 端口映射

    启动container   

docker run -d -p 9000:80 centos:httpd bash -c “/usr/local/bin/start.sh”
注意: -p 9000:80 把容器中的80端口映射到物理机上的9000端口
     -c         主要是启动添加进去的 httpd脚本
     -c “while true; do httpd ; done”     //也可以这样来启动

查看端口映射

docker port <container_ID | container_name>

映射完成后,用宿主机ip加映射端口就能访问容器的网站页面

容器里如果不能查看 ip 可以安装一个软件

yum install -y net-tools

 11. docker容器默认存储空间的修改

      只能在运行容器时,指定;不指定,默认是10G

        --storage-opt size=?               按Tab键,size就会出来

  eg:如下进行启动的时候,注意顺序一定要把 这个“--storage-opt size=20G” 放到 前面,而且,这个存储空间大小的配置也是有要求得,太小的话,会提示错误,容器启动创建失败

12. diff检查发生变化的文件或目录

docker diff container

这些变化包括添加(A-add),删除(D-delete),修改(C-change)等

 13.  查看容器运行的状态

docker inspect --format {{.State.Running}} jenkins    //已存在并且启动中的容器状态
  true
docker inspect --format {{.State.Running}} jenkins    //已存在并未启动的容器状态
  false
docker inspect --format {{.State.Running}} nginx      //不存在的容器状态
  Error: No such image, container or task: nginx

 14.  docker创建自定义网络

创建网络的方法:
Usage:    docker network COMMAND
Commands:
  connect       Connect a container to a network
  create        Create a network
  disconnect    Disconnect a container from a network
  inspect       Display detailed information on one or more networks
  ls               List networks
  rm             Remove one or more networks
思路:容器无论是否在运行的状态,均可以进行创建并配置使用自定义的网络。
     如果不指定网络,默认用的是“bridge”,也就是172.17.0.0网段,建立连接后,里面会多一个新的网段,默认的网络依然是存在的,但不影响使用,如果想撤销自定义的网段使用,默认的网段(bridge)就可以用了
     当然,在启用新的自定义的网段后,原来的也可以去掉
     默认启动的容器是用bridge网段的,如果一旦取消仅用的bridge网段,重启容器是有问题的,会报错,需要添加网络,进行重启(至少有一个网络)

查看现有的所有网络。Docker默认用的是bridge,默认的网段是不允许创建固定ip的容器的,自定义的网路是可以配置
//docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1ebcc9d9be03        bridge              bridge              local               
733756d48cff        host                host                local               
7ab8126c1468        my_test             bridge              local               
29430ad2ad04        network_1           bridge              local               
12bd23dceb37        none                null                local               

注意:若想要使用自定义的网络,自己配置固定ip到容器里面,需要注意几点:
    1)在创建自定义网络时,需要配置自定义subnet子网掩码,启动容器时方能用此网卡进行配置固定的指定的容器IP,否则是不允许创建
    2)在创建自定义网络时,也可以不配置subnet子网掩码,但是用此网络创建的容器ip,均是不固定的ip,也不能随意指定

因此,如果不需要配置固定ip的网络,可以参考如下:
//创建自定义的 network_2 网络
docker network  create  network_2 

//如果,需要配置固定,指定的容器ip,可以参考如下,创建网络 network_3,并且配置子网掩码
docker network  create  network_3  --subnet 192.168.5.0/24  

//配置容器使用自定义网络,并配置固定的指定容器IP,附: --net 等同于  --network
docker run -d --name web_test -p 90:80 --net network_3 --ip 192.168.5.10 docker.io/nginx:latest 

//配置 web2容器使用自定义的 network_2 网络 
docker network connect network_2  web2

//取消web2容器使用自定义的network_2 网络 
docker network disconnect network_2 web2
 
//显示一个或多个网段的详细信息
docker   network   inspect   network_2

//删除一个或多个网络
docker network   rm  network_2

=================================================================
维护docker虚拟网卡
eg:创建了类似于docker0的多余的虚拟网卡,需要删除

//用ip命令使docker0网卡down掉,再执行删除虚拟网卡
ip  link  set  dev  docker0  down
brctl delbr docker0
 linux-如何识别孤立的veth接口以及如何删除它们

//查找所有的veth接口  //建议找对veth再进行删除,或者先删除veth接口,再删除虚拟网卡
ifconfig | grep veth

//删除veth网络设备的错误操作方法:
  ifconfig veth55d245e down
  brctl delbr veth55d245e
            can't delete bridge veth55d245e: Operation not permitted<br><br>

//正确的操作删除veth接口的方法,veth接口不是桥接器,所以当然你不能用brctl删除它
ip link delete vetheb7a591

 

三. docker容器资源配额控制

1.  启动docker容器时,指定cpu,内存,磁盘性能等的硬件资源使用份额

        Docker 通过cgroup 来控制容器使用的资源,包括cpu,内存,磁盘三大方面,基本覆盖了常见的资源和使用量控制。

        为什么要进行硬件配额? 当多个容器运行时,防止某容器把所有的硬件都占用了。(比如一台被黑的容器)

  例1:给容器实例分配512M 权重的cpu使用份额

docker run --help | grep cpu-shares
        -c,--cpu-shares int cpu shares (relative weight)
cpu配额参数:
        -c,--cpu-shares int 在创建容器时指定容器所使用的cpu份额值。

        cpu-shares 的值不能保证可以获得1个vcpu或者多少GHz的cpu资源,仅仅只是一个弹性的加权值,不是绝对的,是相对的。

        默认情况下,每个docker容器的cpu的份额都是1024.单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器的cpu加权的效果才能体现出来。

  例如,:两个容器A,B的cpu份额分别为1000和500,在cpu进行时间片分配的时候,容器A比容器B多一倍的机会获得cpu的时间片,但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU时间片,

              比如容器A的进程一直是空闲的,即使它的cpu份额是有50,它也可以独占整个主机的cpu资源。

      

  cgroups 只在容器分配的资源紧缺时, 也就是说 在需要对容器使用的资源进行限制时,才会生效。因此,无法单独根据某个容器的cpu份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的cpu分配和容器中进程运行情况。

  例2:给容器实例分配512权重的cpu使用份额
         参数: --cpu-shares 512

docker run -dit --cpu-shares 512 centos bash               //如果有别的参数,可以继续添加

  查看cpu分配结果

cat /sys/fs/cgroup/cpu/docker/<容器id>/cpu.shares
    512

  注意:稍后我们启动多个容器,测试一下是不是只能使用512份额的cpu资源。单独一个容器,看不出来

2. CPU core 核心控制

  参数: --cpuset 可以绑定cpu

  对多核数cpu的服务器,docker还可以控制容器运行限定使用哪些cpu内核和内存节点,即使用--cpuset-cpus 和--cpuset-mems参数。对具有NUMA拓扑(具有多cpu,多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器

  只有一个内存节点,则--cpuset-mems 的配置基本上不会有明显效果。

  扩展: taskset命令
  taskset 设定cpu亲和力, taskset能将一个或多个进程绑定到一个或多个处理器上运行。
  参数:
          -c , --cpu-list 以列表各是显示和指定cpu

          -p, --pid 在已经存在的pid上操作

  例3:设置只在1和2号cpu运行sshd进程程序

  配置cpu

  先查找对应的pid ,再进行设置

ps -aux | grep sshd

taskset -cp 1,2 955                         //注意: -cp 不能分开使用
pid 955's current affinity list: 0-3
pid 955's current affinity list: 1,2

  查看进程使用的cpu

  语法: taskset -cp <进程号>

taskset -cp 955pid 955's current affinity list: 1,2

  正常情况下一般都是每个进程使用全部的cpu

   

  top 命令参数

          top进去后,按i,是去掉僵尸进程和闲置的进程    ;   按c,是显示命令名的全路径,全名


  例4:物理机一共有16个核心,创建的容器只能用0,1,2这三个内核。

  配置

docker run -dit --name apache --cpuset-cpus 0-2 centos:latest bash

  查看是否配置成功(三种方法检验)

          第一种: cat /sys/fs/cgroup/cpuset/docker/<容器ID>/cpuset.cpus
                         0-2

          第二种: 进入容器内, 执行taskset -cp 1

          第三种: 在物理机执行docker exec web taskset -cp 1


3. cpu配额控制参数的混合使用

  当上面这些参数中时,cpu-shares控制只发生在容器竞争同一个内核的时间片时,如果通过

  cpuset-cpus                         指定容器A使用内核0,容器B只使用内核1,在主机上只有这两个容器使用对应内核的情况,它们各自占用全部的内核资源,cpu-shares没有明显效果。

  cpu-period,cpu-quota           这两个参数一般联合使用,在单核情况或者通过cpuset-cpus强制容器只用一个cpu内核的情况下,即使cpu-quota超过cpu-period,也不会使容器使用更多的cpu资源。

  cpuset-cpus, cpuset-mems  只在多核,多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的

  cpuset-cpus                          指定容器A使用内核0,容器B只使用内核1,在主机上只有这两个容器使用对应内核的情况,它们各自占用全部的内核资源,cpu-shares没有明显效果。

  cpu-period,cpu-quota           这两个参数一般联合使用,在单核情况或者通过cpuset-cpus强制容器只用一个cpu内核的情况下,即使cpu-quota超过cpu-period,也不会使容器使用更多的cpu资源。

  cpuset-cpus, cpuset-mems  只在多核,多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的


  例5:测试cpuset-cpus 和cpu-shares 混合使用运行效果,就需要一个压缩压力测试工具stress来让容器实例把cpu跑满。(stress工具)

  Linux 系统压力测试软件stress 。可以测试系统cpu/memory/IO/disk 的负载

  安装方式(yum安装)

yum install -y epel-release
yum install -y stress

  安装stress,进行压力测试(源码安装)

cd stress-1.0.4  &&   ./configure  &&   make  && make install

      

       

  物理机上的测试(如下):

  例6:产生2个cpu进程,2个io进程,20秒后停止运行

stress -c 2 -i 2 --verbose -t 20 

  这个工具 能一下把cpu跑满(针对的是2个cpu的物理机)

  查看如下

       

  接下来,在两个容器实例里进行测试

  例7:测试cpuset-cpus和cpu-shares混合使用运行效果,就需要一个压力测试工具stress来让容器实例cpu跑满。当跑满后,会不会去其他cpu上运行。如果没有在其他cpu上运行,说明cgroup资源限制成功

  例8:创建两个容器实例docker10和docker20. 让docker10和docker20只运行在cpu0和cpu1上,最终测试一下docker10和docker20使用cpu的百分比。

     

  创建两个容器实例

docker run -dit --name docker10 --cpuset-cpus 0,1 --cpu-shares 512 docker.io/centos bash  
docker run -dit --name docker20 --cpuset-cpus 0,1 --cpu-shares 1024 docker.io/centos bash

  有些命令 可以从 本机上 拷贝到 docker 容器里来使用,容器里没有make命令

  可以在物理机编译好,然后,分别拷贝到容器里

docker cp /usr/local/bin/stress docker10:/
docker cp /usr/local/bin/stress docker20:/

  测试1:进入docker10容器

  容器里总共使用物理机2个cpu

./stress -c 2 --verbose -t 10m

  

  在物理机上使用top命令按 1 快捷键查看,每个cpu使用情况:

     

  能看到只在cpu0和cpu1上运行,说明成功了

  测试2:进入docker20

  使用stress测试进程是不是只在cpu0,1上运行,且docker20上运行的stress使用cpu百分比是docker10的2倍     (注:这样的设置 ,没有人竞争时,cpu可以用到100%,如果有人竞争,则会按照--cpu-shares配置的比例来分配cpu的使用情况)

./stress -c 2 --verbose -t 10m

           

   (注:两个容器只在cpu0,1上运行。且能看到如上2:1的份额比,说明--cpu-shares限制资源成功)

  例9:动态修改,cpu1的cpu.shares 改为512

    

    

4. 当容器命令运行结束后,自动删除容器

  --rm 不能 和 -d 同时使用

  应用场景:
              在某些环境下,可能需要大量的新建docker虚拟机,然后仅仅运行几秒钟,然后就彻底删除,如运行单元测试等,测试弹性云计算,需要创建1万台虚拟机,运行1个小时,模拟双11的压力,1小时候自动删除

docker run -it --rm --name web centos sleep 5

  在物理机查看:

watch -n 1 “docker ps | grep web”

  结果是过了5秒后该容器自动删除

5.内存
  -m | --memory=    #限制容器能使用的物理内存大小.单位:k, m, g; 若设置一个容器可用内存为4m,若容器使用超过,将被kill掉.

  --memory-swap=    #要使用它,必须先使用 -m 选项,否则它不生效.
    若设置: -m 7G --memory-swap=10G,则表示Swap+Ram=10G, Swap=10-7=3G,即可使用3G的Swap内存.
    若设置: -m 7G --memory-swap=7G,  则表示不使用Swap内存.即 若设置这两个参数值相同,表示禁用SWAP.
    若设置: -m 7G --memory-swap=0,       则表示SWAP未设置, 则若DockerHost启用了SWAP,则表示容器可用的SWAP大小=2*RAM的大小.
    若设置: -m 7G --memory-swap=-1,      则表示DockerHost上启用了Swap,则容器可使用的全部的SWAP大小.

  例10,允许容器使用的内存上限位10G:

docker run -dit -m 7G --memory-swap=10G  centos bash  

   

6. IO

    

       

     

     

  此处的  sync  是同步到磁盘里(这个实验不准确,再说)

   

     

       

四.数据卷和数据卷容器

参考网址
http://www.jb51.net/article/97826.htm

docker启动nginx服务的时候,是不需要用到  /bin/bash ,centos镜像需要用

docker run --name my-nginx -d -p 80:80 -v /yangsir:/usr/share/nginx/html:ro -v /yangsir/log:/var/log/nginx   yangsir/nginx:1.11.1


具体的参考网址
https://www.lvtao.net/config/docker-nginx.html

具体思路:

    首先,创建一个Nginx容器,拷贝其配置文件,记下日志,家目录以及配置文件的路径

    其次,删除刚创建的容器

    再次,用最完整的命令将 配置文件,家目录,日志的路径映射到宿主机上来执行,如上

         -v <宿主机目录>:<容器内目录>    {note:这样的 映射数据卷, 即使 把容器删掉了,数据映射到宿主机的数据依然存在(详细说明看“删除volumes”)}

容器中管理数据主要有两种方式:

    1)数据卷
    2)数据卷容器
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用

如果删除了挂载的容器(包括dbdata,db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用Docker rm -v命令来指定同时删除关联的容器。

利用数据卷容器迁移数据

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

 

删除volumes

针对这种删除volume有效果的,本人只是针对第一种创建数据卷的方式做过实验
第一种方法                                                                                                              第二种方法:这种指定目录作为数据卷的,下面介绍的删除volume的方式行不通,是删不掉                           

                                                                                                               

 

这个很重要,如果你已经使用docker rm 来删除你的容器,那可能有很多的孤立的volume仍在占用着空间;

Volume只有在下列情况下才能被彻底删除:


在删除最后一个关联数据卷的容器上必须加上-v参数

docker rm -v container

结果如下:

 

当你执行docker rm -v my_container 命令时,该volume数据卷里的数据不会被删除

容器也可以与其他容器共享volume。

docker run --name my_container -v /some/path ...
docker run --name my_container2 --volumes-from my_container ...

上面的命令将告诉docker从第一个容器挂载相同的volume到第二个容器,它可以在两个容器之间共享数据。

如果你执行docker rm -v my_container 命令,而上方的第二容器依然存在,那么volume不会被删除,如果你不使用docker rm -v my_container2命令删除第二个容器,那么volume数据会一直存在

扩展: 此处若没了最初的数据容器(my_container),只要有至少一个共享容器,都能延用--volumes-from my_container2来创建下一个共享容器

 

Docker容器备份、恢复、和迁移

https://linux.cn/article-5967-1.html

迁移容器同时涉及到了备份和恢复,我们可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,首先我们将把容器备份为Docker镜像快照(commit)。然后,该Docker镜像或者是被推送到了Docker注册中心,或者被作为tar包文件保存到了本地

(save)。如果我们将镜像推送到了Docker注册中心,我们简单地从任何我们想要的机器上使用 docker run 命令来恢复并运行该容器。但是,如果我们将镜像打包成tar包备份到了本地,我们只需要拷贝或移动该镜像到我们想要的机器上,加载该镜像并运行需要的容

器即可(load)

  

 

posted @ 2020-11-05 17:47  淡淡定定  阅读(760)  评论(0编辑  收藏  举报