gpt4 book ai didi

macos - 如何从 Mac 访问 docker 容器 `localhost`?

转载 作者:行者123 更新时间:2023-12-01 10:34:57 35 4
gpt4 key购买 nike

请注意,这与 How to expose a service running inside a docker container, bound to localhost 不同。 ,可以在 Docker for Linux 中以多种方式解决,例如通过 --net host甚至-v在等中绑定(bind)我的 Linux 风格的客户端。我的问题是特定于 Docker for Mac 的,所以它不是那么简单。

我有一个绑定(bind)到 localhost:5005 的 TCP 服务器在 Docker for Mac 中运行。 (出于安全原因,我不能绑定(bind)到 0.0.0.0:5005 。)

我有一个 TCP 客户端从我的 Mac(不在 docker 容器内)向该服务器发送请求。

我的问题是,我该如何让它工作?

在 Linux Docker 中,我会简单地使用 --net=host所以服务器绑定(bind)到我的主机lo接口(interface),但似乎 Docker for Mac 在托管 VM 上运行,所以 host网络行为是不同的行为。

为了说明我的观点:

在 MacBook 上

它根本行不通

[me@MacBook App]$ docker run -v `pwd`:/App -p 127.0.0.1:5005:5005 nitincypher/docker-ubuntu-python-pip /App/server.py
[me@MacBook App]$ ./client.py
Client received data:

在 Linux 上

相比之下,在 Linux 上使用 host 就很简单了。网络模式。因为我使用的是我的 Linux 的 lo接口(interface)作为我的容器 lo界面。
[me@Linux App]$ docker run -v `pwd`:/App --net=host nitincypher/docker-ubuntu-python-pip /App/server.py
Server Connection address: ('127.0.0.1', 52172)
Server received data: Hello, World!
[me@Linux App]$ ./client.py
Client received data: Hello, World!

我的模拟服务器代码

要求:它必须绑定(bind)到 localhost ,仅此而已。所以我不能把它改成 0.0.0.0 .
#!/usr/bin/env python

import socket

TCP_IP = 'localhost'
TCP_PORT = 5005
BUFFER_SIZE = 20 # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
print 'Server Connection address:', addr
while 1:
data = conn.recv(BUFFER_SIZE)
if not data: break
print "Server received data:", data
conn.send(data) # echo
conn.close()

我的模拟客户端代码

要求:它必须在 MacBook 上运行,因为真正的客户端是用 CPP 编写并编译为只能在 MacBook 上运行。
#!/usr/bin/env python

import socket


TCP_IP = 'localhost'
TCP_PORT = 5005
BUFFER_SIZE = 1024
MESSAGE = "Hello, World!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()

print "Client received data:", data

最佳答案

这是一个有效的解决方案。基本思想是使用 SSH 隧道进行端口转发。

高水平的想法

  • 首先需要构建一个 docker 镜像来支持 SSH 访问,因为
  • ubuntu图片没有 sshd开箱即用,还有
  • 您需要知道 root 的密码您正在运行的容器。
  • 然后,您将像平常一样启动容器,只是您是根据创建的新镜像来执行此操作的。
  • 您从 MacBook 创建一个 SSH 隧道 session ,然后像往常一样在 MacBook 上运行您的客户端。

  • 作为引用, SSH tunneling 的命令可以在这里找到,创建 sshd docker 镜像的过程是 explained here ,以及如何通过 ssh 进入 docker 容器是 explained here

    脚步
  • 创建 Docker 文件 Dockerfile
    #Use whatever image you are using on Docker Linux , say "FROM ubuntu:16.04"
    FROM nitincypher/docker-ubuntu-python-pip

    RUN apt-get update && apt-get install -y openssh-server
    RUN mkdir /var/run/sshd
    RUN echo 'root:screencast' | chpasswd
    RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

    # SSH login fix. Otherwise user is kicked off after login
    RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

    ENV NOTVISIBLE "in users profile"
    RUN echo "export VISIBLE=now" >> /etc/profile

    EXPOSE 22
    CMD ["/usr/sbin/sshd", "-D"]
  • 从 Dockerfile 创建 Docker 镜像
    [me@MacBook App]$ docker build -t my_ssh_python .
  • 启动你的服务器容器
    [me@MacBook App]$ docker run -d -P -v `pwd`:/App --name myserver my_ssh_python
  • 在容器内启动服务器
    [me@MacBook App]$ docker exec myserver /App/server.py
  • 创建 SSH 隧道
    [me@MacBook App]$ ssh root@`hostname` -p `docker port myserver 22 | awk -F ":" '{print $2}'` -L 8000:localhost:8000 -N
    #Password is "screencast" as you built in Dockerfile

    注意

    一种。您必须使用 MacBook 的 IP 地址而不是 docker 容器的 IP 地址。

    湾。您将使用默认容器所在的端口 ssh端口 22映射到主机

    C。在隧道 -L 8000:localhost:8000 ,您在 MacBook 上转发任何内容 8000 (前 8000 个)到 Docker 容器的 localhost在港口8000
  • 现在您可以在本地使用您的客户端
    [me@MacBook App]$ ./client.py 
    Client received data: Hello, World!

    在服务器端,你可以看到
    Server Connection address: ('127.0.0.1', 55396)
    Server received data: Hello, World!
  • 关于macos - 如何从 Mac 访问 docker 容器 `localhost`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52321269/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com