Conceptos básicos de Docker: use los montajes de enlace para administrar los datos de la aplicación

Las monturas de enlace han aparecido en los primeros días de Docker. En comparación con los volúmenes, el montaje de enlace tiene capacidades limitadas. Cuando usa bind mount, los archivos o directorios del host se montarán en el contenedor. Se hace referencia al archivo o directorio por su ruta completa o relativa en el host. Por el contrario, cuando usa un volumen, cree un nuevo directorio en el directorio de almacenamiento de Docker en el host y Docker administrará el contenido del directorio.

No es necesario que el archivo o directorio exista ya en el host de Docker. Si aún no existe, créelo a pedido. El rendimiento de los montajes de enlace es muy bueno, pero dependen del sistema de archivos del host, que tiene una estructura de directorios utilizable específica. Si está desarrollando una nueva aplicación de Docker, considere la posibilidad de utilizar volúmenes con nombre . No puede usar los comandos de la CLI de Docker para administrar directamente los montajes de enlaces.

docker-types-of-mounts-bind

Seleccionar -vo --mountmarcar

Inicialmente, -vo --volumemarcado para contenedores separados, --mountetiquetado para servicios de clúster. Sin embargo, a partir de Docker 17.06, también se --mountpuede utilizar independientemente del contenedor. Por lo general, la --mountexpresión de la marca es más clara y detallada. La mayor diferencia es la -vsintaxis de todas las combinaciones de opciones en un campo y las --mountopciones de sintaxis separadas. La siguiente es una comparación de sintaxis de cada etiqueta.

Consejo: los nuevos usuarios recomiendan el uso de la --mountgramática, los usuarios experimentados pueden ser más familiares -vo --volumegramaticales, pero también fomentan el uso de la --mountgramática, porque los estudios han demostrado que es más fácil de usar.

  • -vO --volume: consta de tres campos, separados por dos puntos (:). Los campos deben organizarse en el orden correcto y el significado de cada campo no es lo suficientemente intuitivo.
    • Para los montajes de enlace, el primer campo es la ruta del archivo o directorio en el host.
    • El segundo campo es la ruta donde se monta el archivo o directorio en el contenedor.
    • El tercer campo es opcional, es una lista separada por comas de opciones, tales como ro, consistent, delegated, cached, zy Z. Estas opciones se analizarán a continuación en este artículo.
  • --mount: Una pluralidad de claves - pares de valores, separados por comas, cada clave - el valor de una de las <key>=<value>tuplas. --mountSintaxis que -vo --volumemás detallada, pero el orden de las claves no es importante, el valor de la etiqueta también es más fácil de entender.
    • El tipo de montaje ( type), que puede ser bind, volumeo tmpfs. Este tema trata sobre los montajes de enlace, por lo que el tipo ( type) siempre es montaje de enlace ( bind).
    • El origen de mount ( source). Para los montajes de enlace, esta es la ruta del archivo o directorio en el host del demonio de Docker. Puede ser utilizado sourceo srcespecificado.
    • Target ( destination), la ruta donde se monta el archivo o directorio en el contenedor como su valor. Se puede utilizar destination, dsto targetespecificar.
    • readonlyOpción (si está presente), bind mount se montará en el contenedor como de solo lectura .
    • bind-propagationOpción (si está presente), cambie la propagación del enlace . Los valores posibles son rprivate, private, rshared, shared, rslaveo slaveuno.
    • consistencyOpciones (si está presente), los valores posibles consistent, delegatedo cacheduno. Esta configuración solo se aplica a Docker Desktop para Mac y se ignora en otras plataformas.
    • --mountLa etiqueta no admite etiquetas selinux utilizadas para modificar zu Zopciones.

El siguiente ejemplo muestra lo más simultáneamente posible --mounty las -vdos sintaxis, y el primer show --mount.

-vY --mountla diferencia entre el comportamiento

Debido -vy -volumemarcando acoplable ha sido durante mucho tiempo una parte de, su comportamiento no se puede cambiar. Esto significa -vy -mountentre hay un comportamiento diferente.

Si usa -vo -volumepara vincular montajes en el archivo de host de Docker o el directorio no existe, lo -vcreará. Siempre se crea como un directorio.

Si utiliza --mountmontajes de enlace en el archivo de host de Docker o el directorio no existe, Docker no lo crea automáticamente, sino que genera un error.

Inicie el contenedor con bind mount

Considere una situación: tiene un directorio source, cuando crea la fuente, la pieza de trabajo se guarda en otro directorio source/target/en formato . Desea trabajar en el /app/directorio del contenedor que está disponible, y cada vez que desee compilar el código fuente en el host de desarrollo, el contenedor puede acceder al nuevo edificio. Utilice el siguiente comando para target/catalogar el enlace montado en el contenedor /app/. En el sourcedirectorio de comandos de ejecución. En hosts Linux o macOS, el $(pwd)subcomando se expande al directorio de trabajo actual.

A continuación --mounty -vejemplos producirán los mismos resultados. A menos que se retire después de ejecutar el primer devtestrecipiente de muestra , o no se puedan ejecutar al mismo tiempo.

--mount

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

-v

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  nginx:latest

Use docker inspect devtestverificar si los montajes de enlace se crean correctamente. Ver Mountsparte:

"Mounts": [
    {
    
    
        "Type": "bind",
        "Source": "/tmp/source/target",
        "Destination": "/app",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

Esto indica que la montura es una bindmontura, que muestra la fuente y el destino correctos, también se muestra montada de forma legible y escribible, y está configurada para propagarse rprivate.

Detenga el contenedor:

$ docker container stop devtest

$ docker container rm devtest

Directorio no vacío montado en el contenedor

Si lo enlaza-monta a un directorio no vacío en el contenedor, el contenido existente del directorio será sobrescrito por el bind-mount. Esto puede resultar beneficioso, por ejemplo, cuando desee probar una nueva versión de la aplicación sin crear una nueva imagen. Sin embargo, también puede resultar sorprendente que este comportamiento sea diferente al de los volúmenes de la ventana acoplable .

Este ejemplo está diseñado para ser extremo, el host utiliza solo el /tmp/directorio de /usr/contenido del directorio del contenedor de recarga . En la mayoría de los casos, esto hará que el contenedor no funcione correctamente.

--mountY -vejemplos de los mismos resultados.

--mount

$ docker run -d \
  -it \
  --name broken-container \
  --mount type=bind,source=/tmp,target=/usr \
  nginx:latest

docker: Error response from daemon: oci runtime error: container_linux.go:262:
starting container process caused "exec: \"nginx\": executable file not found in $PATH".

-v

$ docker run -d \
  -it \
  --name broken-container \
  -v /tmp:/usr \
  nginx:latest

docker: Error response from daemon: oci runtime error: container_linux.go:262:
starting container process caused "exec: \"nginx\": executable file not found in $PATH".

El contenedor se creó pero no se inició. Bórralo:

$ docker container rm broken-container

Usar montaje de enlace de solo lectura

Para algunas aplicaciones de desarrollo, el contenedor debe escribir para enlazar montajes, por lo que los cambios se propagarán de nuevo al host de Docker. En otras ocasiones, el contenedor solo necesita acceso de lectura.

Este ejemplo modifica el ejemplo anterior, pero monta roel directorio como un montaje de enlace de solo lectura al agregarlo a la lista de opciones (vacía de forma predeterminada) después del punto de montaje en el contenedor . Cuando haya varias opciones, sepárelas con comas.

--mountY -vejemplos de los mismos resultados.

--mount

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app,readonly \
  nginx:latest

-v

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:ro \
  nginx:latest

Use docker inspect devtestverificar si los montajes de enlace se crean correctamente. Ver Mountsparte:

"Mounts": [
    {
    
    
        "Type": "bind",
        "Source": "/tmp/source/target",
        "Destination": "/app",
        "Mode": "ro",
        "RW": false,
        "Propagation": "rprivate"
    }
],

Detenga el contenedor:

$ docker container stop devtest

$ docker container rm devtest

Configurar la propagación de enlaces

Para enlazar montajes y volúmenes, enlaza los valores predeterminados de propagación para ambos rprivate. Solo se puede configurar para el montaje de enlace y solo se puede configurar en un host Linux. La propagación de enlaces es un tema avanzado y muchos usuarios nunca necesitan configurarlo.

La propagación de enlace se refiere a si un montaje creado en un montaje de enlace determinado o un volumen con nombre se puede propagar a una copia del montaje. Considere un punto de montaje /mnt, móntelo /tmp. El control de propagación se proporciona /tmp/amontado sobre si se permite el /mnt/auso. Cada configuración de propagación tiene una contraparte recursiva. En el caso de recursividad, considere /tmp/atambién estar montado como /foo. Configuración de control de propagación /mnt/ay / o /tmp/apresencia o ausencia.

Escenarios de difusión descripción
compartido Los submontes del soporte original se exponen al soporte de réplica, y los submontes del soporte de réplica también se propagan al soporte original.
esclavo Similar al montaje compartido, pero solo en una dirección. Si el montaje original expone el submontaje, el montaje de réplica puede verlo. Sin embargo, si la copia monta un submontaje público, el montaje original no puede verlo.
privado El monte es privado. Los submontajes de la montura original no están expuestos a la montura réplica y los submontajes de la montura réplica no están expuestos a la montura original.
rshared Igual que compartido, pero la propagación también se extiende a los puntos de montaje anidados en cualquier punto de montaje original o duplicado.
esclavo Igual que el esclavo, pero la propagación también se extiende a los puntos de montaje anidados en cualquier punto de montaje original o réplica.
privado Defaults. Al igual que privado, esto significa que los puntos de montaje en cualquier lugar del original o los puntos de montaje duplicados no se propagarán en ninguna dirección.

Antes de configurar la propagación de enlaces en el punto de montaje, el sistema de archivos del host debe admitir la propagación de enlaces.

Para obtener más información sobre la propagación de enlaces, consulte la documentación del subárbol compartido del kernel de Linux .

El siguiente ejemplo de target/directorio dos veces está montado en la embarcación, el segundo conjunto de roopciones de carga y rslavepropagación de opciones de enlace.

--mountY -vejemplos de los mismos resultados.

--mount

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  --mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \
  nginx:latest

-v

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  -v "$(pwd)"/target:/app2:ro,rslave \
  nginx:latest

Ahora, si lo creas /app/foo/, /app2/foo/también existe.

Configurar etiquetas selinux

Si está utilizando selinux, puede agregar opciones zo Zpara modificar el montaje de selinux para etiquetar contenedores del archivo o directorio de host. Esto afectará a los archivos o directorios del host y tendrá consecuencias más allá del alcance de Docker.

  • z La opción indica que el contenido de montaje de enlace se comparte entre varios contenedores.
  • Z La opción indica que el contenido del montaje de enlace es privado y no compartido.

Tenga mucho cuidado al utilizar estas opciones . Use ZOpciones del directorio del sistema montado en enlace (como /homeo /usr) porque su host no funciona, es posible que deba volver a marcar manualmente el archivo de hosts.

IMPORTANTE: Cuando se utilizan montajes de enlace para el servicio, las etiquetas selinux ( :Zy :Z) y :rose ignorarán. Consulte moby / moby # 32579 para obtener más detalles .

Este ejemplo establece la zopción para especificar que varios contenedores pueden compartir enlaces de contenido montados:

No puede utilizar la --mountetiqueta para modificar la etiqueta selinux.

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:z \
  nginx:latest

Configurar la coherencia de montaje para macOS

El uso de Docker Desktop para Mac osxfsdesde los directorios compartidos de macOS y los archivos se extienden a la máquina virtual de Linux. Esta extensión hace que estos directorios y archivos estén disponibles para los contenedores de Docker que se ejecutan en Docker Desktop para Mac.

De forma predeterminada, estos recursos compartidos son completamente coherentes, lo que significa que cada vez que se produce una operación de escritura en el host de macOS o mediante un montaje en el contenedor, los cambios se vacían en el disco para que todos los participantes del recurso compartido tengan una vista de coherencia completa. En algunos casos, la coherencia completa puede afectar gravemente al rendimiento. Docker 17.05 y versiones superiores introducen algunas opciones para ajustar la configuración de coherencia por montaje y por contenedor. Las siguientes opciones están disponibles:

  • consistentO default: La configuración predeterminada para una coherencia total, como se describe anteriormente.
  • delegated: La vista de montaje del tiempo de ejecución del contenedor es autoritativa. Las actualizaciones realizadas en el contenedor pueden demorarse antes de que sean visibles en el host.
  • cached: La vista de montaje del host macOS es autorizada. Las actualizaciones realizadas en el host pueden retrasarse antes de que sean visibles en el contenedor.

Estas opciones se ignoran por completo en todos los sistemas operativos host excepto macOS.

--mountY -vejemplos de los mismos resultados.

--mount

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,destination=/app,consistency=cached \
  nginx:latest

-v

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:cached \
  nginx:latest

Autor:
Traductor oficial del sitio web de Docker : Technical Zemin
Editor: Technical Verses
enlaces: texto en inglés

Supongo que te gusta

Origin blog.csdn.net/weixin_47498376/article/details/107603369
Recomendado
Clasificación