docker容器内的项目,无法运行curl(访问或监控)外部网页链接

AI摘要

本文介绍了在Docker容器中无法访问外部网络的问题,并提供了解决方法。首先需要进入容器并测试能否访问外部网络,如果报错则需要安装curl,建议将其添加到Dockerfile中以便未来使用,最后再次测试应该就能正常访问了。

先排查问题

进入docker容器内,直接命令行访问链接

sudo docker exec -it [container_id] /bin/bash #填入自己的容器ID或名称,进入容器

如果这一步都报错,提示没有/bin/bash比如以下报错内容

OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown

那说明一个问题,容器中似乎没有/bin/bash。这可能是因为容器基于一个仅包含最基本组件的基础镜像(如alpine镜像)。

尝试使用/bin/sh作为容器内的shell:

sudo docker exec -it [container_id] /bin/sh

到这里,应该可以正确进入容器内的命令行了,运行以下命令来测试能否访问外部网络

curl -s -o /dev/null -w '%{http_code}' https://www.czl.net

如果这里没问题,返回200,那说明不是我找到的这个问题,可以跳过并去问chatgpt了。

但是如果这里报错了,比如以下内容:

/bin/sh: curl: not found

那就是我找到的这个问题了,这个容器镜像根本没有curl,自然无法访问外部网络链接了,可以按照以下方法进行安装。

安装curl

看起来容器中没有安装curl。这可能是导致无法运行脚本的原因。要解决此问题,您需要在容器中安装curl

既然容器使用的是Alpine Linux,请运行以下命令来安装curl

apk update
apk add curl

完成后,可以再次测试curl命令:

curl -s -o /dev/null -w '%{http_code}' https://www.czl.net

如果curl命令现在可以在容器内正常运行,请尝试重新启动服务并检查其状态。

为了避免将来遇到类似的问题,建议在Dockerfile中将curl添加到安装的软件包列表中,以确保它在构建容器时被安装。这是一个示例Dockerfile片段,用于安装curl

FROM alpine
RUN apk update && apk add curl
...

将该片段添加到Dockerfile中,并重新构建容器。这样一来,就可以确保curl始终可用于脚本。

安装过程命令行应该显示为:

/usr/src/vigil # apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/x86_64/APKINDEX.tar.gz
v3.17.3-250-g30850c73a4c [https://dl-cdn.alpinelinux.org/alpine/v3.17/main]
v3.17.3-250-g30850c73a4c [https://dl-cdn.alpinelinux.org/alpine/v3.17/community]
OK: 17823 distinct packages available
/usr/src/vigil # apk add curl
(1/5) Installing ca-certificates (20230506-r0)
(2/5) Installing brotli-libs (1.0.9-r9)
(3/5) Installing nghttp2-libs (1.51.0-r0)
(4/5) Installing libcurl (8.1.2-r0)
(5/5) Installing curl (8.1.2-r0)
Executing busybox-1.35.0-r29.trigger
Executing ca-certificates-20230506-r0.trigger
OK: 9 MiB in 20 packages

安装后再测试,应该就正常了

curl -s -o /dev/null -w '%{http_code}' https://www.czl.net
200