Tengo una pregunta sobre todo el proceso de volumen de datos en Docker. Básicamente, aquí hay dos Dockerfiles y sus respectivos comandos de ejecución:
archivo acoplable 1 -
# Transmission over Debian # # Version 2.92 FROM debian:testing RUN apt-get update \ && apt-get -y install nano \ && apt-get -y install transmission-daemon transmission-common transmission-cli \ && mkdir -p /transmission/config /transmission/watch /transmission/download ENTRYPOINT ["transmission-daemon", "--foreground"] CMD ["--config-dir", "/transmission/config", "--watch-dir", "/transmission/watch", "--download-dir", "/transmission/download", "--allowed", "*", "--no-blocklist", "--no-auth", "--no-dht", "--no-lpd", "--encryption-preferred"]Comando 1 -
docker run --name transmission -d -p 9091:9091 -v C:\path\to\config:/transmission/config -v C:\path\to\watch:/transmission/watch -v C:\path\to\download:/transmission/download transmissionArchivo acoplable 2 -
# Nginx over Debian # # Version 1.10.3 FROM debian:testing RUN apt-get update \ && apt-get -y install nano \ && apt-get -y install nginx EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"]Comando 2 -
docker run --name nginx -d -p 80:80 -v C:\path\to\config:/etc/nginx -v C:\path\to\html:/var/www/html nginxEntonces, lo extraño es que el primer archivo acoplable y el comando funcionan según lo previsto. Donde el demonio docker monta un directorio desde el contenedor hasta el host. Por lo tanto, puedo editar los archivos de configuración a mi gusto y se conservarán en el contenedor en un reinicio.
Sin embargo, en cuanto al segundo dockerfile y comando, parece que no funciona. Sé que si va a la documentación de Docker Volume, dice que los montajes de volumen solo están destinados a ir en una dirección, del host al contenedor, pero ¿cómo es que el contenedor de transmisión funciona según lo previsto, mientras que el contenedor de Nginx no?
P:S: estoy ejecutando Microsoft Windows 10 Pro Build 14393 como mi host y la versión 17.03.0-ce-win1 (10300) Channel: beta como mi versión de Docker.
Editar - Solo para aclarar. Estoy tratando de obtener los archivos desde el interior del contenedor Nginx al host. El primer contenedor (Transmisión) funciona en ese sentido, utilizando un volumen de datos. Sin embargo, para el segundo contenedor (Nginx), no desea copiar los archivos del directorio montado desde el interior del contenedor al host. Sin embargo, todo lo demás funciona, se inicia con éxito.
Los volúmenes de host no copian datos del contenedor > host. Los volúmenes de host se montan sobre lo que hay en el contenedor o la imagen, por lo que reemplazan efectivamente lo que hay en el contenedor con lo que hay en el host.
Un volumen estándar o "con nombre" copiará los datos existentes de la imagen del contenedor en un nuevo volumen. Estos volúmenes se crean lanzando un contenedor con el comando VOLUME en su Dockerfile o mediante el comando docker
docker run -v myvolume:/var/whatever myimageDe forma predeterminada, estos son datos almacenados en un volumen "local", siendo "local" en el host de Docker. En su caso, está en la máquina virtual que ejecuta Docker en lugar de su host de Windows, por lo que es posible que no pueda acceder fácilmente a él.
¿Podría estar confundiendo los archivos de generación automática de transmisión en un directorio en blanco con una copia?
Si realmente necesita mantener las asignaciones de contenedor de VM Host >, es posible que deba copiar los datos manualmente:
docker create --name nginxcopy nginx docker cp nginxcopy:/etc/nginx C:\path\to\config docker cp nginxcopy:/var/www/html C:\path\to\html docker rm nginxcopyY luego puede mapear los directorios de host poblados en el contenedor y tendrán los datos predeterminados con los que vino la imagen.
El volumen host no copiará datos como lo hará un volumen con nombre. Sin embargo, puede crear un volumen con nombre que realice un montaje de vinculación, que luego tendrá las propiedades de inicialización de datos de cualquier otro volumen con nombre. El único requisito previo de un montaje de enlace sobre un volumen de host es que el directorio debe existir de antemano, Docker no lo creará para usted como lo hace con un volumen de host. Aquí hay tres ejemplos diferentes de cómo crear un volumen de montaje de enlace:
# create the volume in advance $ docker volume create --driver local \ --opt type=none \ --opt device=/home/user/test \ --opt o=bind \ test_vol # create on the fly with --mount $ docker run -it --rm \ --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \ foo # inside a docker-compose file ... volumes: bind-test: driver: local driver_opts: type: none o: bind device: /home/user/test ... Entonces, en su ejemplo con un comando de docker run , puede usar la sintaxis de montaje:
docker run --name nginx -d -p 80:80 \ --mount type=volume,dst=/etc/nginx,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/c/path/to/config \ --mount type=volume,dst=/var/www/html,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/c/path/to/html \ nginxLa única parte que puede necesitar ajustes son los nombres de ruta de Windows dentro de la VM de Linux que Docker ejecuta en HyperV.