如何从无根 dockerd 运行的容器中绑定“主机”网络模式下的端口?

如何从无根 dockerd 运行的容器中绑定“主机”网络模式下的端口?

我想从容器向主机发布一个端口。容器正在运行“主机”网络模式经过无根 dockerd

我的问题是:如何从这个容器发布一个端口到我的主机(使用无根 dockerd 以“主机”网络模式运行)?

我是否应该运行dockerd-rootless.sh脚本或者甚至运行rootlesskit带有特定参数的原始脚本来实现这个目标?

我已完成以下步骤:

  1. 在 Ubuntu 20.04 上安装无根 dockerd:

    $ curl -fsSL https://get.docker.com/rootless | sh
    $ export PATH=$HOME/bin:$PATH
    $ export DOCKER_HOST=unix:///run/user/$UID/docker.sock
    
  2. 运行无根 dockerd:

    $ dockerd-rootless.sh --experimental
    ...
    INFO[2020-06-03T16:53:51.690572434+02:00] API listen on /run/user/1000/docker.sock
    
  3. 检查非主机网络模式下的容器(成功):

    $ docker run --rm -it -p 8080:8080 python python -m http.server 8080
    Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
    

    在其他终端上:

    $ curl http://localhost:8080
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    ...
    
    $ lsof -i :8080
    COMMAND      PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    rootlessk 116618 marcinr    9u  IPv6 2313409      0t0  TCP *:http-alt (LISTEN)
    
  4. 尝试在“主机”网络模式下运行(失败):

    $ docker run --rm -it --network host python python -m http.server 8080
    Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
    

    在其他终端上:

    $ curl http://localhost:8080
    curl: (7) Failed to connect to localhost port 8080: Connection refused
    
    $ lsof -i :8080
    <empty>
    

    我知道我可以使用以下命令运行这些命令nsenter

    $ nsenter -U -n -t $(cat /run/user/$UID/docker.pid) lsof -i :8080
    COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    python  119656 root    3u  IPv4 2360676      0t0  TCP *:http-alt (LISTEN)
    

    但我希望能够在 Web 浏览器中使用我的 Web 应用程序,而不仅仅是在终端中。

答案1

从 Docker 19.03 开始​​,Rootless 不再支持 --net=host:https://docs.docker.com/engine/security/rootless/#networking-errors

相关内容