Directorio de artículos
1. Introducción a los volúmenes de datos
Docker empaquetará la aplicación y el entorno en ejecución para formar la operación del contenedor. Si los datos generados por el contenedor de Docker no generan una nueva imagen a través de la confirmación de Docker, de modo que los datos se guarden como parte de la imagen, entonces cuando se elimine el contenedor , los datos desaparecerán naturalmente. . Para guardar datos en Docker usamos volúmenes. |
Un volumen es un directorio o archivo que existe en uno o más contenedores y Docker lo monta en el contenedor, pero el volumen no pertenece a Union FileSystem, por lo que puede omitir el sistema de archivos de unión para proporcionar almacenamiento persistente o datos compartidos. Características: .
Los volúmenes están diseñados para la persistencia de datos y son completamente independientes del ciclo de vida del contenedor, por lo que Docker no eliminará el volumen de datos montado cuando se elimine el contenedor.
Características de los volúmenes de datos:
- Volúmenes de datos para compartir o reutilizar datos entre contenedores
- Los cambios en el volumen pueden tener efecto directamente
- Los cambios en los volúmenes de datos no se incluirán en las actualizaciones duplicadas
- El ciclo de vida de un volumen de datos dura hasta que ningún contenedor lo usa
2. Fácil de usar
Ejecute el contenedor, especificando el comando de volumen de datos de montaje:
docker run -it -v 主机目录:容器目录
Cree un volumen de datos entre el directorio del host /home/test y el contenedor /home, primero cree el archivo test.java en el directorio del contenedor y luego vaya al directorio del host para verificar si el archivo existe.
Para ver los metadatos correspondientes al contenedor docker inspect 容器id
, puede ver la información del volumen de datos creado en el nodo Montajes.
Incluso si el contenedor deja de ejecutarse o se elimina, aún se puede lograr la sincronización de datos y el volumen de datos local no se perderá.
3. El contenedor MySQL establece el volumen de datos y sincroniza los datos
El directorio de almacenamiento de archivos de datos predeterminado de MySQL en Linux es /var/lib/mysql, y la ubicación del archivo de configuración predeterminado es /etc/mysql/conf.d. Para garantizar la pérdida de datos después de eliminar la imagen o el contenedor de MySQL, el después del establecimiento, los volúmenes de datos contienen datos y archivos MySQL.
docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker images;
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 f189aac861de About an hour ago 653MB
mysql 5.7 f07dfa83b528 6 days ago 448MB
tomcat latest feba8d001e3f 10 days ago 649MB
nginx latest ae2feff98a0c 12 days ago 133MB
centos latest 300e315adb2f 2 weeks ago 209MB
portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 9 months ago 791MB
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
72efdb845471b6bd19077b596af51122baa982c01211c39f989afaca556b149f
[root@iZwz99sm8v95sckz8bd2c4Z home]# cd /home
[root@iZwz99sm8v95sckz8bd2c4Z home]# ls
hai mysql pan test test.java
[root@iZwz99sm8v95sckz8bd2c4Z home]# cd mysql/conf
[root@iZwz99sm8v95sckz8bd2c4Z conf]# ls
[root@iZwz99sm8v95sckz8bd2c4Z conf]# cd /home/mysql/data
[root@iZwz99sm8v95sckz8bd2c4Z data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem
[root@iZwz99sm8v95sckz8bd2c4Z data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test
Si falla el uso de la contraseña configurada para conectarse al servicio mysql, lo más probable es que ya haya archivos en el archivo de configuración montado en la máquina y se sobrescriba la configuración en el contenedor. Podemos eliminar la configuración del archivo en el correspondiente archivo local. .
4. Comandos comunes
(1) Crear un volumen de datos
docker volume create my-vol
(2) Ver todos los volúmenes de datos
$ docker volume ls
local my-vol
(3) Ver la información del volumen de datos especificado
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {
},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {
},
"Scope": "local"
}
]
(4) Eliminar el volumen de datosdocker volume rm ...
$ docker volume rm my-vol
(5) Eliminar el volumen relevante al eliminar el contenedor
$ docker rm -v ...
Los volúmenes de datos están diseñados para conservar los datos, su ciclo de vida es independiente de los contenedores, Docker no elimina automáticamente los volúmenes de datos después de eliminar los contenedores y no existe un mecanismo para que la recolección de elementos no utilizados procese los datos a los que no hace referencia ningún contenedor. Si necesita eliminar el volumen de datos mientras elimina el contenedor. Puede usar el comando docker rm -v al eliminar un contenedor.
Los volúmenes de datos sin propietario pueden ocupar mucho espacio, para limpiarlos use el siguiente comando
$ docker volume prune
(5) Use --mount para crear un volumen de datos
Monte un directorio de host como un volumen de datos. Use el indicador --mount para especificar montar un directorio localhost en el contenedor.
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp
python app.py
El comando anterior monta el directorio /src/webapp del host en el directorio /opt/webapp del contenedor. Los usuarios pueden colocar algunos programas en un directorio local para ver si el contenedor funciona correctamente. La ruta al directorio local debe ser una ruta absoluta; si el directorio no existe, Docker lo creará automáticamente.
El permiso predeterminado para que Docker monte el directorio del host es de lectura y escritura, y los usuarios también pueden especificar solo lectura agregando el parámetro de solo lectura.
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了readonly之后,就挂载为只读了。如果你在容器内/src/webapp目录新建文件,会显示如下错误
/src/webapp # touch new.txt
touch: new.txt: Read-only file system
5. Montajes con nombre y montajes anónimos
5.1 Montaje anónimo
El montaje anónimo significa que al especificar un volumen de datos, no se especifica la ruta del host correspondiente a la ruta del contenedor, por lo que la ruta del host asignada correspondiente es la ruta predeterminada /var/lib/docker/volumes/ Se genera automáticamente una carpeta con nombre aleatorio.
Ejecute lo siguiente y monte el contenedor Nginx de forma anónima:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
d3a27b969d122d5516cac75e99b17dff7aaaf1e0c042385c6b05990053f1259
Ver todos los volúmenes de datos, el valor de NOMBRE DEL VOLUMEN aquí es el directorio real.
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls
DRIVER VOLUME NAME
local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
5.2 Montaje con nombre
El montaje con nombre es para especificar el nombre de la carpeta, que es diferente de la ruta de montaje especificada. El nombre de la carpeta especificada aquí está debajo de la ruta de volumen de datos predeterminada especificada por Docker. docker volume ls
Puede ver el estado del directorio del volumen de datos actual a través del comando.
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
4ceaff19e5275dcd3014a8e7a8af618f7f7ce0da18d605c7c41a8653e78bf912
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls
DRIVER VOLUME NAME
local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
local juming-nginx
El comando para ver la información del volumen de datos especificado:docker volume inspect数据卷名称
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-12-29T22:40:25+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
Puede ver que el volumen de datos del host está montado en /var/lib/docker/volumes/juming-nginx/_data
Todos los volúmenes de datos de Docker están en el directorio /var/lib/docker/volumes/ de forma predeterminada
[root@iZwz99sm8v95sckz8bd2c4Z volumes]# ls
0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26 backingFsBlockDev juming-nginx
668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956 e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a metadata.db
La diferencia entre el montaje anónimo, el montaje con nombre y el montaje especificando la ruta es la siguiente:
-v ruta en el contenedor#montaje anónimo
-v nombre del volumen: ruta dentro del contenedor #montaje con nombre
-v /ruta del host: ruta en el contenedor #ruta de montaje especificada
Especifique los parámetros relevantes del mapeo del volumen de datos:
ro - solo lectura Solo lectura. Si se establece solo lectura, solo se puede manipular la ruta del host y no se puede manipular la ruta correspondiente en el contenedor.
rw ----- lectura y escritura lectura y escritura
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
6. Establecer el volumen de datos en Dockerfile
Podemos usar el comando VOLUMEN en el Dockerfile para agregar uno o más volúmenes de datos a la imagen.
Lo siguiente usa Dockerfile para crear una nueva imagen, el contenido del archivo dockerfile01 y los dos directorios volume01 y volume02 se montan de forma anónima:
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
Ejecutar imagen de compilación
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile01 -t ethan/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 215ef28fd5a6
Removing intermediate container 215ef28fd5a6
---> f506ddf133d2
Step 3/4 : CMD echo "----end----"
---> Running in 62a1c4b9dc7b
Removing intermediate container 62a1c4b9dc7b
---> bbea81a6e94e
Step 4/4 : CMD /bin/bash
---> Running in 245d239f3776
Removing intermediate container 245d239f3776
---> 1df90e6fd790
Successfully built 1df90e6fd790
Successfully tagged ethan/centos:1.0
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ethan/centos 1.0 1df90e6fd790 13 minutes ago 209MB
mytomcat 1.0 f189aac861de 25 hours ago 653MB
mysql 5.7 f07dfa83b528 7 days ago 448MB
tomcat latest feba8d001e3f 11 days ago 649MB
nginx latest ae2feff98a0c 13 days ago 133MB
centos latest 300e315adb2f 3 weeks ago 209MB
portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 9 months ago 791MB
Después de completar la generación de la imagen, inicie el contenedor generado por usted mismo
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker run -it 1df90e6fd790 /bin/bash
[root@828d43dba78e /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Dec 29 15:41 dev
drwxr-xr-x 1 root root 4096 Dec 29 15:41 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 111 root root 0 Dec 29 15:41 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Dec 29 15:41 volume01
drwxr-xr-x 2 root root 4096 Dec 29 15:41 volume02
Puede ver el directorio de volumen de datos montado automáticamente. Vea el directorio de volumen de datos del host correspondiente a continuación
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker inspect 828d43dba78e
[
{
"Id": "828d43dba78ecaa10e7e57c1091ee8cf3581dae88187aa04163946dfc86bfd76",
"Created": "2020-12-29T15:41:29.297091075Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1719,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-12-29T15:41:34.107755138Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
...
#重点:
"Mounts": [
{
"Type": "volume",
"Name": "c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc",
"Source": "/var/lib/docker/volumes/c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f",
"Source": "/var/lib/docker/volumes/1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Puede ver el directorio de montaje del host en Montajes. Debido a que el directorio del host no se especifica en el archivo dockerfile, es un montaje anónimo y se genera una ruta con un nombre aleatorio en el directorio /var/lib/docker/volumes/.
7. Volúmenes de datos de contenedores
El volumen de datos del contenedor se refiere al establecimiento de un volumen de datos para sincronizar datos entre múltiples contenedores y realizar la sincronización de datos entre contenedores.
Primero inicie el contenedor 1, volumen 01 y volumen 02 son directorios de montaje.
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it --name cnetos01 ethan/centos:1.0
[root@731d53b8c3d5 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
Luego inicie el contenedor 2 --volumes-from
y configure la relación de montaje del volumen de datos entre el contenedor 2 y el contenedor 1 a través de parámetros.
[root@iZwz99sm8v95sckz8bd2c4Z /]# docker run -it --name centos02 --volumes-from cnetos01 ethan/centos:1.0
[root@7f90d4147511 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Dec 30 14:58 dev
drwxr-xr-x 1 root root 4096 Dec 30 14:58 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 108 root root 0 Dec 30 14:58 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume01
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume02
Primero agregue el archivo en el volumen 01 en el contenedor 2
[root@7f90d4147511 /]# cd volume01
[root@7f90d4147511 volume01]# touch test.java
[root@7f90d4147511 volume01]# ls
test.java
Luego puede ver que los archivos del contenedor 1 también se agregarán.
Lo siguiente es sincronizar las dos bases de datos MySQL y los archivos de configuración, igual que la operación anterior, primero cree un volumen de datos y luego cree un montaje de volumen de datos de contenedor para otro contenedor MySQL, ejemplo:
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6604:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7