为 Docker Hub 创建 Docker 镜像
为 Docker Hub 创建 Docker 镜像
介绍
在 Docker 中开发和部署任何应用程序的故事都始于 Docker 镜像。但您需要知道如何创建 Docker 镜像吗?让我们来看一个例子!
假设你是一名软件开发人员,想要开发一款需要 Python 运行环境和一些依赖项的应用程序。但不仅如此,你还需要在云机器上运行它,并让它像在本地机器上一样工作。
您可能想到的一种方法是下载并在计算机上安装 Python,配置环境变量,安装所有应用程序依赖项,然后运行该应用程序。现在,要在服务器上运行应用程序,您需要重新执行这些步骤。更疯狂的是,假设您想扩展该应用程序,并且必须将其部署到另外一百台服务器上。即使您是一名勤奋的程序员,并且已经准备好完成所有工作,但如果在检查应用程序代码时发现了错误,或者需要添加新功能,该怎么办?Bingo!!
处理此类问题的另一种更有效的方法是创建应用程序的 Docker 映像。为此,您需要获取 Python 运行时作为映像,然后与此 Python 运行时及其所有依赖项一起构建应用程序。这是一个简单且一次性的过程。但是,一旦该映像准备就绪,您就可以在任何 Linux 机器上多次部署您的应用程序。此应用程序将部署在容器中,这称为容器化。容器灵活、轻量、可移植且可扩展。
我知道你现在会很兴奋地创建自己的第一个镜像,但在此之前,让我们先看看什么是 Docker 镜像和容器。根据 Docker 的文档,
映像是一个可执行包,其中包含运行应用程序所需的一切——代码、运行时、库、环境变量和配置文件。
容器是镜像的运行时实例,即镜像在执行时在内存中变成的样子(即具有状态的镜像或用户进程)。
在本指南中,我们将探索和学习如何创建 Docker 镜像并将其推送到 Docker Hub。
关于 Docker Hub 你需要知道的事情
Docker 镜像可以与 git 存储库进行比较。就像 git 存储库一样,它可以托管在 GitHub、Bitbucket、GitLab 甚至私人 git repo 托管服务上,但我们可以将 Docker 镜像托管在 Docker 存储库托管服务(如 Docker Hub)上。
Docker Hub 是 Docker 提供的一项服务,用于托管、查找和共享 Docker 存储库。与 git repo 托管服务一样,Docker 存储库可以是公共的,也可以是私有的。还存在第三方存储库托管服务。Docker Hub 和其他第三方存储库托管服务称为注册表。例如,RedHat 有自己的注册表来托管其容器映像。
需要记住的一点是,一个注册表有许多存储库,而一个存储库有同一镜像的许多不同版本。这些注册表可以是私有的,也可以是公共的,具体取决于组织的需求。Docker Hub 就是一个这样的公共注册表示例。
Docker 配置为使用 Docker Hub 作为其默认注册表。使用$ docker info命令查看 Docker 当前正在使用的注册表。默认情况下,它指向 https://index.docker.io/v1/,这是 Docker Hub 的注册表位置。
$ docker info
...
Registry: https://index.docker.io/v1/
...
官方和非官方 Docker 镜像
在 Docker Hub 上,有两种镜像 -官方和非官方。官方镜像是值得信赖和优化的。它们具有清晰的文档,促进最佳实践,并且是为最常见的用例而设计的。另一方面,非官方镜像是用户创建的任何镜像。Docker Hub 遵循一些标准,以便可以轻松识别两者。官方镜像仅包含 <image_name>作为其镜像名称,而非官方镜像的语法为<username>/<image_name>。此外,官方镜像在列表中有官方文字,如下面的屏幕截图所示。
Ubuntu 官方镜像
用户 ubuntuz 的非官方图片
从 Docker Hub 下载镜像
在 Docker Hub 中搜索图像
我们还可以使用网站上的搜索栏或使用以下命令在 Docker Hub 上查找和找到图像:
$ docker search <image_name>
让我们搜索一个名为 busybox 的图像:
$ docker search busybox
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 316 [OK]
progrium/busybox 50 [OK]
radial/busyboxplus Full-chain, Internet enabled ... 8 [OK]
odise/busybox-python 2 [OK]
azukiapp/busybox This image is meant to be used as ... 2 [OK]
从注册表中提取镜像或存储库
要下载特定镜像或一组镜像(即存储库),请使用docker pull。如果没有提供标签,Docker Engine 将默认使用:latest标签。
$ docker pull <image_name>:<tag_name>
让我们拉取最新的 Debian 镜像:
$ docker pull debian
Using default tag: latest
latest: Pulling from library/debian
fdd5d7827f33: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:e7d38b3517548a1c71e41bffe9c8ae6d6d29546ce46bf62159837aad072c90aa
Status: Downloaded newer image for debian:latest
创建 Docker 镜像
我们可以通过两种方式创建自己的 Docker 镜像:
1.使用Dockerfile创建镜像
Dockerfile 是一个简单的文本文档,其中包含 Docker 用于构建映像的一系列命令。Dockerfile 中支持的几个命令包括 FROM、CMD、ENTRYPOINT、VOLUME、ENV 等。一个简单的 Dockerfile 如下所示:
FROM busybox:latest
CMD ["date"]
注意:要记住的一点是,该文件应命名为Dockerfile。
docker build命令从Dockerfile构建镜像。要从上面的 Dockerfile 构建镜像,请使用以下命令:
$ docker build -t example_image .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM busybox:latest
---> db8ee88ad75f
Step 2/2 : CMD ["date"]
---> Using cache
---> b89335fdacdf
Successfully built b89335fdacdf
Successfully tagged example-image:latest
现在,让我们基于我们的镜像运行一个容器。你会发现它会打印出日期,如下所示:
$ docker run -it --name example_app example_image
Sun Jul 21 20:52:20 UTC 2019
2. 从容器创建镜像
创建镜像的另一种方法是拉取 Docker 镜像,从中创建容器,然后对其进行修改或更改,例如在该容器中安装我们的应用程序。现在,使用docker commit命令,我们可以从容器中创建 Docker 镜像。
让我们看一个如何从 example_app 容器创建 Docker 镜像的示例:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
c3df2dd33276 example-image "date" 5 seconds ago Exited (0) 4 seconds ago example_app
$ docker commit example_app example_image2:latest
sha256:7b48e8355aa7a7ea32d554f26d0bd21f4d069d8526c68f1d098acac9111a9adf
将映像发布到 Docker Hub
为了能够将我们的 Docker 镜像发布到 Docker Hub,我们需要遵循一些步骤:
步骤 1:注册 Docker Hub
在将镜像推送到 Docker Hub 之前,我们首先需要在 Docker Hub 上有一个帐户。请访问此链接创建一个帐户。注册过程相对简单。
第 2 步:在 Docker Hub 上创建存储库
要将我们的镜像上传到 Docker Hub,我们首先需要创建一个存储库。要创建存储库,请执行以下操作:
- 登录Docker Hub
- 在 Docker Hub 欢迎页面上单击“创建存储库”:
- 将存储库名称填写为example-image,即我们之前使用 Dockerfile 创建的 Docker 镜像。另外,请描述您的存储库,例如“我的第一个存储库”。最后,单击创建按钮。请参阅以下屏幕截图:
步骤 3:将镜像推送到 Docker Hub
现在我们将构建的映像推送到 Docker Hub 注册表:
使用 Docker CLI 从本地机器终端登录到 Docker 公共注册表:
$ docker login
Tag the image
This is a crucial step that is required before we can upload our image to the repository. As we discussed earlier, Docker follows the naming convention to identify unofficial images. What we are creating is an unofficial image. Hence, it should follow that syntax. According to that naming convention, the unofficial image name should be named as follows: <username>/<image_name>:<tag_name>. In my case, I need to rename it as gauravvv/example_image:latest
$ docker tag example_image:latest gauravvv/example_image:latest
Publish the image
$ docker push gauravvv/example_image:latest
Upload your tagged image to the repository using the docker push command. Once complete, you can see the image there on Docker Hub. That's it; you have successfully published your Docker image. If you want to test out your image, use the below command and launch a container from it:
$ docker pull gauravvv/example_image:latest $ docker run -it gauravvv/example_image:latest
福利:推送至非 Docker Hub 注册表
到目前为止,我们已经学习了如何创建新的 Docker 镜像、标记它并将其推送到 Docker Hub。在使用 Kubernetes 或 OpenShift 时,我们将使用内部托管的 Docker 注册表;一些组织也喜欢托管自己的内部私有注册表。因此,您应该知道如何将 Docker 镜像发布到内部托管的 Docker 注册表。幸运的是,Docker 使其更易于访问,就像发布到 Docker Hub 一样,但略有不同。
步骤 1:登录非 Docker Hub 注册表</fon
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~