为什么我需要在创建卷时将主机名添加到 docker

Ala*_*tan 1 rabbitmq docker

我正在创建一个带有 -v 选项的 rabbitmq 容器来添加一个卷,奇怪的是,如果我不添加 --hostname 容器将无法获取卷的信息,例如:

我创建了一个这样的卷:

docker volume create --name rabbit
Run Code Online (Sandbox Code Playgroud)

后来我验证该卷已创建

docker volume ls
Run Code Online (Sandbox Code Playgroud)

然后我像这样创建容器:

docker run --name rabbitprueba -P -p 55555:15672 -d -v rabbit:/var/lib/rabbitmq rabbitmq:3.6.10-management
Run Code Online (Sandbox Code Playgroud)

我输入 localhost:55555 并输入用户名和密码,然后创建一个简单的队列,返回我的机器并停止并移除容器:

docker stop rabbitprueba
docker rm rabbitprueba
Run Code Online (Sandbox Code Playgroud)

当我运行相同的命令时:

docker run --name rabbitprueba -P -p 55555:15672 -d -v rabbit:/var/lib/rabbitmq rabbitmq:3.6.10-management
Run Code Online (Sandbox Code Playgroud)

我创建的队列消失了,但如果我重复相同的步骤(停止容器并删除它)并将 --hostname 添加到命令中,队列不会被删除:

docker run --hostname rabbitprueba --name rabbitprueba -P -p 55555:15672 -d -v rabbit:/var/lib/rabbitmq rabbitmq:3.6.10-management
Run Code Online (Sandbox Code Playgroud)

为什么会这样?,我做错了什么吗?,

Tar*_*ani 5

所以你没有做错任何事,但你假设问题出在 docker 上。问题是rabbitmq 如何保存它的数据。

当您使用以下命令启动rabbitmq 容器时

docker run -it rabbitmq:latest
Run Code Online (Sandbox Code Playgroud)

您会在 docker 日志中注意到一行显示

Database directory at /var/lib/rabbitmq/mnesia/rabbit@51267ba4cc9f is empty. Initialising from scratch...
Run Code Online (Sandbox Code Playgroud)

下一次运行:

Database directory at /var/lib/rabbitmq/mnesia/rabbit@5e9c67b4d6ed is empty. Initialising from scratch...
Run Code Online (Sandbox Code Playgroud)

所以你可以看到它根据主机名创建了一个文件夹。现在如果我跑

docker run -it --hostname mymq rabbitmq
Run Code Online (Sandbox Code Playgroud)

日志会显示

Database directory at /var/lib/rabbitmq/mnesia/rabbit@mymq is empty. Initialising from scratch...
Run Code Online (Sandbox Code Playgroud)

这就是这里发生的事情。不是音量问题,而是rabbitmq 的工作方式。您可以使用如下环境变量更改此配置的名称

 docker run -it -e "RABBITMQ_NODENAME=mq@localhost" rabbitmq
Run Code Online (Sandbox Code Playgroud)

日志现在会显示

Database directory at /var/lib/rabbitmq/mnesia/mq@localhost is empty. Initialising from scratch...
Run Code Online (Sandbox Code Playgroud)