English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Descripción detallada del controlador de almacenamiento de Docker
最近做项目,期间对Docker存储驱动不熟悉,于是在网上找资料,并解决了,这里就记录下。
目的
Docker是一个开源的应用容器引擎,主要利用Linux内核namespace实现沙盒隔离,用Cgroup实现资源限制。Docker用于统一开发和部署的轻量级Linux容器,试图解决“依赖地狱”问题,把依赖的服务和组件组合起来,类似船舶使用的集装箱,达到快速安装部署。
1. Docker的基本架构—Client和Daemon
让我们先搞明白docker的基本架构和启动过程,其实Docker采用了C/S架构,包括客户端和服务端。Docker daemon作为服务端接受来自客户的请求,并处理这些请求(创建、运行、提交容器)。 客户端和服务端在一个机器上,通过RESTful API来进行通信。 具体到使用的过程中,就是在执行service docker start后,在主机(host)上产生docker deamon守护进程,在后台运行并等待接收来自客户端的消息(即输入的docker命令,如docker pull xxx,docker run …,docker commit xxx),实现与docker deamon的交互。当启动docker服务后,可以看到docker进程。
Default
[root@localhost ~]# ps -aux | grep docker root 11701 0.0 0.4 359208 16624 ? Ssl 21:05 0:00 /usr/rm centos:/docker -d -H fd:// --selinux-enabled --insecure-registry 186.100.8.216:5000 root 11861 0.0 0.0 113004 2256 pts/0 S+ 23:01 0:00 grep --color=auto docker
Explicar esto, principalmente porque cuando se especifica el sistema de archivos, es necesario hacerlo primero en /etc/sysconfig/configurar el controlador de almacenamiento específico de Docker (esto se escribirá en un Blog especial), luego arrancar el daemon de Docker, y no se puede operar a través de los parámetros de la orden run. También se puede configurar directamente en la línea de comandos del host mediante docker -d.
2.Método de almacenamiento de Docker - Controlador de almacenamiento
La parte central del modelo de Docker es el uso efectivo del mecanismo de imágenes en capas, que se puede heredar a través de las capas. Se pueden crear varios tipos de imágenes específicas basadas en imágenes base (sin imagen padre). Los diferentes contenedores de Docker pueden compartir algunas capas del sistema de archivos base, y además de las capas de cambios exclusivos, se mejora significativamente la eficiencia de almacenamiento. El mecanismo principal es el modelo de capas y la unión de varios directorios en un sistema de archivos virtual (unir varios directorios en un solo sistema de archivos virtual, según este artículo). En cuanto al almacenamiento de imágenes, Docker utiliza varios controladores de almacenamiento diferentes, incluyendo: aufs, devicemapper, btrfs y overlay (según el sitio web oficial). A continuación, se realiza una breve introducción a diferentes controladores de almacenamiento.
AUFS
AUFS (Another UnionFS) es un sistema de archivos combinado. AUFS admite establecer permisos de solo lectura (readonly), de lectura y escritura (readwrite) y de escritura (whiteout) para cada directorio miembro (similar a las ramas de Git).-permisos, y AUFS tiene un concepto similar de jerarquía, que permite modificar lógicamente las ramas de permisos de solo lectura de manera incremental (sin afectar a la parte de solo lectura). El único driver de almacenamiento de AUFS puede compartir ejecutables y bibliotecas compartibles entre contenedores, por lo que AUFS es una excelente opción cuando se ejecutan miles o cientos de contenedores con el mismo código de programa o bibliotecas.
Device mapper
Device mapper es Linux 2.6 Un marco de mecanismo de mapeo lógico a físico proporcionado en el núcleo, en el que los usuarios pueden establecer estrategias de gestión de recursos de almacenamiento según sus necesidades (ver detalles). El controlador de device mapper creará un10un archivo simple de 0G que contiene su imagen y contenedor, cada contenedor está limitado en10de volumen G (Nota: se crea automáticamente un archivo disperso utilizando loopback, específicamente) /var/lib/docker/devicemapper/data y metadata bajo devicemapper, que pueden expandirse dinámicamente). Puede ajustar el tamaño del contenedor de Docker, consulte el ) específico. Puede usar el parámetro al iniciar el daemon de docker-s especificar el driver, es decir, puede docker -d -s devicemapper configurar el driver de almacenamiento de docker. Primero, desactive el servicio de docker, ejecute el comando:
Default
[root@localhost ~]# docker -d -s devicemapper INFO[0000] +job serveapi(unix:///var/ejecutar/docker.sock) INFO[0000] Escuchando HTTP en unix (/var/ejecutar/docker.sock) INFO[0000] +job init_networkdriver() INFO[0000] -job init_networkdriver() = OK (0) INFO[0000] Cargando contenedores: inicio. .... INFO[0000] Cargando contenedores: completado. INFO[0000] daemon de docker: 1.4.0 4595d4f/1.4.0; execdriver: native-0.2; graphdriver: devicemapper INFO[0000] +job acceptconnections() INFO[0000] -job acceptconnections() = OK (0)
Además, al iniciar el contenedor, docker puede especificar –storage-Parámetro opt, pero actualmente solo devicemapper puede aceptar la configuración de parámetros. Pronto habrá un Blog específico.
BTRFS
El driver de Btrfs en docker build puede ser muy eficiente. Sin embargo, al igual que devicemapper, no admite el almacenamiento compartido entre dispositivos (ver sitio web oficial). Btrfs admite la creación de instantáneas (snapshot) y clonación (clone), y permite gestionar fácilmente múltiples dispositivos físicos. (Para obtener más información, consulte la introducción de IBM sobre Btrfs)
Overlay
Overlay es muy similar a AUFS, pero tiene mejor rendimiento, excelente uso de la memoria y ahora se ha integrado en el núcleo de Linux3.18了。具体使用命令: docker –d –s overlay
官网的Note: It is currently unsupported on btrfs or any Copy on Write filesystem and should only be used over ext4 partitions.
3 Docker目录结构
Docker两个最重要的概念是镜像和容器。那么我们pull下来的镜像的存储在哪里呢?镜像运行容器启动后,我们的操作修改的内容存储在哪里呢?因为具体的驱动不同,所以最终的实现效果不同。下面我们以Device Mapper存储driver为例,分析下docker的存储结构。
1. 进入 /var/lib/docker 目录,列出内容:
Default
[root@localhost ~]# cd /var/lib/docker/ [root@localhost docker]# ls containers devicemapper execdriver graph init linkgraph.db repositories-devicemapper tmp trust volumes
根据目录的内容,可以明显地看到是使用了devicemapper driver。
注:以下显示的文件夹都是在/var/lib/docker下的。
2. pull的镜像文件存在哪个文件夹下呢?( 参考 )
pull的镜像信息保存在了graph文件夹下,镜像的内容存在了 devicemapper/ devicemapper/data 下。
3. 启动的容器运行在哪里呢?
启动的容器配置信息保存在 containers 里,查看了还有 execdriver/native/ 。
容器里操作的内容保存在 devicemapper/devicemapper/data 下。
4. graph的角色
在Docker架构中扮演已下载容器镜像的保管者,以及已下载容器镜像之间关系的记录者。graph的本地目录中,关于每一个的容器镜像,具体存储的信息有:该容器镜像的元数据(json),容器镜像的大小(layersize)信息,以及该容器镜像所代表的具体rootfs。
5. 实验测试:
- 初始没有启动容器:
Default
[root@localhost docker]# ll containers/ total 0
- 启动一个容器:
Default
[root@localhost docker]# docker run -i -t --rm centos:7 /rm centos:/bin [root@187a8f9d2865 /bash
]187a8f9d2865
- El UUID del contenedor iniciado es =/var/lib/docker/devicemapper/devicemapper/Antes de iniciar el contenedor, revise
Default
[root@bhDocker216 docker]# du -h devicemapper/devicemapper/* 2.1G devicemapper/devicemapper/data 3.5M devicemapper/devicemapper/metadata
- Vea el tamaño real del archivo a continuación en el host del host:
Default
[root@bhDocker216 docker]# ls containers/ 187a8f9d2865c2ac***91b981
Vea el contenido del directorio UUID del contenedor iniciado:
Default
[root@bhDocker216 containers]# ll 187a8f9d2865c2ac***91b981 total 24 -rw-------. 1 root root 273 Mar 5 23:59 187a8f9d2865***-json.log -rw-r--r--. 1 root root 1683 Mar 5 23:58 config.json -rw-r--r--. 1 root root 334 Mar 5 23:58 hostconfig.json -rw-r--r--. 1 root root 13 Mar 5 23:58 hostname -rw-r--r--. 1 root root 174 Mar 5 23:58 hosts -rw-r--r--. 1 root root 69 Mar 5 23:58 resolv.conf - Añada un archivo al contenedor iniciado y véalo.
Primero cree un archivo en el contenedor en ejecución:
Default
[root@8a1e3ad05d9e /]# dd if=/dev/zero of=floppy.img bs=512 count=5760 5760+0 registros entrantes 5760+0 registros salientes 2949120 bytes (2.9 MB) copiados, 0.0126794 s, 233 MB/s
Luego en/var/lib/docker/devicemapper/devicemapper/Vea los archivos a continuación:
Default
[root@bhDocker216 docker]# du -h devicemapper/devicemapper/* 5.5G devicemapper/devicemapper/data 4.6M devicemapper/devicemapper/metadata
Este lugar tiene un tamaño ligeramente diferente, porque se ejecutó primero # dd if=/dev/zero of=test.txt bs=1M count=8000, cree uno8G de archivo, debido a que era muy lento lo terminé, pero puedo ver claramente que en el contenedor en ejecución se realizan operaciones, ambos directorios han cambiado (se aumentaron).
- Verifique graph, al pull solo una imagen (Ubuntu14.10) en este caso, apareció7directorio con un UUID largo, ¿cómo se originó esto?
Utilice docker images –tree para listar la estructura de árbol de la imagen, podemos ver la estructura de almacenamiento de la imagen en capas. Finalmente, el Ubuntu (el7La capa) se basa en la6La modificación de la capa, es decir, la lógica del árbol en la capa n se basa en la capa n-1La modificación de la capa, la capa n depende de la capa n-1La imagen de la capa. La capa 0, de tamaño 0, se llama base image.
- graph/¿Cuál es el contenido del directorio UUID?
Default
[root@localhost graph]# ll 01bf15a18638145eb*** -h total 8.0K -rw-------. 1 root root 1.6K Mar 5 18:02 json -rw-------. 1 root root 9 Mar 5 18:02 layersize
Verifique el contenido de layersize: el número representa el tamaño de la capa (unidad: B). josn: guarda los metadatos de esta imagen (como: size, architecture, config, container,**UUID del padre** etc).
- Vea devicemapper/carpeta devicemapper
Hay dos carpetas data y metadata, en realidad el driver de device mapper almacena los archivos de **data** Este archivo. Puede ver el tamaño de data y metadata mediante docker info. Además, puede usar du –h (usado anteriormente) para ver el tamaño real de estos archivos dispersos.
- execdriver
Default
[root@bhDocker216 docker]# ls execdriver/native/ 8a1e3ad05d9e66a455e683a2c***2437bdcccdfdfa //Vea el contenido dentro: [root@bhDocker216 8a1e3ad05d9e66a455e***]# ls container.json state.json
- volumes
sin-El parámetro v de volumes está vacío, según la prueba, si se inicia el contenedor sin-El parámetro v, en la carpeta volumes, mostrará un UUID, se realiza una búsqueda global en el host, solo se encontró en volumes, no tiene relación con el UUID de la imagen o el contenedor.
Default
[root@bhDocker216 docker]# find / -name 86eb77f9f5e25676f100***d5a /var/lib/docker/volumes/86eb77f9f5e25676f100***d5a //Vea el contenido dentro: [root@bhDocker216 volumes]# ls 86eb77f9f5e25676f100***d5a config.json [root@bhDocker216 volumes]# cat 86eb77f9f5e25676f100***d5a /config.json {"ID":"86eb77f9f5e25676f100a89ba727bc15185303236aae0dcf4c17223e37651d5a","Path":"/home/data","IsBindMount":true,"Writable":true}
Descripción tabular del propósito de las carpetas
Haga un resumen, arregle una tabla, y/var/lib/A continuación, se describe el propósito de diferentes carpetas en Docker:
Gracias por leer, espero que pueda ayudar a todos, gracias por el apoyo a este sitio!