Docker 镜像非常小,但您可以通过以下方式在官方 ubuntu docker 镜像中安装 ping
:
apt-get update
apt-get install iputils-ping
您的图像上可能不需要 ping
,而只是想将其用于测试目的。上面的例子会帮助你。
但如果您需要 ping
存在于您的映像中,您可以创建一个 Dockerfile
或 commit
将您运行上述命令的容器放入一个新映像中。
犯罪:
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 缓存文件等。
This 是 Ubuntu 的 Docker Hub 页面,this 是它的创建方式。它只安装了(有点)最低限度的软件包,因此如果您需要任何额外的东西,您需要自己安装它。
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
请使用 Google 查找教程并浏览现有的 Dockerfile 以了解它们通常是如何做的 :) 例如,应通过在 apt-get install
命令之后运行 apt-get clean && rm -rf /var/lib/apt/lists/*
来最小化图像大小。
echo -e
实际上是 defies the POSIX sh standard,除了在其输出上打印 -e
外,它不允许它做任何事情。 (即使使用某些版本的 bash,这也是默认行为)。请改用 printf
:printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash"
,并查看上述链接标准文档的应用使用部分。
--enable-xpg-echo-default
编译的 POSIX 模式下,或者使用适当的环境变量或其他运行时配置编译时,即使 bash 也不会像您期望的那样支持 echo -e
(而是具有符合标准的行为)。
-n
作为第一个参数或存在任何反斜杠文字时,POSIX 允许 echo 以实现定义的方式运行——但即便如此,它也是 实现定义的,而不是标准的——保证,因此行为取决于使用的单个外壳)。
或者,您可以使用已安装 ping 的 Docker 映像,例如 busybox:
docker run --rm busybox ping SERVER_NAME -c 2
apt-get iputils-ping
在需要它的图像上。
通常人们会拉取 Ubuntu/CentOS 的官方镜像,但他们没有意识到这些镜像是最小的,并且上面没有任何东西。
对于 Ubuntu,此映像是从 Canonical 提供的官方 rootfs tarball 构建的。鉴于它是 Ubuntu 的最小安装,默认情况下此映像仅包含 C、C.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
或从基础镜像启动容器并将这些实用程序安装在容器上,然后提交到镜像。 docker commit -m “任何描述性消息” container_id image_name:lattest
该图像将安装所有东西。
有时,Docker 中 Linux 的最小安装没有定义路径,因此有必要使用 ... 调用 ping。
cd /usr/sbin
ping <ip>
我在 debian 10 上使用了以下语句
apt-get install iputils-ping
每次遇到这种错误
bash: <command>: command not found
在具有该命令的主机上已经使用此解决方案: dpkg -S $(which
没有安装该软件包的主机?试试这个:apt-file search /bin/
或者,您可以在进入容器的网络命名空间后在主机上运行 ping
。
首先,在主机上找到容器的进程 ID(这可以是 shell 或您在容器内运行的应用程序)。然后切换到容器的网络命名空间(在主机上以 root
运行):
host# PS1='container# ' nsenter -t <PID> -n
修改 PS1
环境变量仅用于在您位于容器的网络命名空间中时显示不同的提示。
现在您可以使用 ping
、netstat
、ifconfig
、ip
等,前提是它们已安装在主机上。
container# ping <IP>
container# ip route get <IP>
....
container# exit
请记住,这只更改了网络命名空间,挂载命名空间(文件系统)没有更改,因此名称解析可能无法正常工作(它仍在使用主机上的 /etc/hosts
文件)
Temporary failure resolving 'security.ubuntu.com'
显然是因为网络不存在。apt install
的习惯,结果是“找不到包”,但正如答案所说,apt-get
工作得很好。docker exec -u 0 -it <container> /bin/bash
。其中-u 0
是用户 root。