如何从主机连接到Docker服务器?

6

好的,我很新于 Docker 世界。所以这可能是一个非常基本的问题。

我有一个在 Docker 中运行的容器,其中运行着 RabbitMQ。假设这个容器的名字是 "Rabbit-container"。

RabbitMQ 容器是使用以下命令启动的:

docker run -d -t -i --name rmq -p 5672:5672 rabbitmq:3-management 

使用两个参数的Python脚本命令:

python ~/Documents/myscripts/migrate_data.py amqp://rabbit:5672/ ~/Documents/queue/

现在,我正在从我的主机运行一个Python脚本,该脚本创建一些消息。我想将这些消息发送到我的“Rabbit-container”中。因此,我想从我的主机(Mac OSX)连接到此容器。这是否可能?如果是,应该怎么做?如果需要更多细节,请告诉我。

通过运行命令 docker run -d -t -i --name rmq -p 5672:5672 rabbitmq:3-management,特别是选项 -p 5672:5672 请求 Docker 守护程序将主机 IP 端口 5672 绑定到容器端口 5672。因此,如果您尝试从主机连接 nc 127.0.0.1 5672,您会看到 nc 已连接到 RabbitMQ 套接字。您可以通过使用此套接字通过网络本地堆栈与其通信。 - Auzias
4个回答

5
因此,我通过将RMQ侦听端口映射到主机操作系统来解决了这个问题:
docker run -d -t -i --name rmq -p 15672:15672 -p 5672:5672 rabbitmq:3-management

我之前的命令只有-p 15672:15672。这将Docker容器中的管理员UI映射到我的主机操作系统上。我添加了-p 5672:5672,这将RabbitMQ监听端口从Docker容器映射到主机操作系统。


1

如果您在本地的OSX系统中运行此容器,则应通过运行以下命令找到默认的docker-machine IP地址:

docker-machine ip default

然后,您可以更改Python脚本以指向<your_docker_machine_ip>:5672上的该地址和映射端口。

这是因为Docker在OSX和Windows上运行在虚拟化引擎中,因此当您将端口映射到主机时,实际上是将其映射到虚拟机器。


没起作用。而且在这之前我也没有运行 docker-machine。为什么需要它呢? - Bhushan
在官方的dockerhub镜像页面https://hub.docker.com/_/rabbitmq/上说,rabbitmq:3-management运行在端口15672上。停止容器,删除容器并重新映射正确的端口,然后通过`http://<docker-machine-ip>:15672`访问它。有关docker-machine的更多信息,请查看官方文档https://docs.docker.com/machine/overview/。 - Rogério Peixoto
@Bhushan 当你运行 docker-machine ls 命令时,default 是否被列为 running?尽管在 OSX 上安装 Docker 时看不到 docker-machine,但是这就是 boot2docker 虚拟机的设置和管理方式(https://github.com/docker/toolbox/blob/fcdf7c37950dab9658556b1566b4363fa930878b/osx/mpkg/quickstart.app/Contents/Resources/Scripts/start.sh)。 - Matt
@RogérioPeixoto:感谢您的帮助。我通过将RMQ端口映射到主机操作系统来解决了这个问题。 - Bhushan
@Matt:不,如果我运行 docker-machine lsdefault 不会被列出。我需要显式地启动 docker-machine,才能看到它。 - Bhushan

1
您需要运行带有端口5672的容器,如果需要WebUI,则还需要暴露15672端口,如果使用SSL,则需要5671端口,或者添加tcp监听器以使用其他端口。如果您为rabbitmq容器创建特定的IP和主机名,那么这也会更容易。为此,您需要创建自己的Docker网络。
docker network create --subnet=172.18.0.0/16 mynet123
然后像这样启动容器:
docker run -d --net mynet123--ip 172.18.0.11 --hostname rmq1 --name rmq_container_name -p 15673:15672 rabbitmq:3-management
请注意,使用rabbitmq:3-management镜像时,端口5672已经(在我使用时)被暴露,因此不需要进行操作。--name用于容器名称,--hostname显然用于主机名。
所以现在,从您的主机上,您可以连接到rmq1 rabbitmq服务器。

感谢您的帮助。我通过将RMQ端口映射到主机操作系统来解决了这个问题。 - Bhushan

0

你说你以前从未使用过docker-machine,所以我假设你正在使用Docker Beta for Mac(你应该在顶部的菜单栏中看到docker图标)。

你的rabbit docker运行命令是正确的。如果你现在想连接到rabbit,你有两个选择:

  1. 将你的python脚本包装在一个新的容器中,并将其链接到rabbit:

    docker run -it --rm --name migration --link rmq:rabbit -v ~/Documents/myscripts:/app -w /app python:3 python migrate_data.py

    请注意,我们必须链接rmq:rabbit,因为你将容器命名为rmq,但在脚本中使用rabbit

  2. 在你的主机上执行你的python脚本并使用localhost:5672

    python ~/Documents/myscripts/migrate_data.py amqp://localhost:5672/ ~/Documents/queue/


感谢您的输入。是的,我正在使用Docker Beta。我通过将RMQ监听端口映射到主机操作系统来解决了我的问题。我会将我的发现发布为另一个答案。 - Bhushan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接