如何从docker容器访问Host的计算机的localhost 127.0.0.1

Dha*_*rya 2 git-daemon docker dockerfile docker-compose

我在本地主机上托管Git守护程序,即'/usr/bin/git daemon --listen=127.0.0.1 --base-path=/opt'作为systemd服务,我试图从docker容器访问它.我没有提到端口,因为我不想将端口暴露给外部网络.

Dockerfile:

RUN git clone git://127.0.0.1/repo/ repo_dir
Run Code Online (Sandbox Code Playgroud)

但它不起作用,它看起来像在容器内试图连接容器的localhost.

那么如何从Docker容器连接主机的localhost?

Von*_*onC 9

它不工作,它看起来像在容器内试图连接容器的localhost.

是的,这就是容器提供的隔离背后的所有想法,甚至docker build(每个Dockerfile行构建一个容器,并在中间图像中提交它).

正如OP dhairya评论,并在我在评论中提到的文档中提到:" Docker容器网络 " docker build,你可以设置为在构建期间托管RUN指令的网络模式:然后localhost将引用主机localhost.

 docker build --network="host"
Run Code Online (Sandbox Code Playgroud)

这是自API 1.25+以来,在docker v.1.13.0-rc5(2017年1月)

POST /build接受networkmode参数以指定构建期间使用的网络.


但是如果你在实际构建的图像中不需要Git(对于它的主要进程运行),它会更容易

  • 在docker构建之前在本地克隆repo(直接在主机上).
    您需要将它克隆到Dockerfile所在的位置,因为它必须相对于正在构建的源目录(构建的上下文).
  • 在Dockerfile中使用一个COPY指令来复制代表签出的Git仓库的主机文件夹.
    注意:如果您的目标图像中没有git,请将:添加.git/到您的.dockerignore(与Dockerfile位于同一文件夹中的文件),以便复制该repo_dir/.git克隆存储库的文件夹.

    COPY repo_dir .
    
    Run Code Online (Sandbox Code Playgroud)

(这里' .'表示WORKDIR正在构建的图像中的当前)

  • @Dhairya任何容器都看不到主机上的docker守护程序.您可以创建第二个容器来安装repo,并托管一个docker守护程序,然后由您的第一个容器(https://docs.docker.com/engine/userguide/networking/)显示......但这似乎有点过分了.简单的COPY并继续前进. (2认同)