开源基金会lsf和alf
什么是容器
· 统称来说,容器是一种工具,指的是可以装下其它物品的工具。
· linux容器是与系统其它部分隔开的一系列进程,从另一个镜像运行,并由该镜像提供进程所需的全部文件
特点
· 将应用程序封装成一个包标准化的单元用于实现开发运输和部署
· 容器提供的镜像包含了应用的所有依赖项,因而在从开发测试再到生产的整个过程中,它都具有可移植性和一致性
linux中容器所依赖的6中名称空间
需要依赖于6种名称空间来支持才能完成实现用户空间隔离技术
Name pace | Constant | Isolates |
---|---|---|
IPC | CLONE_NEWIPC | System V IPC,POSIX message queues进程间通信机制 |
Network | CLONE_NEWNET | Network devices(网络设备),stacks(网络协议栈),ports(接口),etc. |
Mount | CLONE_newns | Mount points(挂载点) |
PID | CLONE_NEWPID | Process IDs(进程ID树) |
User | CLONE_NEWUSER | User and group IDs(用户和组的ID) |
UTS | CLONE_NEWUTS | Hostname and NIS domain name(主机名NIS域 ) |
容器多进程资源分配Cgroup
分配机制
Cgroup将进程分成多个组,将有限的资源按量配额到不同的组中,避免资源被某个用户空间的某个或某些进程完全占用,达到公平分配资源的效果
分配方法
Control Groups(groups)管理的资源
名称 | 描述 |
---|---|
blkio | 块设备IO |
cpu | CPU |
cpuacct | CPU资源使用报告 |
cpuset | 多处理器平台上的CPU集合 |
devices | 设备访问 |
freezer | 挂载或恢复任务 |
memory | 内存用来及报告 |
perf_event | 对cgroup中的任务进行统一性能测试 |
net_cls | cgroup中的任务创建的数据报文的类别标识符 |
用户空间部署技术LXC
作用
▪ 将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。
▪ 通过统一的名字空间和共用API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器
▪ 通过安装的方式帮用户生成每一个用户空间(容器)的系统环境
缺点
迁移、使用、隔离做的不理想
LXC控制进程所使用的内核功能
lxc简单应用
什么是Docker
docker最初的实现就是基于LXC,由dotCloud公司在LXC基础上引入了镜像技术,使容器的迁移变得容易,所以docker就像名称那样(码头装运共),将容器从一个码头移动到另一个码头完成装卸的一套组件,并不是容器技术(容器特性是linux内核提供的),是一种让容器技术更加易用的技术。
Docker和传统虚拟化的区别
容器的优缺点
docker的组成
Docker objects
每个对象都可以被增删改查
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务
系统要求
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并且部分功能可能不太稳定
程序分类
包获取途径
安装
[root@hai7-1 ~]$yum install docker-ce
Error: Package: docker-ce-18.06.1.ce-3.el7.x86_64 (docker-ce-stable)
Requires: container-selinux >= 2.9
解决方案,先安装如下包[root@hai7-1 ~]$yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.66-1.el7.noarch.rpm
[root@hai7-2 ~]$docker info
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解决方案,将以下文件值修改为11. '可以命令行零时赋值修改'
[root@hai7-2 ~]$cat /proc/sys/net/bridge/bridge-nf-call-iptables
[root@hai7-2 ~]$cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
2. '永久修改,保存至配置文件'
[root@hai7-2 ~]$vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
3. '重新载入生效'
[root@hai7-2 ~]$sysctl -p /etc/sysctl.d/docker.conf
镜像加速器
[root@hai7-1 ~]$mkdir /etc/docker
编辑生成daemon.json文件,加阿里加速连接复制到文件内[root@hai7-1 ~]$vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://h480ply5.mirror.aliyuncs.com"]
}
[root@hai7-1 ~]$docker info
Registry Mirrors:
https://h480ply5.mirror.aliyuncs.com/
启动docker服务
相关文件:/usr/lib/systemd/system/docker.service
1. '通知systemd重载配置文件'
[root@hai7-1 ~]$systemctl daemon-reload
2. '启动服务'
[root@hai7-1 ~]$systemctl start docker
服务启动后,会将iptables的filter表的FORWARD链修改为默认drop,如果有需要可以修改回accept
'修改docker服务文件,需要重新载入systemctl和启动服务'
[root@hai7-1 ~]$vim /usr/lib/systemd/system/docker.service
[Service] <==在service块下,增加如下行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
查看docker版本
[root@hai7-1 ~]$docker version
查看docker信息
[root@hai7-1 ~]$docker info
Containers: 0 <==容器个数
Running: 0 <==运行中的个数
Paused: 0 <==暂停态个数
Stopped: 0 <==停止态个数
Images: 0 <==当前有多少个镜像
Server Version: 18.06.1-ce <==服务器版本
Storage Driver: overlay2 <==存储后端驱动,重要信息
Backing Filesystem: xfs <==建立在本地系统xfs上
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file <==日志驱动
Cgroup Driver: cgroupfs <==控制组的驱动
Plugins: <==启用的插件
Volume: local <==存储卷插件
Network: bridge(桥接式) host(宿主机) macvlan null(没有) overlay(叠加网络) <==网络插件
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog<==日志插件
Swarm: inactive <==docker内部的容器编排工具
Runtimes: runc <==运行时环境
。。。省略
Insecure Registries: <==非安全仓库
127.0.0.0/8
Registry Mirrors: <==加速器,上面配置生效的
https://h480ply5.mirror.aliyuncs.com/
Live Restore Enabled: false
在新版中docker命令进行二三级子命令分组,仍然支持直接执行(例如docker rmi和docker image rm效果相同),常用命令图示,圆形表示docker运行状态,长方形表示执行的操作
异常终止状态OOM:非计划内终止,容器所在的宿主机被耗尽,当内核察觉内存有被耗尽的危险时会执行结束最耗内存进程的操作
container process exited:遇到BUG或者其他问题崩溃
容器管理命令
[root@hai7-1 ~]$docker container
pause
:暂停
unpause
:恢复暂停
create
:创建一个新容器
start
:启动一个或多个已停止的容器
run
:在新容器中运行命令
attach
:附加到正在运行的容器上
restart
:重新启动容器
stop
:停止一个或多个正在运行的容器,相当于kill信号15
kill
:杀掉一个或多个容器,相当于kill信号9
rm
:容器删除时,其相关数据也会删除
exec:在正在运行的容器中运行命令
[root@hai7-1 ~]$docker exec web1 ifconfig
如果想要进入容器多执行几个命令 ,需要其内部运行shell命令,需要附着在控制台上[root@hai7-1 ~]$docker exec -it web1 /bin/bash
bash-4.4# <==进入交互界面
bash-4.4# pwd
/usr/local/apache2 <==httpd登录交互式界面默认路径
bash-4.4# cd conf
bash-4.4# ls
extra httpd.conf magic mime.types original <==配置文件所在,可以修改
创建容器
运行在前台
,只要容器内的唯一进程离开了控制台,此容器就挂掉了1. '启动容器'
[root@hai7-1 ~]$docker container run --name a1 -it alpine:3.8
2. '启动后如果输入exit(退出容器后,进程就会关掉,使用命令查看,处于Exited状态'
[root@hai7-1 ~]$docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
622f2a8614fb alpine:3.8 "/bin/sh" About a minute ago Exited (0) 10 seconds ago a1
docker container logs
查看[root@hai7-1 ~]$docker container run --name web1 -d httpd:2.4.37-alpine
启动容器时,加–rm选项,会在退出后自动删除,而不是处于Exited状态[root@hai7-1 ~]$docker container run --name a1 -it --rm alpine
1. '拖一个httpd镜像'
[root@hai7-1 ~]$docker pull httpd:2.4.37-alpine
2. '查看此镜像详细信息,找到CMD,可以通过自行修改镜像中默认运行的应用程序,方法就是在docker run时后面加上自定义的命令'
[root@hai7-1 ~]$docker image inspect httpd:2.4.37-alpine
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"httpd-foreground\"]" <==-foreground默认启动为前台
终止容器
docker container stop
exit
或者Ctrl+d
退出终端,容器也会终止,使容器处于Exited状态启动已终止的容器
[root@hai7-1 ~]$docker container start a1
[root@hai7-1 ~]$docker container attach a1
CTRL+p
同时按,然后按CTRL+q
,关联回去命令同上删除容器
docker container rm
[root@hai7-1 ~]$docker container rm -f a1
docker container prune
获取容器的日志信息
[root@hai7-1 ~]$docker container logs web1
查看容器中进程占用情况,在容器外可使用命令直接查看
[root@hai7-1 ~]$docker top web1
动态查看容器资源消耗情况统计信息
以下写法效果相同
[root@hai7-1 ~]$docker stats
[root@hai7-1 ~]$docker container stats
列出所有容器,处于停止状态的容器需要加-a
docker ps
docker container ls
1. '启动httpd容器,使用默认网络,连接至连接docker0,会分配一个172.17的地址'
[root@hai7-1 ~]$docker container run --name web1 httpd:2.4.37-alpine
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, `using 172.17.0.3`. Set the 'ServerName' directive globally to suppress this message
2. "在宿主机上查看httpd服务,显示已经运行"
[root@hai7-1 ~]$curl 172.17.0.3
<html><body><h1>It works!</h1></body></html>
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
Docker镜像含有启动容器所需要的文件系统及其内容,因此,其用
于创建并启动docker容器
获取可用镜像信息命令
docker search:在Docker Hub搜索需要的镜像
[root@hai7-1 ~]$docker search busybox
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 1396 [OK]
管理镜像命令
[root@hai7-1 ~]$docker image
[root@hai7-1 ~]$docker image pull alpine
拖一个带标签的版本
[root@hai7-1 ~]$docker image pull alpine:3.8
1. '删除带标签的版本'
[root@hai7-1 ~]$docker rmi alpine:3.8 <==rmi和image rm执行效果相同
2. '删除最新版本'
[root@hai7-1 ~]$docker image rm alpine
docker images
ls -a
: 显示所有信息ls --no-trunc
:不要截断信息长度ls --digests
:显示完整格式信息完整的REPOSITORY写法是带有服务器地址和端口号的,没有指明说明是在dockhub上
[root@hai7-1 ~]$docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
| 所属仓库 | 标签 |镜像唯一的标识符|创建时间| 镜像大小 |
[root@hai7-1 ~]$docker image inspect alpine
"ContainerConfig": {
"Cmd": [
"/bin/sh", <==定义容器运行时启动的默认进程
"-c",
"#(nop) ",
"CMD [\"/bin/sh\"]"
docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
[root@hai7-1 ~]$docker image tag httpd:2.4.37-alpine httpd:2.4
指向非dockhub仓库的完整写法[root@hai7-1 ~]$docker image tag httpd:2.4.37-alpine reg.moli.com:8443/moli/httpd:2.4
删除标签使用删除命令即可[root@hai7-1 ~]$docker image rm reg.moli.com:8443/moli/httpd:2.4
镜像的结构
采用分层构建机制,最底层叫做bootfs,其上为rootfs
运行分层构建镜像的文件系统Aufs
advanced multi-layered unification filesystem:高级多层联合文件系统
镜像引用
docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
[root@hai7-1 ~]$docker pull httpd:2.4.37
Docker Registry
Docker Registry,支持分层镜像文件的存储驱动服务器,让用户试图去收发镜像,存储镜像的一个集中式服务器。
Storage Driver:aufs,overlayfs(整合进CentOS7.5后的内核),dm(性能不佳)
Docker Hub介绍
自定义镜像
前面说过每启动一个容器,就会生成专用的读写层,删除容器此层所有数据也会丢失,如果想要保存此层内容,就需要将此层保存为镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
[root@hai7-1 ~]$docker container run --name b1 -it busybox
# vi /data/web/htdocs/index.html
保存容器b1的专属层[root@hai7-1 ~]$docker container commit b1
查看保存的专属层镜像文件,此时没有标签[root@hai7-1 ~]$docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 36cf41410893 19 seconds ago 1.15MB
为镜像文件打标签[root@hai7-1 ~]$docker image tag 36cf41410893 httpd:v0.0.1
运行保存的镜像文件[root@hai7-1 ~]$docker container run --name b1-1 -it httpd:v0.0.1
/ # ls /data/web/htdocs/index.html <==可以看到原专属读写层的数据
[root@hai7-1 ~]$docker pull centos:7
'启动容器centos-base1'
[root@hai7-1 ~]$docker container run --name centos-base1 -it centos:7
[root@3753003e8899 /]# yum install net-tools <==在容器中安装网络基本工具
[root@3753003e8899 /]# yum install httpd php php-mysql
[root@3753003e8899 /]# yum install vim
[root@3753003e8899 /]# vim /var/www/html/info.php
<?php
phpinfo();
?>
[root@3753003e8899 /]# yum clean all
[root@3753003e8899 /]# rm -rf /var/cache/yum/
[root@hai7-1 ~]$docker commit centos-base1 centos-httpd:v0.1-2.4
[root@hai7-1 ~]$docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-httpd v0.1-2.4 91cb79322cc9 About a minute ago 333MB
[root@hai7-1 ~]$docker commit -a "moli -c 'CMD ["/usr/sbin/httpd","-DFOREGROUND"]' -p centos-base1 centos-httpd:v0.2-2.4
'查看镜像文件详细信息'
[root@hai7-1 ~]$docker image inspect centos-httpd:v0.2-2.4
"Cmd": [
"/usr/sbin/httpd", <==默认启动信息确认修改
"-DFOREGROUND"
'在宿主机上启动镜像,查看主页'
[root@hai7-1 ~]$docker run --name web4 centos-httpd:v0.2-2.4
推送镜像
将自定义的镜像推到仓库中,供其他人使用,命令为push
,示例为阿里云仓库
[root@hai7-1 ~]$docker tag centos-httpd:v0.2-2.4 registry.cn-qingdao.aliyuncs.com/v9/httpd:v0.2-2.4
[root@hai7-1 ~]$docker login --username=v9 registry.cn-qingdao.aliyuncs.com
[root@hai7-1 ~]$docker push registry.cn-qingdao.aliyuncs.com/v9/httpd
[root@hai7-1 ~]$docker logout registry.cn-qingdao.aliyuncs.com
分发镜像的方法
[root@hai7-1 ~]$docker image save centos-httpd:v0.2-2.4 centos-httpd:v0.1-2.4 -o /data/centos-httpd.tar
[root@hai7-1 ~]$scp /data/centos-httpd.tar 192.168.50.102:/data
[root@hai7-2 ~]$docker load -i /data/centos-httpd.tar
查看载入的镜像
[root@hai7-2 ~]$docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-httpd v0.2-2.4 5ec41b218157 About an hour ago 333MB
centos-httpd v0.1-2.4 91cb79322cc9 About an hour ago 333MB
示例:基于busybox基础镜像做一个web服务器
[root@hai7-1 ~]$docker run --name b1 -it busybox
/ # mkdir /data/veb/htdocs -p <==建页面文件目录
/ # vi /data/veb/htdocs/index.htm <==编辑页面文件
<h1>httpd server incontainer.<h1>
/ # ifconfig <==查看IP地址
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
/ # httpd -h /data/veb/htdocs -f <==启动测试,-f表示占据前台
[root@hai7-1 ~]$curl 172.17.0.3
<h1>httpd server incontainer.<h1>
[root@hai7-1 ~]$docker commit -a "v9" -c 'CMD ["/bin/sh","-c","/bin/httpd -h /data/veb/htdocs -f"]' -p b1 tiny-httpd:v0.0.3
[root@hai7-1 ~]$docker network ls
NETWORK ID NAME DRIVER SCOPE
将容器加入bridge,桥接式网络
b11f05b96e91 bridge bridge local
将容器加入到 host,表示使用宿主机的网络名称空间
c2caf08f51be host host local
容器加入none,就是封闭式容器(隔离网络)
272843f84c4f none null local
[root@hai7-1 ~]$docker network inspect host
-d
:要创建和管理的网络使用的驱动(bridge(桥接)、host(共享宿主机网络)、macvlan(基于mac地址划分的vlan网络)、null(无网络)、overlay(叠加网络,隧道式网络,如VXLAN,jre)),使用桥接式网络的话--gateway strings
:来指定网关是谁,网关指对应的子网网络配置给桥的地址;--ip-range strings
:地址池,不指定将使用除网关外的所有地址;--ipam-driver string
:获取地址的方式,建议使用默认的地址分配器( default);--subnet strings
:定义使用的子网,可以不指定,会使用默认的ip地址计算[root@hai7-1 ~]$docker network create -d bridge --gateway 10.0.0.1 --subnet 10.0.0.0/16 mynet0
1. '查看网络,可以看到创建的新网络'
[root@hai7-1 ~]$ifconfig
br-febdc741449f: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.0.0.1 netmask 255.255.0.0 broadcast 10.0.255.255
2. '支持修改网卡名,修改网络名,会导致docker网络连接失败'
[root@hai7-1 ~]$ifconfig br-febdc741449f down <==先禁用网络
[root@hai7-1 ~]$ip link set br-febdc741449f name docker1 <==修改为docker1
3. '将容器加入此网络中'
[root@hai7-1 ~]$docker run --name c1 --network mynet0 -it --rm busybox
4. '同时指定2个网络,只有后面的bridge网络生效'
[root@hai7-1 ~]$docker run --name c1 --network mynet0 --network bridge -it --rm busybox
1. '启动容器时指定网络'
[root@hai7-1 ~]$docker run --name c1 --network mynet0 -it --rm busybox
2. '启动后的容器,使用connect再接入一个网络,此时容器就会增加到3个网络,bridge/mynet0/l0'
[root@hai7-1 ~]$docker network connect bridge c1
将容器c1重网络mynet0断开
[root@hai7-1 ~]$docker network disconnect mynet0 c1
[root@hai7-1 ~]$docker network rm mynet0
[root@hai7-1 ~]$docker run --name b1 -it --network none busybox
/ # ifconfig <==网络中只有lo
lo inet addr:127.0.0.1 Mask:255.0.0.0
[root@hai7-1 ~]$docker run --name b2 -it --network bridge --rm busybox
/ # ifconfig <==网络中有两个网卡,lo和bridge
eth0 inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
lo inet addr:127.0.0.1 Mask:255.0.0.0
[root@hai7-1 ~]$docker run --name b1 -it --network bridge --rm busybox
/ # mkdir /data <==建httpd页面文件目录
/ # vi /data/index.html <==编辑页面文件
/ # httpd -h /data <==启动httpd服务,指定页面文件路径
启动第二个容器,将网络接入第一个容器b1中,引用格式为--network container:b1
,b1为引用的容器,前半段为固定格式[root@hai7-1 ~]$docker run --name b2 -it --network container:b1 --rm busybox
/ # wget -O - -q localhost <==访问当前终端,-表示输入到当前终端
hai <==看到b1的web页面,看上去与b1为同一个主机
[root@hai7-1 ~]$docker run --name b3 -it --network host --rm busybox
/ # ifconfig <==所见网络为宿主机网络地址
docker0 inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
ens33 inet addr:172.20.124.254 Bcast:172.20.255.255 Mask:255.255.0.0
lo inet addr:127.0.0.1 Mask:255.0.0.0
-A PREROUTING -d 主机IP -j DNAT --to-destination 容器IP
-A PREROUTING -d 主机IP -p {tcp|udp} --dport 主机端口 -j DNAT --to-destination 容器IP:容 器端口
所有地址
的一个动态端口-p
1. '运行一个httpd镜像,将80端口暴露出去'
[root@hai7-1 ~]$docker run --name web6 --rm -p 80 centos-httpd:v0.2-2.4
2. '查看容器映射至主机的端口,访问主机web服务指定以下端口,访问的就是容器中的httpd'
[root@hai7-1 ~]$docker port web6
80/tcp -> 0.0.0.0:32768
3. 'docker自动生成了iptables的dnet规则'
[root@hai7-1 ~]$iptables -t nat -nvL
Chain DOCKER (2 references)
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32768 to:172.17.0.2:80
-p :
[root@hai7-1 ~]$docker run --name web6 --rm -p 80:80 centos-httpd:v0.2-2.4
[root@hai7-1 ~]$docker port web6
80/tcp -> 0.0.0.0:80 <==容器监听端口为宿主机的80端口
-p ::
1. '指定映射到宿主机的192.168.50.101地址上,两个冒号,第一个冒号表示宿主机的随机端口'
[root@hai7-1 ~]$docker run --name web6 --rm -p 192.168.50.101::80 centos-httpd:v0.2-2.4
2. '查看映射端口'
[root@hai7-1 ~]$docker port web6
80/tcp -> 192.168.50.101:32768
-p ::
[root@hai7-1 ~]$docker run --name web6 --rm -p 192.168.50.101:8080:80 centos-httpd:v0.2-2.4
[root@hai7-1 ~]$docker port web6
80/tcp -> 192.168.50.101:8080
[root@hai7-1 ~]$docker run --name v1 -it -v /data busybox
/ # cd data <==进入/data目录
/data # cp /etc/hostname ./ <==拷贝一个文件到此目录下
/data # cat hostname
2ad52290759d <==容器的ID号
写法1:'在容器详细信息中找到Mounts字段'
[root@hai7-1 ~]$docker container inspect v1
"Mounts": [
{
"Type": "volume", <==类型
"Name": "82e12def5db0adbd6ef1cd553347d2676d2f88813d17dfc2171d615e137cf87b", <==存储卷名 "Source":"/var/lib/docker/volumes/82e12def5db0adbd6ef1cd553347d2676d2f88813d17dfc2171d615e137cf87b/_data", <==源,挂载默认在宿主机上的路径
"Destination": "/data", <==容器内路径
"Driver": "local", <==表示使用本地文件系统
"Mode": "",
"RW": true,
"Propagation": ""
}
写法2:'使用-f选项,显示一个指定的杰森格式数据项内部的模板机制'
[root@hai7-1 ~]$docker container inspect -f {{.Mounts}} v1
[{volume 82e12def5db0adbd6ef1cd553347d2676d2f88813d17dfc2171d615e137cf87b /var/lib/docker/volumes/82e12def5db0adbd6ef1cd553347d2676d2f88813d17dfc2171d615e137cf87b/_data /data local true }]
[root@hai7-1 ~]$docker run --name v2 -it -v /data/volumes2/v2:/data busybox
[root@hai7-1 v2]$docker inspect -f {{.Mounts}} v2
[{bind /data/volumes2/v2 /data true rprivate}]
[root@hai7-1 ~]$docker run --name v2 -it -v /data/volumes/v2:/data busybox
[root@hai7-1 ~]$docker run --name v1 -it -v /data/volumes/v2:/data busybox
--volumes-from
选项1. '首先为容器v1创建存储卷/data/volumes/v1'
[root@hai7-1 ~]$docker run --name v1 -it -v /data/volumes/v1:/data busybox
2. '在容器v2中应用v1的存储卷'
[root@hai7-1 ~]$docker run --name v1 -it --volumes-from v1 busybox
docker volume COMMAND
[root@hai7-1 ~]$docker volume ls
DRIVER VOLUME NAME
local 80637fd1b7ab86e711c71820b528bb91e2fc13a85477cb911da62a652ed3dc84
inspect:列出指定容器VOLUME NAME
的详细信息[root@hai7-1 ~]$docker volume inspect 80637fd1b7ab86e711c71820b528bb91e2fc13a85477cb911da62a652ed3dc84
动态存储卷在宿主机上存放的目录
"Mountpoint": "/var/lib/docker/volumes/80637fd1b7ab86e711c71820b528bb91e2fc13a85477cb911da62a652ed3dc84/_data",
rm:删除存储卷[root@hai7-1 ~]$docker volume rm VOLUME NAME