我有一个包含 js 应用程序的 docker 容器。它在任何本地主机上都可以正常工作,但是当我尝试在远程服务器上运行它时,它没有互联网连接并在第一个查询时崩溃。我尝试了不同的运行方式,但没有一个选项可以解决这个问题。有什么关于如何修复它的建议吗?
运行命令是:
docker run --network=host --shm-size=1g --rm -u root --dns 8.8.8.8 --cap-add=NET_ADMIN --cap-add=SYS_ADMIN --device=/dev/net/tun --privileged --sysctl net.ipv6.conf.all.disable_ipv6=0 containerID
我无法从容器 shell 中 ping IP 地址和解析名称
答案1
我建议逐步地进行调试,并在调试时简化 docker 命令。
我猜你的容器根本就没有启动。容器日志里有什么?
因此,如果我调试它,我会首先删除每个参数,然后以交互模式运行 /bin/bash 作为运行命令,并检查容器是否可以访问互联网:
docker run -it --network=host --shm-size=1g --rm --name=test1 --privileged --entrypoint="" containerID /bin/bash
(containerID其实就是镜像名称或者镜像ID)
如果一切正常,我建议逐个添加其他参数,然后检查哪个参数存在问题。
-u root
--dns 8.8.8.8
--cap-add=NET_ADMIN
--cap-add=SYS_ADMIN
--device=/dev/net/tun
--sysctl net.ipv6.conf.all.disable_ipv6=0
另一件事是,似乎拥有--net=host
和--sysctl net.ipv6.conf.all.disable_ipv6=0
并不是真正正确的事情,因为在那种情况下,您将更改主机的参数,因为当您没有运行时您没有单独的网络堆栈--net=host
。
我认为错误的可能原因是: - 您的 VM 提供商不允许更改 net.ipv6.conf.all.disable_ipv6=0 - 您在 Dockerfile 中安装的软件包有问题(您是否使用它来构建容器,还是仅上传容器映像本身?)。您应该查看 docker 日志(可能需要删除它们--rm
才能获取它们) - 您的应用程序配置中存在一些错误,例如硬编码的 IP 地址或 DNS 名称,这些在服务器端环境中不存在。
我相信按照这些步骤您可以找到实际原因并解决问题。祝你好运。