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)