我对docker很新,我对标记(--tag)图像和为其指定名称(--name)之间的区别感到有些困惑。 例如,我可以看到,如果我从Docker文件构建自定义图像,我可以使用名称标记它:
sudo docker build --tag=tomcat-admin .
sudo docker run -it tomcat-admin
将名称传递给docker inspect会产生一个结果:
docker inspect tomcat-admin
但是它不包含“命名”图像的相同属性:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' tomcat-admin
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings
“
有人对此有所了解吗? 谢谢!
答案 0 :(得分:24)
我认为你在这里混合了两个概念,这引起了混乱。一方面,有一个Docker镜像,您可以将其视为启动容器的蓝图。另一方面,有些容器正在运行基于图像的实例。
当您docker build -t tagname .
创建图像并通常使用“name:tag”格式标记它时。例如,您正在构建图像
docker build -t myimage:1.0 .
使用版本 1.0 创建名为 myimage 的新图像。这是您在运行docker images
时将看到的内容。
当您根据图像创建和启动新容器时,将使用--name
参数。例如,您使用以下命令运行新容器:
docker run -it --name mycontainerinstance myimage
这会根据您的图片 myimage 创建一个新容器。此容器实例名为 mycontainerinstance 。您可以在运行docker ps -a
时看到此信息,该列表将列出容器名称为 mycontainerinstance 的容器。
为了更好地理解差异,请查看building an image和running a container,specifying an image的文档。阅读文档时,您会注意到哪些命令以图像为目标,哪些命令用于容器。您还将看到,有些命令适用于像docker inspect这样的图像和容器。
当然,只有在提供容器名称而不是图像时才检查网络地址。在您的特殊情况下,容器会生成一个生成的名称,您可以通过运行docker ps -a
来查看该名称。当您为docker inspect
命令提供此名称时,您可能会看到所需的IP地址。
答案 1 :(得分:9)
您标记图片
docker build --tag=tomcat-admin .
但是您为容器指定了名称
docker run -it tomcat-admin
您可以为图像指定多个标签,例如
docker build --tag=tomcat-admin --tag=tomcat-admin:1.0 .
如果您列出图像,则每个标记会获得一行,但它们与相同的图像ID相关:
docker images |grep tomcat
tomcat-admin 1.0 955395353827 11 minutes ago 188 MB
tomcat-admin latest 955395353827 11 minutes ago 188 MB
您也可以再次标记图像,而不仅仅是在构建图像时,这样您就可以保留不同的图像版本。
当您根据特定图像运行容器时,可以为其指定名称,因此您可以使用名称而不是使用containerId来引用它。
显然,通过检查图像和容器可以获得不同的属性。如果你对图片标签和容器名称使用不同的名称,我认为会更清楚,例如
docker build --tag=tomcat-admin .
docker run -d -ti --name=tomcat-admin-container tomcat-admin
docker inspect tomcat-admin ==> You inspect the image
docker inspect tomcat-admin-container ==> You inspect the container
答案 2 :(得分:2)
令人困惑的是,标签由名称和标签组成。在文档中,您可以看到:
--tag , -t Name and optionally a tag in the ‘name:tag’ format
因此,如果省略:tag
部分,则实际上为图像添加了名称。就是这样。
图片名称和容器名称之间的差异在其他答案中得到了解释。