Explicación detallada del volumen de datos del contenedor Docker

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:

  1. Volúmenes de datos para compartir o reutilizar datos entre contenedores
  2. Los cambios en el volumen pueden tener efecto directamente
  3. Los cambios en los volúmenes de datos no se incluirán en las actualizaciones duplicadas
  4. 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.
inserte la descripción de la imagen aquí
Para ver los metadatos correspondientes al contenedor docker inspect 容器id, puede ver la información del volumen de datos creado en el nodo Montajes.
inserte la descripción de la imagen aquí

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 lsPuede 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.
inserte la descripción de la imagen aquí

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-fromy 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

Supongo que te gusta

Origin blog.csdn.net/huangjhai/article/details/119860628
Recomendado
Clasificación