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退出,即停止容器运行
.Docker 日志
#docker log <container_ID | container_name>
.复制文件 将宿主机上的文件复制到容器内的目录下(容器可以用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.
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..tar.gz /usr/local/src
WORKDIR /usr/local/src/nginx-1.8.
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
CMD ["nginx"]
创建新的容器镜像文件 在dockerfile文件所在同级目录下执行如下命令
# docker build -t centos/nginx:v1 . # docker images
启动容器//把宿主机90端口映射到容器内的80端口
# docker run -d --name NGINX -p : centos/nginx-1.8.: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
.docker修改镜像标签名
# docker tag <镜像名 | 镜像ID> <新的镜像标签名>
11.container端口映射
启动container
# docker run -d -p : 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 centos bash //如果有别的参数,可以继续添加
查看cpu分配结果
# cat /sys/fs/cgroup/cpu/docker/<容器id>/cpu.shares
注意:稍后我们启动多个容器,测试一下是不是只能使用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 , //注意: -cp 不能分开使用
pid 's current affinity list: 0-3
pid 's current affinity list: 1,2
查看进程使用的cpu
语法: taskset -cp <进程号>
# taskset -cp 955pid 's current affinity list: 1,2
正常情况下一般都是每个进程使用全部的cpu
top 命令参数
top进去后,按i,是去掉僵尸进程和闲置的进程 ; 按c,是显示命令名的全路径,全名
例4:物理机一共有16个核心,创建的容器只能用0,1,2这三个内核。
配置
# docker run -dit --name apache --cpuset-cpus - 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. # ./configure # make -j && make install
物理机上的测试(如下):
例6:产生2个cpu进程,2个io进程,20秒后停止运行
#stress -c -i --verbose -t
这个工具 能一下把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 , --cpu-shares docker.io/centos bash #docker run -dit --name docker20 --cpuset-cpus , --cpu-shares 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 --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 --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
在物理机查看:
# watch -n “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 是同步到磁盘里(这个实验不准确,再说)
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 : -v /yangsir:/usr/share/nginx/html:ro -v /yangsir/log:/var/log/nginx yangsir/nginx:1.11.
映射的宿主机不存在的目录为避免出问题,尽量提前先创建
具体的参考网址
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)
五.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指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移,具体用法请参考其他文章。