简介
在本次实验中,你将学习如何使用 docker image push
命令将你的 Docker 镜像上传到镜像仓库(registry)。这个过程对于与他人共享你自定义的镜像或将其部署到不同环境至关重要。
你将首先提交在运行中的容器内所做的更改,以创建一个新的镜像。然后,你将学习如何为特定的镜像仓库为这个镜像适当地打标签,这是推送镜像之前的关键步骤。最后,你将练习将打了标签的镜像推送到镜像仓库,包括如何推送与一个镜像关联的所有标签。
在本次实验中,你将学习如何使用 docker image push
命令将你的 Docker 镜像上传到镜像仓库(registry)。这个过程对于与他人共享你自定义的镜像或将其部署到不同环境至关重要。
你将首先提交在运行中的容器内所做的更改,以创建一个新的镜像。然后,你将学习如何为特定的镜像仓库为这个镜像适当地打标签,这是推送镜像之前的关键步骤。最后,你将练习将打了标签的镜像推送到镜像仓库,包括如何推送与一个镜像关联的所有标签。
在这一步中,你将学习如何将运行中的容器内所做的更改提交为一个新的 Docker 镜像。当你想要在对容器进行修改(例如安装软件或配置文件)后保存容器的状态时,这非常有用。
首先,让我们运行一个简单的 Ubuntu 容器。我们将使用 ubuntu
镜像。由于我们要在容器内部进行更改,因此需要使用伪 TTY 以交互模式运行它。
docker run -it ubuntu
现在你应该已经进入了 Ubuntu 容器的 shell。让我们做一个简单的更改,比如安装 curl
包。
apt-get update
apt-get install -y curl
安装完成后,通过输入 exit
退出容器的 shell。
exit
现在你已经退出了容器,你所做的更改(安装 curl
)仍然存在于该特定的容器实例中。要将这些更改保存为一个新的镜像,你需要提交这个容器。
首先,找到你刚刚退出的容器的 ID。你可以使用 docker ps -a
命令列出所有容器,包括那些已经退出的容器。
docker ps -a
查找从 ubuntu
镜像创建的容器,并记录其 CONTAINER ID
。
现在,使用 docker commit
命令从这个容器创建一个新的镜像。基本语法是 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
。我们将提交这个容器,并为新镜像指定一个名称和标签。将 <CONTAINER_ID>
替换为你实际找到的 ID。
docker commit < CONTAINER_ID > my-ubuntu-with-curl:v1
这个命令创建了一个名为 my-ubuntu-with-curl
、标签为 v1
的新镜像。你可以通过列出本地镜像来验证新镜像是否已创建。
docker images
你应该会在镜像列表中看到 my-ubuntu-with-curl
。这个新镜像现在包含了你在容器中安装的 curl
包。
在这一步中,你将学习如何为 Docker 镜像打标签,以便将其推送到特定的容器镜像仓库(registry)。当你将镜像推送到镜像仓库时,标签用于在该镜像仓库中标识该镜像。为镜像仓库为镜像打标签的标准格式是 [registry-hostname[:port]]/repository[:tag]
。
在上一步中,你创建了一个名为 my-ubuntu-with-curl
、标签为 v1
的镜像。现在,让我们为这个镜像针对一个假设的镜像仓库打标签。为了演示的目的,我们将使用 localhost:5000
作为我们的镜像仓库地址。
你可以使用 docker tag
命令为现有的镜像创建一个新标签。基本语法是 docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
。
让我们为我们假设的镜像仓库为 my-ubuntu-with-curl:v1
镜像打标签。
docker tag my-ubuntu-with-curl:v1 localhost:5000/my-ubuntu-with-curl:v1
这个命令创建了一个新标签 localhost:5000/my-ubuntu-with-curl:v1
,它指向与 my-ubuntu-with-curl:v1
相同的镜像。
你可以通过再次列出本地镜像来验证新标签是否已添加。
docker images
现在你应该会看到一个标签为 v1
的 localhost:5000/my-ubuntu-with-curl
条目。这表明该镜像现在已打好标签,准备好推送到 localhost:5000
的镜像仓库了。
在这一步中,你将学习如何将打了标签的 Docker 镜像推送到容器镜像仓库(registry)。推送镜像后,其他人就可以拉取并使用该镜像。
在将镜像推送到本地镜像仓库之前,你需要运行一个镜像仓库。在这个实验中,我们将运行一个临时的本地镜像仓库容器。
首先,拉取 registry
镜像。
docker pull registry:2
现在,运行镜像仓库容器。我们将把主机上的 5000 端口映射到容器上的 5000 端口。
docker run -d -p 5000:5000 --name local-registry registry:2
这个命令启动了一个名为 local-registry
的分离式容器,该容器运行着 Docker 镜像仓库。
在上一步中,你为镜像 my-ubuntu-with-curl:v1
打了 localhost:5000/my-ubuntu-with-curl:v1
的标签。这个标签包含了我们本地镜像仓库的地址(localhost:5000
)。
现在,你可以使用 docker push
命令将这个打了标签的镜像推送到本地镜像仓库。语法是 docker push NAME[:TAG]
。
docker push localhost:5000/my-ubuntu-with-curl:v1
你应该会看到显示推送操作进度的输出,包括正在推送的层。
推送完成后,镜像 my-ubuntu-with-curl:v1
现在已存储在你位于 localhost:5000
的本地镜像仓库中。
在这一步中,你将学习如何将与特定镜像关联的所有标签推送到容器镜像仓库(registry)。有时,你可能会有多个标签指向同一个镜像(例如,latest
、v1.0
、stable
)。你可以使用一条命令推送所有这些标签。
在前面的步骤中,你创建了一个名为 my-ubuntu-with-curl
的镜像,并为其打上了 v1
和 localhost:5000/my-ubuntu-with-curl:v1
的标签。现在,让我们为这个镜像添加另一个标签。我们将为本地镜像仓库为其打上 latest
标签。
再次使用 docker tag
命令添加 latest
标签。
docker tag my-ubuntu-with-curl:v1 localhost:5000/my-ubuntu-with-curl:latest
现在,列出你的镜像以查看新标签。
docker images
现在你应该会看到 localhost:5000/my-ubuntu-with-curl
同时有 v1
和 latest
标签,它们都指向同一个镜像 ID。
要将这个镜像的所有标签推送到本地镜像仓库,你可以使用 docker push
命令,并指定仓库名称而不指定标签。
docker push localhost:5000/my-ubuntu-with-curl
Docker 会识别与 localhost:5000/my-ubuntu-with-curl
仓库关联的所有标签,并将每个标签推送到镜像仓库。你会看到显示 v1
和 latest
标签推送进度的输出。
推送完成后,你的镜像的两个版本(v1
和 latest
)都可以在本地镜像仓库中使用了。
在这个实验中,你学习了如何将运行中的 Docker 容器内所做的更改提交为一个新镜像。这个过程包括运行一个容器、在容器内进行修改(例如安装软件)、退出容器、识别容器的 ID,然后使用 docker commit
命令基于容器的状态创建一个新镜像。你还学习了如何为新创建的镜像分配名称和标签,并使用 docker images
命令验证其是否存在。