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.
Seleccionar -v
o --mount
marcar
Inicialmente, -v
o --volume
marcado para contenedores separados, --mount
etiquetado para servicios de clúster. Sin embargo, a partir de Docker 17.06, también se --mount
puede utilizar independientemente del contenedor. Por lo general, la --mount
expresión de la marca es más clara y detallada. La mayor diferencia es la -v
sintaxis de todas las combinaciones de opciones en un campo y las --mount
opciones de sintaxis separadas. La siguiente es una comparación de sintaxis de cada etiqueta.
Consejo: los nuevos usuarios recomiendan el uso de la
--mount
gramática, los usuarios experimentados pueden ser más familiares-v
o--volume
gramaticales, pero también fomentan el uso de la--mount
gramática, porque los estudios han demostrado que es más fácil de usar.
-v
O--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
,z
yZ
. 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.--mount
Sintaxis que-v
o--volume
má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 serbind
,volume
otmpfs
. 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 utilizadosource
osrc
especificado. - Target (
destination
), la ruta donde se monta el archivo o directorio en el contenedor como su valor. Se puede utilizardestination
,dst
otarget
especificar. readonly
Opción (si está presente), bind mount se montará en el contenedor como de solo lectura .bind-propagation
Opción (si está presente), cambie la propagación del enlace . Los valores posibles sonrprivate
,private
,rshared
,shared
,rslave
oslave
uno.consistency
Opciones (si está presente), los valores posiblesconsistent
,delegated
ocached
uno. Esta configuración solo se aplica a Docker Desktop para Mac y se ignora en otras plataformas.--mount
La etiqueta no admite etiquetas selinux utilizadas para modificarz
uZ
opciones.
- El tipo de montaje (
El siguiente ejemplo muestra lo más simultáneamente posible --mount
y las -v
dos sintaxis, y el primer show --mount
.
-v
Y --mount
la diferencia entre el comportamiento
Debido -v
y -volume
marcando acoplable ha sido durante mucho tiempo una parte de, su comportamiento no se puede cambiar. Esto significa -v
y -mount
entre hay un comportamiento diferente.
Si usa -v
o -volume
para vincular montajes en el archivo de host de Docker o el directorio no existe, lo -v
creará. Siempre se crea como un directorio.
Si utiliza --mount
montajes 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 source
directorio de comandos de ejecución. En hosts Linux o macOS, el $(pwd)
subcomando se expande al directorio de trabajo actual.
A continuación --mount
y -v
ejemplos producirán los mismos resultados. A menos que se retire después de ejecutar el primer devtest
recipiente 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 devtest
verificar si los montajes de enlace se crean correctamente. Ver Mounts
parte:
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/source/target",
"Destination": "/app",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
Esto indica que la montura es una bind
montura, 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.
--mount
Y -v
ejemplos 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 ro
el 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.
--mount
Y -v
ejemplos 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 devtest
verificar si los montajes de enlace se crean correctamente. Ver Mounts
parte:
"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/a
montado sobre si se permite el /mnt/a
uso. Cada configuración de propagación tiene una contraparte recursiva. En el caso de recursividad, considere /tmp/a
también estar montado como /foo
. Configuración de control de propagación /mnt/a
y / o /tmp/a
presencia 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 ro
opciones de carga y rslave
propagación de opciones de enlace.
--mount
Y -v
ejemplos 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 z
o Z
para 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 Z
Opciones del directorio del sistema montado en enlace (como /home
o /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 (
:Z
y:Z
) y:ro
se ignorarán. Consulte moby / moby # 32579 para obtener más detalles .
Este ejemplo establece la z
opción para especificar que varios contenedores pueden compartir enlaces de contenido montados:
No puede utilizar la --mount
etiqueta 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 osxfs
desde 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:
consistent
Odefault
: 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.
--mount
Y -v
ejemplos 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