如果您开始容器化之旅, 首先会遇到的就是 Docker https://www.docker.com/ . 通过学习本教程, 您可以快速入门: 它为您提供了可与 Docker , Dockerfile ,IBM Cloud™ 以及 IBM Container Registry https://cloud.ibm.com/kubernetes/catalog/registry 一起使用的工具.
前提条件
免费试用 IBM Cloud
利用 IBM Cloud Lite https://cocl.us/IBM_CLOUD_GCG 快速轻松地构建您的下一个应用程序. 您的免费帐户从不过期, 而且您会获得 256 MB 的 Cloud Foundry 运行时内存和包含 Kubernetes 集群的 2 GB 存储空间. 了解所有细节并确定如何开始.
注册获取免费 IBM Cloud 帐户 https://cocl.us/IBM_CLOUD_GCG .
预估时间
完成本教程大约需要 45 分钟.
Docker
我们需要做的第一件事是安装 Docker. 可以通过几种方法进行安装, 但是第一个也是最好的方法是前往 主要的 Docker 文档站点 https://docs.docker.com/ . 尝试使用和维护最新版本的 Docker, 并为您的特定操作系统安装该 Docker.
在编写本教程时, 有两个主要的 Docker 版本. 我想花点时间讨论一下不同的版本. 这两个版本分别是 Docker Community Edition ( docker-ce ) 和 Docker Enterprise Edition ( docker-ee ). 它们各有优点, 并且针对不同的用例. 我强烈建议您在学习完本教程后, 重新考虑 docker-ce 还是 docker-ee 更适合您.
以下步骤和命令应该在任一版本上均适用, 那么, 让我们继续.
Docker CLI
安装了 docker 之后, 打开命令提示符. 在安装过程中, 文档可能会要求您运行一个完整性检查. 我们将再次运行以下命令, 以确保一切正常.
docker run hello-world
您应该会看到类似以下输出的内容.(如果出现错误或不是类似如下的内容, 那么说明您的安装未正确设置, 您应该在进行其他操作之前先解决此问题.)
- Hello from Docker!
- This message shows that your installation appears to be working correctly.
- To generate this message, Docker took the following steps:
- 1. The Docker client contacted the Docker daemon.
- 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
- (amd64)
- 3. The Docker daemon created a new container from that image which runs the
- executable that produces the output you are currently reading.
- 4. The Docker daemon streamed that output to the Docker client, which sent it
- to your terminal.
- To try something more ambitious, you can run an Ubuntu container with:
- $ docker run -it Ubuntu bash
- Share images, automate workflows, and more with a free Docker ID:
- https://hub.docker.com/
- For more examples and ideas, visit:
- https://docs.docker.com/get-started/
恭喜! 您有了一个有效的 docker 实例. 让我们开始使用该实例.
下面是我希望您尝试的下一个命令. 根据您的互联网访问情况, 可能需要一些时间来运行, 但幸运的是, 它将缓存到您的计算机上, 稍后我们将再次访问此处.
docker run -it CentOS:latest /bin/bash
在这个过程中, 我们来谈谈发生了什么. 当您运行 docker 命令时, 您是在告诉 Docker, 您需要从公共 Docker Hub 获取 latest 副本, 并使用 /bin/bash 的 shell 运行它. 该命令运行到互联网, 查看您拥有的版本, 检查缓存镜像的 SHA, 如果您没有 SHA, 那么从 Dockerhub 中提取. 为了清楚起见, -it 以 interactive 方式运行它, 并为容器创建 tty . 您现在应该会看到以下内容.
- Unable to find image 'centos:latest' locally
- latest: Pulling from library/CentOS
- a02a4930cb5d: Pull complete
- Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
- Status: Downloaded newer image for CentOS:latest
- [root@2de726a5fcb8 /]#
恭喜! 现在, 您有了第二个正在运行的 Docker 容器. 继续并键入 exit , 然后再次运行该 docker 命令.
- [root@2de726a5fcb8 /]# exit
- exit
- $ docker run -it CentOS:latest /bin/bash
- [root@583c6cec5d41 /]#
注意, 根 @2de726a5fcb8 和 @583c6cec5d41 有何不同? 这是因为当您以这种方式创建容器时, 它们是临时性的. 临时性意味着它们只在运行的时间内存在, 所以一旦退出, 它们就会消失. 稍后我们将向您展示如何构建寿命较长的容器.
现在, 让我们操作一下容器. 作为 CentOS 机器 https://www.centos.org/ , 您具有 yum , 那么让我们安装一些内容.
- [root@583c6cec5d41 /]# yum install VIM
- [-- snip --]
- Transaction Summary
- =======================================================================================================
- Install 1 Package (+32 Dependent packages)
- Total download size: 19 M
- Installed size: 63 M
- Is this ok [y/d/N]: y
- [-- snip --]
- perl-podlators.noarch 0:2.5.1-3.el7 perl-threads.x86_64 0:1.87-4.el7
- perl-threads-shared.x86_64 0:1.43-6.el7 VIM-common.x86_64 2:7.4.160-5.el7
- VIM-filesystem.x86_64 2:7.4.160-5.el7 which.x86_64 0:2.20-7.el7
- Complete!
- [root@583c6cec5d41 /]#
现在可以在容器中运行 VIM 了! 试用一下吧.
[root@583c6cec5d41 /]# VIM
如果您不知道如何退出 VIM , 请输入: :q , 您应该会再次看到命令提示符.
现在再次输入 exit .
- [root@583c6cec5d41 /]# exit
- exit
- $ docker run -it CentOS:latest /bin/bash
- [root@86f1f3872cbe /]# VIM
- bash: VIM: command not found
- [root@86f1f3872cbe /]# exit
- exit
- $
再次强调一下, 当容器消失时, 容器中的所有更改也都将消失.
Dockerfile
我们可以构建容器并对其进行更改, 但如何保持更改呢? 有几种方法, 我鼓励您自己去发现这些方法. 但我会向您介绍最常用的方法: 使用 Dockerfile .
返回至命令提示符, 创建一个新目录, 并使用选择的 $EDITOR 更改目录, 以打开一个名为 Dockerfile 的新文件.
- $ mkdir docker-tutorial
- $ cd docker-tutorial
- $ $EDITOR Dockerfile
我将在此处介绍 Dockerfiles 的重点, 但我强烈建议您查看 Best Practices 上的[文档] [dockerfile], 以了解它们的功能.
在您的 Dockerfile 中, 编写以下内容:
- FROM CentOS:latest
- RUN yum install VIM -y && mkdir /VIM
- WORKDIR /VIM
- ENTRYPOINT ["vim"]
保存文件并确保其名为 Dockerfile .
让我们来讨论一下上面四行是什么意思.
FROM : 通过 CentOS : latest Docker 镜像创建一个层
RUN : 通过将 VIM 安装到容器中并创建名为 /VIM 的目录来构建容器
WORKDIR : 通知容器工作目录的位置
ENTRYPOINT : 是在容器启动时运行的命令, 而非我们上面操作的 /bin/bash
现在让我们在本地构建. 在 Dockerfile 所在目录中运行以下命令, 让我们一起看看结果.
- $ docker build .
- Sending build context to Docker daemon 2.048kB
- Step 1/4 : FROM CentOS:latest
- ---> 1e1148e4cc2c
- Step 2/4 : RUN yum install VIM -y && mkdir /VIM
- ---> Running in ebd37633ab31
- Loaded plugins: fastestmirror, ovl
- Determining fastest mirrors
- * base: mirror.fileplanet.com
- * extras: mirror.ash.fastserv.com
- * updates: www.gtlib.gatech.edu
- Resolving Dependencies
- [-- snip --]
- Step 4/4 : ENTRYPOINT ["vim"]
- ---> Running in 82618eb1e891
- Removing intermediate container 82618eb1e891
- ---> eda2652aa25e
- Successfully built eda2652aa25e
- $
注意: 您应该具有另一个散列 eda2652aa25e , 请谨记这一点.
恭喜! 您已经构建第一个 Dockerfile 和定制 docker 容器.
现在让我们来试一试. 继续运行以下命令:
$ docker run -it eda2652aa25e
您应该会看到 VIM 启动! 记住, :q 是退出方式, 然后您应该会再次看到命令提示符. 您可以根据需要多次运行它, 并且每次都会有一个新的 VIM 实例; 但您实际上不能保存任何内容或读取任何内容, 因为它是容器, 对吧? 让我们来解决这个问题.
我们将添加绑定安装和卷, 以将本地目录安装到容器中. 如果您想了解有关安装和卷的更多信息, 我建议从 此处 https://docs.docker.com/storage/volumes/ 开始 - 这是较难的概念之一, 但值得您花时间去了解.
在命令行上, 创建一个名为 hello 的文件, 然后在其中保存单词 hello world .
$ EDITOR hello
现在, 让我们将本地目录安装到容器中.
$ docker run -it -v ${PWD}:/VIM eda2652aa25e
在 VIM 中输入 :e hello . 您应该会看到 hello world 出现! 如您所见, 您打开了在主机上创建的文件, 创建了一个带有 VIM 的容器, 安装了目录 并且能够打开该文件!
如果您希望输入 i 并输入一些内容, 完成后输入 :wq . 该容器应该已关闭, 然后您可以在命令行上输入以下内容:
- $ cat hello
- hello world
- I added this line from my container
- $
注意: 很显然, I added this line from my container 是我写的内容. 您将会看到自己编写的内容.
太棒了! 现在, 让我们开始弄清楚如何将此容器分享给全世界.
IBM Cloud
我假设您已经安装并运行了 ibmcloud CLI; 如果不是这种情况, 请查看此处并逐步完成安装过程.
继续并登录, 确保您根据所需的后端进行了身份验证.
- $ ibmcloud login --sso
- API endpoint: https://api.ng.bluemix.net
- Get One Time Code from https://identity-2.us-south.iam.cloud.ibm.com/identity/passcode to proceed.
- Open the URL in the default browser? [Y/n]> Y
- One Time Code>
- Authenticating...
- OK
- [-- snip --]
- Tip: If you are managing Cloud Foundry applications and services
- - Use 'ibmcloud target --cf' to target Cloud Foundry org/space interactively, or use 'ibmcloud target --cf-api ENDPOINT -o ORG -s SPACE' to target the org/space.
- - Use 'ibmcloud cf' if you want to run the Cloud Foundry CLI with current IBM Cloud CLI context.
- $
现在让我们创建一个容器注册表名称空间. 您需要花点时间, 想一个全球独一无二的内容, 这个内容的描述足以说清楚它是什么. 务必不要将个人信息放在 容器镜像, 名称空间名称, 描述字段 (例如, 在注册表令牌中) 或任何镜像配置数据 (例如, 镜像名称或镜像标签) 中.
- $ ibmcloud cr namespace-add jjasghar
- Adding namespace 'jjasghar'...
- Successfully added namespace 'jjasghar'
- OK
此命令使用容器注册表插件在我的帐户中创建名称空间 jjasghar .
幸运的是, IBM 为您创建了一些捷径. 如果我们想将容器推送到我们创建的 IBM Container Registry, 只需一个命令. 在运行此命令之前, 让我们快速讨论一下发生了什么. 此命令将构建容器, 并使用 VIM 名称和版本 1 对其进行标记, 然后将其推送到注册表. 您需要对名称 jjasghar 进行更改, 可能也需要更改容器的名称.
注意: 勿忘记末尾的 . 以及您放置 Dockerfile 的地方 - 这就是 build 命令知道在哪里运行的方式.
- $ ibmcloud cr build --tag registry.ng.bluemix.NET/jjasghar/VIM:1 .
- Sending build context to Docker daemon 3.072kB
- Step 1/4 : FROM CentOS:latest
- latest: Pulling from library/CentOS
- a02a4930cb5d: Pull complete
- Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
- Status: Downloaded newer image for CentOS:latest
- ---> 1e1148e4cc2c
- Step 2/4 : RUN yum install VIM -y && mkdir /VIM
- [-- snip --]
- Successfully tagged registry.ng.bluemix.NET/jjasghar/VIM:1
- The push refers to repository [registry.ng.bluemix.NET/jjasghar/VIM]
- 36ce508f1fe2: Pushed
- 071d8bd76517: Pushed
- 1: digest: sha256:831fcbac319dda1aab3d022c408ecc5cc1c1b825bcd90fc7694c3d4f0ef4eb9a size: 741
- OK
太好了! 现在, 我们有了一个推送到所创建的 IBM Container Registry 的容器!
让我们通过运行以下命令来列出您的容器, 以验证它是否已推送:
- $ ibmcloud cr image-list
- Listing images...
- REPOSITORY TAG DIGEST NAMESPACE CREATED SIZE SECURITY STATUS
- us.icr.io/jjasghar/VIM 1 831fcbac319d jjasghar 4 minutes ago 120 MB No Issues
- OK
现在, 通过运行以下命令来提取您的容器:
- $ docker run -v ${
- PWD
- }:/VIM -it registry.ng.bluemix.NET/jjasghar/VIM
- Unable to find image 'registry.ng.bluemix.net/jjasghar/vim:latest' locally
- docker: Error response from daemon: Get https://registry.ng.bluemix.net/v2/jjasghar/vim/manifests/latest: unauthorized: authentication required.
哦, 不! 上面的消息是错误响应, 让我们尝试找出问题所在. 我们需要登录到注册表并运行以下命令:
- $ ibmcloud cr login
- Logging in to 'registry.ng.bluemix.net'...
- Logged in to 'registry.ng.bluemix.net'.
- [-- snip --]
- $ docker run -v ${
- PWD
- }:/VIM -it registry.ng.bluemix.NET/jjasghar/VIM
- Unable to find image 'registry.ng.bluemix.net/jjasghar/vim:1' locally
- 1: Pulling from jjasghar/VIM
- a02a4930cb5d: Already exists
- 209873925a88: Pull complete
- Digest: sha256:831fcbac319dda1aab3d022c408ecc5cc1c1b825bcd90fc7694c3d4f0ef4eb9a
- Status: Downloaded newer image for registry.ng.bluemix.NET/jjasghar/VIM:1
- # and you should see VIM now
大功告成! 您现在知道了如何创建容器并将其发布到 IBM Container Registry!
我们需要做的最后一件事是删除容器. 运行以下命令以清理本地缓存, 并将其从云注册表上的名称空间中删除.
$ docker rmi registry.ng.bluemix.NET/jjasghar/VIM:1
上面包含您的名称空间, 镜像名称和版本. 最后, 将其从云注册表中删除:
- $ ibmcloud cr image-rm us.icr.io/jjasghar/VIM:1
- Deleting image 'us.icr.io/jjasghar/vim:1'...
- Successfully deleted image 'sha256:831fcbac319dda1aab3d022c408ecc5cc1c1b825bcd90fc7694c3d4f0ef4eb9a'
- OK
结束语
感谢您学习本教程. 希望您对一些通用的 docker 命令, Dockerfiles 的工作方式以及如何使用 IBM Cloud Container Registry 有了更多的了解. 如果您有任何疑问或想法, 请随时通过 Twitter @jjasghar 与我联系.
现在, 您已经完成了本教程的学习, 已经知道了如何使用 Docker 和 Container Registry, 接下来要做些什么? 您可以通过我们的 Kubernetes 学习路径 , 进一步学习容器和编排.
如果您有兴趣进一步试验 Docker, 请尝试学习教程: 获取对 DockerHub 公共和私有存储库的访问权限 和 在 Docker 容器中创建数据库以进行本地开发 https://developer.ibm.com/tutorials/docker-dev-db/ .
参考资源
来源: http://www.tuicool.com/articles/NVRFZj7