docker容器安装及使用技巧

Docker容器的安装和使用

A)首先是关于虚拟化

虚拟化我们可以简单的理解为一种资源管理方式。有如下几种虚拟化的方式:

1.完全虚拟化:对底层硬件实现完全的虚拟。例如:Vmware Workstation

2.部分虚拟化:只对部分硬件资源的虚拟。

3.操作系统级虚拟化:内核通过创建多个虚拟操作系统实例来隔离各个进程。

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://www.docker.com/

Docker中文文档                    -------->         http://www.dockerinfo.net/document

Docker命令网址                    -------->         http://www.cnblogs.com/ivictor/archive/2015/09/08/4791274.html           

注意:容器追求的是速度快,容器是用来跑服务的,提供计算能力,不是用来存储大量文件的

Dockerhub : 是 docker 官方的镜像存储站点 

 

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

 

 一. docker 安装方法

1.  centos6.x 安装方法

yum install -y epel-release

yum install -y docker-io

2. centos7.X 安装方法

Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令

yum  install  -y  docker 

--------------------------
注:修改默认存储路径

修改docker.services文件
vim /usr/lib/systemd/system/docker.service
#在里面的EXECStart的后面增加后如下:
ExecStart=/usr/bin/dockerd --graph /app/docker

 

  若想对默认使用的网段进行修改,添加修改配置如下:

前提:IP切勿与宿主机同网段冲突
# vim  /etc/docker/daemon.json
    {"bip":"192.168.0.1/16"}
重启docker服务
#systemctl restart docker

3. 修改docker安装源

如果默认安装的docker,下载镜像比较慢时,可以进行修改docker源
Docker官方中国区 docker源 https:
//registry.docker-cn.com
ustc docker源 https://docker.mirrors.ustc.edu.cn //推荐使用 json 配置文件的方式,默认为/etc/docker/daemon.json # vim /etc/docker/daemon.json { "registry-mirrors":["https://registry.docker-cn.com"] }
重新加载docker服务
# systemctl   restart  docker

-----------------------------------------------------------------------------------
问题:  
如果下载镜像出现中断,如下报错
read tcp 50.17.62.194:443: connection reset by pee

解决办法:(建议换上面提供的docker源后,并且添加强制解析IP
# dig
registry.docker-cn.com //找出对应解析ip
# vim  /etc/hosts
registry.docker-cn.com 106.14.52.175

再次重新加载docker服务
# systemctl   restart  docker
二. 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)如果 还有出现自动闪退(退出)的现象,可以修改一下配置文件如下;如果没有问题就不要修改了

# vim /etc/ssh/sshd_config
    PermitRootLogin yes
    UsePAM no

       重启ssh服务,杀掉,/usr/sbin/sshd 执行就好

     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 image制作镜像(两种方法)                                                  

    方法1: 通过已存在的镜像或容器,创建新的镜像。

     语法: docker    commit     <container_ID | container_name>       <new_image_name>:<tag>

                  将安装好的容器打包成镜像,保存container 的当前状态到image后,生成对应的image      

                  注:无论容器什么状态执行打包均可,然后可以根据这个容器镜像,接着进行启动一个新的容器(虽然没有影响,不过推荐关闭容器进行创建镜像)

# docker commit   264117d8cf64    centos_nginx:v1       通过容器ID进行创建新镜像

# docker commit   centos-nginx    centos_nginx:v2 通过容器名称进行创建新镜像

    方法2: docker build           

 

                  案例1:  docker build    使用dockerfile 文件自动化制作image(简单源码安装nginx)

                  创建dockerfile如下:

# vim  dockerfile
FROM centos:6.8 MAINTAINER yangjw 2018.03.13 RUN yum install -y wget gcc gcc-c++ make openssl-devel pcre* RUN useradd nginx ## ADD 命令上传后,会自动解压,这是跟copy的最大的区别 RUN wget http://nginx.org/download/nginx-1.8.1.tar.gz ADD nginx-1.8.1.tar.gz /usr/local/src WORKDIR /usr/local/src/nginx-1.8.1 RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module && make -j 3 && make install RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf ENV PATH /usr/local/nginx/sbin:$PATH EXPOSE 80 CMD ["nginx"]

                   创建新的容器镜像文件   在dockerfile文件所在同级目录下执行如下命令

# docker  build   -t  centos/nginx:v1  .

# docker images

 

                   启动容器//把宿主机90端口映射到容器内的80端口

# docker  run  -d  --name  NGINX  -p 90:80  centos/nginx-1.8.1:v1

                   测试:

# curl -I  宿主机IP:90   

或者

浏览器中访问 宿主机IP:90

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

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

 9.导入本地镜像

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

10.docker修改镜像标签名

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

11.container端口映射

    启动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

 12.docker容器默认存储空间的修改(只能在运行容器时,指定,不指定,默认是10G)

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

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

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

#docker diff container

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

 14. 查看容器运行的状态

# 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

 15. 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网段,重启容器是有问题的,会报错,需要添加网络,进行重启(至少有一个网络)

查看现有的所有网络 //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
# docker  run -d  --name web_test -p 90:80 --network
network_3  --ip 192.168.5.10    docker.io/nginx:latest
附: --net 等同于  --network

配置 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

错误的操作方法:
# ifconfig veth55d245e down
# brctl delbr veth55d245e
    can't delete bridge veth55d245e: Operation not permitted

 正确的操作删除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 的负载

  官网网址
  http://people.seas.harvard.edu/~apw/stress/

  安装stress,进行压力测试

# cd stress-1.0.4

# ./configure

# make -j 2 && 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.内存
        Docker提供参数 -m , --memory=”” 限制容器的内存使用量。

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

# docker run -dit -m 128M centos bash  

   

6.IO

    

       

     

     

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

   

     

       

7.Docker 修改移动默认存储位置

  首先,停掉docker服务以及所有容器,复制拷贝docker目录成另外一个名字

       其次,将拷贝的目录移动到目标地,然后,将原始的改成非docker 的目录,以免冲突

       再次,将目标地址的docker目录软连接到原始的目录下

  操作步骤如下:

  第一步要先把docker 服务给 stop 在进行拷贝,移动,等操作

       

    就ok

====

 

四.数据卷和数据卷容器

参考网址
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。

1| docker run --name my_container -v /some/path ...
2| 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)

 

五.Docker镜像迁移(也可称docker家目录迁移)

参考网址
http://blog.csdn.net/pipisorry/article/details/51330126

镜像迁移操作,切记,要在docker服务停止下进行

大概思路:

    停服务---->添加磁盘---->挂载到目录下---->把目录挂载到/var/lib/docker目录下---->启服务
    检查用 df -h /var/lib/docker

这里的 挂载目录有两种方法

先将磁盘挂载到/data/docker下,在挂载目录

    其一,mount --bind /data/docker /var/lib/docker          //将前者挂载到后者目录下

    其二,#cat /etc/fstab                                               //新添加

             /data/docker /var/lib/docker none bind 0 0
             #mount -a                                                    //重新挂载一下

如此,默认的/空间不足情况就得以 迁移添加新磁盘解决了

 

六.Dockerfile文件使用方法

Dockerfile 有以下指令选项:
1. FROM <image name>
2. MAINTAINER <author name>
3. RUN <command>
4. ADD <src> <dest>
5. COPY <src> <dest>
6. CMD <三种如下>
7. EXPOSE <port>
8. ENTRYPOINT <>
9. WORKDIR <>
10. ENV <>
11. USER <>
12. VOLUME <>
13. ONBUILD <>
解析:
1.FROM略          基础镜像

2.MAINTAINER  维护者的记录信息

3.RUN                 执行shell命令

4.ADD:复制文件指令。它有两个参数<src>和<dest>。

              该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。

注意:  

         ①如果执行docker build – < somefile即通过标准输入来创建时,ADD指令只支持url方式,另外如果url需要认证,则可以通过RUN wget …或RUN curl …来完成,ADD指令不支持认证。

         ②<src>路径必须与Dockerfile在同级目录或子目录中,例如不能使用ADD ../somepath,因为在执行docker build时首先做的就是把Dockerfile所在目录包含子目录发送给docker的守护进程。

         ③如果<src>是一个url且<dest>不是以”/“结尾,则会下载文件并重命名为<dest>。

         ④如果<src>是一个url且<dest>以“/”结尾,则会下载文件到<dest>/<filename>,url必须是一个正常的路径形式,“http://example.com”像这样的url是不能正常工作的。

         ⑤如果<src>是一个本地的压缩包且<dest>是以“/”结尾的目录,则会调用“tar -x”命令解压缩,如果<dest>有同名文件则覆盖,但<src>是一个url时不会执行解压缩。

 

5.COPY略

          复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>。当使用本地目录为源目录时,推荐使用 COPY

COPY和ADD的不同就是:ADD多了自动解压和支持URL路径的功能

 

6.CMD                      -------->        语法:①CMD ["executable", "param1", "param2"]                   #将会调用exec执行,首选方式                   

                                |_____>        语法 : ②CMD ["param1", "param2"]                                         #当使用ENTRYPOINT指令时,为该指令传递默认参数

                                |_____>        语法 : ③CMD <command> [ <param1>|<param2> ]                #将会调用/bin/sh -c执行

指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给

ENTRYPOINT传递参数。

 

7.EXPOSE: 指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在连接不同的容器(使用–link参数)时使用这些信息

 

8.ENTRYPOINT         -------->      语法:①ENTRYPOINT ["executable", "param1", "param2"]       #将会调用exec执行,首选方式

                                 |_____>       语法:②ENTRYPOINT command param1 param2                    #将会调用/bin/sh -c执行

 指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个ENTRYPOINT指令,则只有最后一个指令有效。ENTRYPOINT指令中指定的命令(exec执行的方式)可以通过docker run来传递参数,例如docker run

<images> -l启动的容器将会把-l参数传递给ENTRYPOINT指令定义的命令并会覆盖CMD指令中定义的默认参数(如果有的话),但不会覆盖该指令定义的参数,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],当通过docker run <image>启动容器时该容器会运行ls -a

/etc命令,当使用docker run <image> -l启动时该容器会运行ls -a -l命令,-l参数会覆盖CMD指令中定义的/etc参数。

 

9.WORKDIR               -------->       语法:WORKDIR /path/to/workdir

指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd

最终输出的当前目录是/data/logs。

 

10.ENV                       -------->       语法:ENV <key> <value>

ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加–env <key>=<value>参数来修改。

注意:最好不要定义那些可能和系统预定义的环境变量冲突的名字,否则可能会产生意想不到的结果。

 

11.USER                     -------->        语法:USER [username|uid]

USER指令用于设置用户或uid来运行生成的镜像和执行RUN指令

 

12.VOLUME                -------->        语法: VOLUME ["samepath"]

VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移,具体用法请参考其他文章。

 

转载于:https://www.cnblogs.com/yangsirs/p/6646306.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值