Docker—Ubuntu—bash: ping: command not found

我有一个运行Ubuntu的Docker容器,我这样做:

docker run -it ubuntu /bin/bash

然而,它似乎没有ping。如。

bash: ping: command not found

我需要安装它吗?

这似乎是最基本的命令。我尝试了whereis ping,它没有报告任何东西。

743629 次浏览

Docker镜像是非常小的,但是你可以通过以下方法在你的官方Docker镜像中安装ping:

apt-get update -y
apt-get install -y iputils-ping

您可能不需要在映像上使用ping,而只是想将其用于测试目的。上面的例子会帮助你。

但如果您需要ping存在于映像上,则可以将运行上述命令的容器Dockerfilecommit创建到新映像中。

提交:

docker commit -m "Installed iputils-ping" --author "Your Name <name@domain.com>" ContainerNameOrId yourrepository/imagename:tag

Dockerfile:

FROM ubuntu
RUN apt-get update && apt-get install -y iputils-ping
CMD bash

请注意,在创建docker映像时有一些最佳实践,比如在创建映像后清除apt缓存文件等等。

是Ubuntu的Docker Hub页面,是它的创建方式。它只安装了最少的包,因此如果你需要任何额外的包,你需要自己安装。

apt-get update && apt-get install -y iputils-ping

然而,通常你会创建一个“Dockerfile”并构建它:

mkdir ubuntu_with_ping
cat >ubuntu_with_ping/Dockerfile <<'EOF'
FROM ubuntu
RUN apt-get update && apt-get install -y iputils-ping
CMD bash
EOF
docker build -t ubuntu_with_ping ubuntu_with_ping
docker run -it ubuntu_with_ping

请使用谷歌查找教程和浏览现有的Dockerfiles,看看它们通常是如何做的:)例如,图像大小应该通过在apt-get install命令后运行apt-get clean && rm -rf /var/lib/apt/lists/*来最小化。

或者你也可以使用一个已经安装了ping的Docker映像,例如busybox:

docker run --rm busybox ping SERVER_NAME -c 2

通常人们会拿出Ubuntu/CentOS的官方形象,但他们没有意识到这些形象是最小的,上面没有任何东西。

对于Ubuntu,这个映像是由Canonical提供的官方rootfs tarball构建的。鉴于它是Ubuntu的最小安装,这个映像默认只包括C、c.t utf -8和POSIX区域设置。

一个人可以在容器上安装net-tools(包括ifconfig, netstat), ip-utils(包括ping)和其他喜欢的curl等,可以从容器中创建镜像,也可以写Dockerfile,在创建镜像时安装这些工具。

下面是Dockerfile的例子,在创建图像时,它将包括这些工具:

FROM vkitpro/ubuntu16.04
RUN     apt-get  update -y \
&& apt-get upgrade -y \
&& apt-get install iputils-ping -y \
&& apt-get install net-tools -y \
CMD bash

或从base image启动容器,并在容器上安装这些实用程序,然后提交到image。 Docker commit -m "any描述性消息" container_id image_name: latest

该映像将安装所有的东西。

每次你遇到这种错误

bash: <command>: command not found
  • 在已经使用这个解决方案命令的主机上:

    dpkg -S $(which <command>)
    
  • Don't have a host with that package installed? Try this:

    apt-file search /bin/<command>
    

有时,Docker中Linux的最小安装没有定义路径,因此有必要使用....调用ping

cd /usr/sbin
ping <ip>

我在debian 10上使用了下面的语句

apt-get install iputils-ping

或者,您可以在进入容器的网络名称空间后在主机上运行ping

首先,在主机上找到容器的进程ID(可以是shell,也可以是在容器中运行的应用程序)。然后切换到容器的网络命名空间(在主机上以root的身份运行):

host# PS1='container# ' nsenter -t <PID> -n

修改PS1环境变量仅用于在容器的网络名称空间中显示不同的提示。

现在可以使用pingnetstatifconfigip等,前提是它们安装在主机上。

container# ping <IP>
container# ip route get <IP>
....
container# exit

请记住,这只改变了网络名称空间,挂载名称空间(文件系统)没有改变,因此名称解析可能无法正确工作(它仍然使用主机上的/etc/hosts文件)