在这种情况下,处于集群模式无关紧要。
如果您仅依赖 Dockerfile 中定义的匿名卷,则运行新容器将创建并挂载一个新卷。您需要在容器启动时专门挂载一个命名卷(在您的情况下将其添加到您的撰写文件中)以在运行之间重新挂载相同的卷。
如果您需要重新挂载丢失的数据卷,如果您没有修剪服务器上的数据,则仍有可能。您只需要找到相关的卷(名称为哈希),最终将其重命名并将其重新安装到您的新容器中。
我播放了以下场景来说明我的观点:
先拿到图片看看:
$ docker pull mysql:latest
$ docker image inspect mysql:latest
从最后一条命令我们可以看到有一个为/var/lib/mysql声明的卷
我在我的开发机器上。清理了所有内容,因此我目前没有卷
$ docker volume ls
DRIVER VOLUME NAME
$
启动容器,然后再次查看卷
$ docker run -d --name test -e MYSQL_ALLOW_EMPTY_PASSWORD=1 mysql:latest
37a92341f52b189d00636d1f03ecfbd4e3e7e5d55b685f5ec254971d7732566c
$ docker volume ls
DRIVER VOLUME NAME
local 50f9810d13271c7c91b7e025e139db480f288a936f0a55f85d9580ef3aa83af7
现在向容器中添加一些数据
$ docker exec -it test bash
root@37a92341f52b:/# mysql
Welcome to the MySQL monitor. [... snip ...]
mysql> create database testso;
Query OK, 1 row affected (0.03 sec)
mysql> use testso;
Database changed
mysql> create table test (id int not null primary key);
Query OK, 0 rows affected (0.08 sec)
mysql> insert into test values (1);
Query OK, 1 row affected (0.05 sec)
mysql> select * from test;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
mysql> exit
Bye
root@37a92341f52b:/# exit
$
创建一个新容器
$ docker rm -f test
test
$ docker run -d --name test -e MYSQL_ALLOW_EMPTY_PASSWORD=1 mysql:latest
79148de09d7a3e13db338da133cfd7d44fe3590dc1c7ffe6129722c5c6baea21
$ docker volume ls
DRIVER VOLUME NAME
local 50f9810d13271c7c91b7e025e139db480f288a936f0a55f85d9580ef3aa83af7
local ef6fb2647c11c10ef98d25ca0dc2bd43231729ed18386c65768a0ad808fca93b
如您所见,我们为新容器准备了第二卷。我不会在这里显示这个,但如果我连接,数据是空的,就像你的情况一样。现在让我们尝试恢复。
首先进行一点清理
$ docker rm -f test
test
$ docker volume rm ef6fb2647c11c10ef98d25ca0dc2bd43231729ed18386c65768a0ad808fca93b
ef6fb2647c11c10ef98d25ca0dc2bd43231729ed18386c65768a0ad808fca93b
我们希望有一个人类可读的名称,但我们不能重命名卷。我所做的是在busybox容器中安装旧的和新的命名卷来传输数据。
$ docker run -it --rm -v 50f9810d13271c7c91b7e025e139db480f288a936f0a55f85d9580ef3aa83af7:/mysql/old -v mysql_data:/mysql/new busybox:latest
/ # cd /mysql/
/mysql # mv old/* new/
/mysql # exit
我们现在有了这本新书,我们可以摆脱匿名书了
$ docker volume ls
DRIVER VOLUME NAME
local 50f9810d13271c7c91b7e025e139db480f288a936f0a55f85d9580ef3aa83af7
local mysql_data
$ docker volume rm 50f9810d13271c7c91b7e025e139db480f288a936f0a55f85d9580ef3aa83af7
50f9810d13271c7c91b7e025e139db480f288a936f0a55f85d9580ef3aa83af7
最后,我们将命名卷重新挂载到一个新的 mysql 容器中以取回我们的数据
$ docker run -d --name test -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -v mysql_data:/var/lib/mysql mysql:latest
3f6eff0b7660f3f8e9518564affc6555acb17184845156099d18300b3e76f4a2
$ docker exec -it test bash
root@3f6eff0b7660:/# mysql
Welcome to the MySQL monitor. [... snip ...]
mysql> use testso
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from test;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.01 sec)