Eu acho que # 2 e # 3 são praticamente a mesma coisa, a principal diferença é que não há um contêiner parado com # 3 (literalmente, apenas um volume nomeado). Por exemplo, você pode criar um volume nomeado e fazer da mesma forma o que faria com o # 2 com -v
.
Crie um volume nomeado:
$ docker volume create --name test
Monte e escreva alguns dados para esse volume de um contêiner:
$ docker run -v test:/opt/test alpine touch /opt/test/hello
Você pode montar o mesmo volume test
em outro contêiner e ler os dados:
$ docker run -v test:/opt/test alpine ls -al /opt/test
total 8
drwxr-xr-x 2 root root 4096 Jan 23 22:28 .
drwxr-xr-x 3 root root 4096 Jan 23 22:29 ..
-rw-r--r-- 1 root root 0 Jan 23 22:28 hello
A vantagem aqui é que o volume não desaparece acidentalmente se você remover o contêiner somente de dados. Agora você gerencia isso com o subcomando docker volume
.
$ d volume ls
DRIVER VOLUME NAME
local test
Ele também abre as possibilidades para os drivers de volume no caminho para que você possa fazer volumes compartilhados entre hosts (ou seja, volumes nomeados via NFS). Exemplos disso podem ser Flocker e Convoy . Para o seu ponto especificamente sobre mover ou fazer backup de dados, o Convoy possui subcomandos específicos para fazer backup de dados e permite armazenamento no NFS ou EBS externo ao host.
Por esse motivo, acho que a maneira mais nova da escola (Docker 1.9+) é usar um volume nomeado em vez de um contêiner somente de dados.