(第3章)Docker核心原理解读(续)

文章目录

    • 1.Docker数据卷
    • 2.Docker网络基础
    • 3.Docker网络架构

1.Docker数据卷

  • 类似于mount操作,用户将一个文件夹作为volume挂载到容器上,可以将数据添加到容器中,以供其中的进程使用。
    多个容器可以共享同一个volume
  • 创建volume,挂载volume,以及使用Dockerfile添加volume,共享volume,珊瑚volume,备份恢复或迁移volume
1)创建volume
创建了一个指定名字的volume
docker volume creat --name vol_simle

挂载到容器的/data目录下
docker run -d -v /data ubuntu /bin/bash

创建一个指定名字的volume,并挂载到容器中的/data目录
docker run -d -v vol_simple: /data ubuntu /bin/bash

获取该volume在宿主机中该文件夹的位置等信息
docker volume inspect vol_simple

(2)挂载volume
创建一个指定名字的volume,并挂载到容器中的/data目录
docker run -d -v vol_simple: /data ubuntu /bin/bash

创建一个随机ID的volume,并将其挂载到/data下
docker run -d -v  /data ubuntu /bin/bash

将宿主机上的目录挂载到容器中
在/host/dir文件夹中的所有文件或文件夹都可以在容器的/container/dir文件夹下被访问,若镜像中的/container/dir文件夹下
有内容,将会被隐藏
docker run -v /host/dir:/container/dir ubuntu /bin/bash

将单个文件作为volume挂载到容器中
文件必须使用绝对路径
docker run -it --name vol_file -v /host/file:/container/file ubuntu /bin/bash

为容器添加多个volume
docker run -it --name vol_mult -v /data1 -v /data2 -v /host/dir:/container/dir ubuntu /bin/bash

(2)使用Dockerfile添加volume
若镜像中存在/data文件夹,该文件夹中的内容将全部被复制到宿主机中对应的文件夹中,并且依据容器中的文件
来设置合适的权限和所有者
VOLUME /data


Dockerfile中除了FROM指令的每一行都是基于上一行生成的临时镜像,运行一个容器,
执行一条指令并执行类似docker commit的命令得到一个新的镜像,docker commit的命令不会对挂载的volume进行保存
FROM ubuntu
RUN useradd foo
RUN mkdir /data && touch /data/file
RUN chown -R foo:foo /data
VOLUME /data

(3)共享volume
新创建的容器vol_use与之前创建的容器vol_simple共享volume,这个volume目的目录也是/data;
若被共享的容器有多个volume(eg:上面的vol_mult),新容器也将有多个volume,并且其挂载的目的目录也与vol_mult
docker run --rm -it --name vol_use --volumes-from vol_simple ubuntu /bin/bash

容器与多个已有容器共享volume
docker run --rm -it --name vol_use_mult --volumes-from vol_1 --volumes-from vol_2 ubuntu /bin/bash


创建一个挂载了volume的数据容器vol_data,该容器仅仅输出了一条提示后就停止运行以避免浪费资源。
接下来的两个容器vol_share1和vol_share2与这个数据容器共享了这个volume
docker run --name vol_data -v /data ubuntu echo "This is a data-only container"
docker run -it --name vol_share1 --volumes-from vol_data ubuntu /bin/bash
docker run -it --name vol_share2 --volumes-from vol_data ubuntu /bin/bash


(4)删除volume
只要在创建容器时挂载了volume,在/var/lib/docker/volumes下就会生成与volume对应的目录,
使用docker rm删除容器并不会删除与volume对应的目录。


只有当没有任何容器使用该volume时,该volume才能成功删除
docker volume rm <volume_name> 删除volume

下面的2种方法:只会对挂载在该容器上的未命名的volume进行删除,而对用户指定名字的volume进行保留
docker rm -v <container_name> 删除容器
docker run --rm ,--rm标签会在容器停止时,删除容器以及容器所挂载的volume

(5)备份恢复或迁移volume
备份volume方法:
方法1:利用docker inspect命令查找到/data在宿主机上对于的文件夹位置,复制其内容,利用tar打包
方法2:
vol_simple容器中包含了需要备份的volume
该命令启动了一个临时容器,该容器挂载了2个volume,第一个volume来自vol_simple容器的共享,即需要备份的volume
第二个volume将宿主机的当前目录挂载到容器的/backup下。
容器运行后,将要备份的内容(/data文件夹)备份到/backup/data.tar,
然后删除容器,备份后data.tar就留在了当前的目录
docker run --rm --volumes-from vol_simple -v $(pwd):/backup ubuntu tar cvf /backup/data.tar /data

恢复volume方法:
首先运行一个新容器作为数据恢复的目标
第二个指令:挂载了两个volume,第一个volume与要恢复的volume共享,第二个volume将宿主机的当前目录挂载到容器的/backup下
容器启动后,将这个存档文件中的/data恢复到根目录下,然后删除容器,恢复后的数据就在vol_bck的volume中
docker run -it --name vol_bck -v /data ubuntu /bin/bash
docker run -rm --volumes-from vol_bck -v $(pwd):/backup ubunttu tar xvf /backup/data.tar -C /

  • Docker的volume的本质是容器中的一个特殊的目录
    Docker会将宿主机上的指定目录(一个volume ID为名称的目录,或指定的宿主机的目录)挂载到容器中指定的目录上,挂载完成胡的宿主机目录和容器内的目录表现一致。
docker run -v /data busybox /bin/bash
指定容器里的/data目录为一个volume
将宿主机上的volume_id目录绑定挂载到rootfs中指定的挂载点/data上
mount("/var/lib/docker/volumes/volume_id/_data","rootfd/data","none",MS_BIND,NULL)

docker run -v /var/log:/data busybox /bin/bash
将宿主机上的/var/log目录绑定挂载到rootfs中指定的挂载点/data上
mount("/var/log","rootfs/data","none",MS_BIND,NULL)

容器内部进行只能看见以rootfs为跟的文件内容以及被mount到rootfs之下的目录
下面的data目录就是生成出来的volume挂载点
root@0a4b299bb8e8:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test.txt  tmp  usr  var
  • 创建volume原理
    (1)容器创建阶段
    (2)容器的启动阶段,libcontainer使用组装好的挂载点列表进行mount操作,完成volume的创建

  • volume相关的配置文件:该容器所使用的volumeID以及他们的可写情况
    位置:每个容器在/var/lib/docker/containers/容器ID/config.json

2.Docker网络基础

  • Docker公司在libnetwork中使用了CNM(Container Network Model),CNM定义了构建容器虚拟化网络的模型,还提供了可以用于开发多种网络驱动的标准化接口和组件
    (1)CNM的3个核心组件:
    沙盒:包含一个容器网络栈的信息,对容器的接口,路由和DNS设置进行管理
    端点:veth pair,Open vSwitch内部的端口或者相似设备
    网络:Linux bridge,VLAN等
    (2)CNM的5种内置驱动:bridge驱动,host驱动,overlay驱动,remote驱动,null驱动
    (第3章)Docker核心原理解读(续)_第1张图片

3.Docker网络架构

你可能感兴趣的:(C++,and,mysql)