目录
背景
登录Docker Hub
创建Docker镜像
将镜像作为容器运行
修改Docker镜像
从修改后的容器创建新镜像以进行分发
分发Docker镜像
使用存储库分发
通过创建Tar文件进行分发
结论
背景在软件开发过程中,有时我们需要配置容器化解决方案并进行迭代式改进。在此过程中,从基本镜像开始创建docker镜像,并在最终确定软件包之前通过将所有需要的组件添加到镜像中来逐步改进。在这种情况下,我们从裸机镜像开始,然后在过程中不断添加其他层,然后将中间产品传递给其他版本。在此过程中,我们必须在修改镜像后从容器中创建镜像,然后将镜像传递给进一步修改。在本文中,我们将研究创建镜像,运行到容器中以及修改镜像以及最终使用公共存储库和基于文件的方法分发镜像的过程。
除了要通过这种技术术语的意愿,还需要进行以下操作。
- Docker Hub帐户——可以在https://hub.docker.com/创建免费的注册帐户
- Docker ——可安装https://www.docker.com/products/docker-desktop上的Docker桌面。
- 终端(例如PowerShell)——任何终端都可以用于执行docker命令。在示例中,我们将使用PowerShell。在PowerShell中,$用于定义变量,而#用于开始注释。
这些文章中的命令和示例是在Windows 10机器上使用Windows PowerShell和Docker版本20.10.2编写的。
登录Docker Hubdocker启动后,我们可以使用DockerId登录到docker。DockerID可以在验证Docker镜像的Docker注册表时用作用户名。要求Docker客户端连接到注册表以下载或上传镜像。Docker Hub是其中之一。可以在https://hub.docker.com/上创建一个帐户。
让我们启动一个PowerShell或Terminal窗口并使用以下命令登录:
docker login --username benktesh #password will be entered in the prompt
运行上述命令并验证用户身份后,将显示成功登录提示。
可以从头开始创建Docker镜像,或者我们可以使用公共可用镜像开始。在这里,我们将使用pull命令从Docker Hub获得Ubuntu 18.04镜像。请注意,可以从头开始创建镜像。请创建Docker镜像以获取有关创建镜像的信息。
Docker拉取Ubuntu:18.04
提取镜像后,我们可以通过执行image ls命令来验证该镜像是否存在。
Docker image ls
同时,如果安装了docker桌面,则镜像列表将显示镜像的存在。
到目前为止,我们已经在本地下载了Ubuntu 18.04的镜像。这类似于我们拥有虚拟机但未运行的情况。要运行此镜像,我们需要在容器内运行。可以使用以下命令通过以下方式将镜像作为容器运行:指定容器名称,例如基于镜像”ubuntu“的ubuntu_container, 标签为18.04,如下所示:
docker run -d --name ubuntu_container -i -t ubuntu:18.04
--name参数定义容器的名称,而ubuntu:1804表示镜像的repository:tag信息。参数-d确保容器以分离模式运行。通过使用变量,可以使上述命令可重用。例如,在PowerShell中,我们可以为容器名称和镜像定义一个变量并使用它。
$container = “ubuntu_container” #defines variable for container name
$image = “ubuntuL18:04” #defines a variable for image label
定义了此类变量后,命令可以使用以下变量:
docker run -d --name $container -i -t $image
上面的命令返回运行一个容器并返回该容器的ID。我们可以检查一下容器内部的内容。为此,我们可以通过执行以下操作在容器中打开bash shell:
docker exec -it $container bash
这将打开bash提示符,我们可以在其中执行cat /etc/os-release命令以查找有关容器中运行的Ubuntu镜像的发行信息。结果表明,我们正在运行Ubuntu 18.04.5版(Bionic Beaver)。
我们验证了我们的Ubuntu 1804在本地作为容器运行。发出退出命令可以使我们退出bash。
修改Docker镜像在容器运行之后,我们对其进行“填充”。例如,我们向容器添加了更多的层和应用程序以使其更有用。例如,我们可以添加一个应用程序,然后将镜像与应用程序一起分发给客户,或者将其作为增值镜像提供给以后使用。为了模仿这一点,我们将修改该容器并从该容器中创建一个新镜像,然后将其保存到docker存储库中以进行公共分发。
为了说明起见,在当前容器中,当我们执行lsb_release -a时,响应为“未找到命令”,这意味着该容器未提供lsb_release的功能。接下来,我们将通过添加lsb_release来更新此容器,并使它可用于所有应用程序。
作为修改的一部分,我们将更新基本版本,并安装lsb_release软件包,并将修改标记为完成。我们将首先使用apt update更新Ubuntu。然后,我们将使用apt install lsb-core安装lsb-core。安装完成后,我们可以执行lsb_release -a查找有关Ubuntu的最新信息。
现在我们可以看到lsb_release -a可用。因此,从本质上讲,我们对基本的Ubuntu镜像进行了少量更新。
就像我们安装的lsb-core一样,应用程序可以作为容器解决方案的一部分安装在此镜像中。对于本文档,我们认为我们现在已经更新了镜像,该镜像可以被其他人重用,从而可以分发了。
从修改后的容器创建新镜像以进行分发到目前为止,我们已经获得了一个从docker仓库中提取的Ubuntu 18.04镜像。我们创建了一个容器并更新了镜像,并将lsb-core安装到该容器中。我们通过执行docker镜像来检查镜像的状态,并通过执行docker ps -a来查看容器的状态,以分别查看镜像和容器的列表。注意ps代表进程状态。
我们可以从当前运行的容器镜像中创建一个新镜像,其中包括通过执行docker commit $ container返回的已创建镜像ID的sha256字符串所做的更新。执行docker镜像会显示ID为返回的sha256的新创建的镜像。此时,我们基于更新的容器镜像创建了一个新镜像。
我们可以通过提供适当的名称来标记新创建的镜像。我们将创建一个变量来存储新名称”ubuntu_modified:18.04”
$newImage = "ubuntu_modified:18.04"
现在,我们将承诺创建一个名为“ubuntu_modified:18:04”的新镜像。
docker commit $container $newImage
该命令返回一个sha哈希值以指示新创建的镜像的ID。可以使用docker images命令查看此镜像
在列表中,我们可以看到名为“ubuntu_modified”的新创建镜像,其镜像ID与所标识的sha256匹配,并显示了创建时间。请注意,对于新容器,该镜像的大小大于原始镜像的大小,因为我们已经为该镜像安装了新的更新。
现在,我们已经从修改后的容器中创建了一个新镜像,可以删除较旧的容器。首先,我们将停止容器,然后将其取出。
docker stop $container
docker rm $container
我们将通过运行docker ps命令验证该容器确实已删除。
现在,我们已经删除了旧容器,我们将根据修改后的镜像创建一个名为“modified_container”的新容器。现在,我们可以使用新创建的镜像运行另一个容器。让我们为新容器创建一个新变量
$newContainer = “modified_container”
使用以下命令启动一个新容器:
docker run -d --name $newContainer -i -t $newImage
在新创建的容器上打开一个bash shell。
docker exec -it $newContainer bash
执行lsb_release -acommand之后,请注意,该命令无需更新即可返回结果。执行退出将使我们摆脱困境。
和以前一样,停止并删除新创建的容器,因为我们不需要它。
docker stop $newContainer
docker rm $newContainer
分发Docker镜像
现在,我们已经创建了容器镜像,现在可以分发镜像了。有两种分配镜像的方法。我们可以通过将镜像推送到公共或私有存储库来分发它。为了说明起见,我们将使用Docker Hub存储库(https://hub.docker.com/repositories)放置要分发的镜像。
使用存储库分发首先,我们将标记镜像以添加存储库信息。docker.io是默认存储库。我们将创建一个变量$repositoryTag,其值为benktesh/ubuntu:1804,并标记最新的镜像并执行docker push命令
$repositoryTag = “benktesh/ubuntu:18.04”
docker tag $newImage $repositoryTag
docker push $repositoryTag
一个简单的docker push会将内容发布到外部世界,因为它在存储库中是公开可用的,我们可以通过导航到benktesh/ubuntu(https://hub.docker.com/repository/docker/benktesh/ubuntu)。
现在,该文件位于存储库中docker pull命令可用于获取镜像以供进一步使用。
通过创建Tar文件进行分发另一种方法是从镜像或容器创建tar文件。在这里,我们将探讨可以将docker镜像另存为tar文件的选项。
docker save -o ubuntu.tar $repositoryTag
上面的命令创建一个文件ubuntu.tar,它带有在变量$ repositoryTag中定义的,可以分发的标签。可以使用以下简单的docker命令将tar文件加载到docker中以生成镜像:
docker load -i ubuntu.tar
现在文件已加载,可以使用了。
在本文中,我们说明了如何通过使用公共存储库中的基础镜像创建docker镜像,如何在容器中运行该镜像,并通过必要的安装和升级来更新该容器,然后根据容器化的镜像修改来创建更新的镜像。我们还展示了如何将镜像推送到注册表进行分发,并研究了基于文件的方法来保存和加载镜像tar文件。
https://www.codeproject.com/Articles/5291837/Creating-Modifying-and-Updating-Docker-Image-from