我想从容器向主机发布一个端口。容器正在运行“主机”网络模式经过无根 dockerd。
我的问题是:如何从这个容器发布一个端口到我的主机(使用无根 dockerd 以“主机”网络模式运行)?
我是否应该运行dockerd-rootless.sh
脚本或者甚至运行rootlesskit
带有特定参数的原始脚本来实现这个目标?
我已完成以下步骤:
在 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
运行无根 dockerd:
$ dockerd-rootless.sh --experimental ... INFO[2020-06-03T16:53:51.690572434+02:00] API listen on /run/user/1000/docker.sock
检查非主机网络模式下的容器(成功):
$ 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)
尝试在“主机”网络模式下运行(失败):
$ 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