笔者将自己在云原生开发中的 Kubernetes 工作经验写成了一个系列实战教程:
- 适合 Kubernetes 初学者的一些实战练习 (一)
- 适合 Kubernetes 初学者的一些实战练习 (二)
- 适合 Kubernetes 初学者的一些实战练习 (三)
- 适合 Kubernetes 初学者的一些实战练习 (四)
- 适合 Kubernetes 初学者的一些实战练习 (五)
- 适合 Kubernetes 初学者的一些实战练习 (六)
从本文开始,笔者将开启一个新的系列写作,主题是 Kubernetes 运行的基石之一:Docker 技术。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
这个系列同上面提到的 Kubernetes 实战系列文章一样,分享若干笔者在实际项目中的 Docker 使用案例和经验。
练习1:Ubuntu 系统里 Docker 的安装步骤
由于 Ubuntu 里 apt 官方库里的 docker 版本比较低,因此先用下面的命令行卸载旧版本(如果有的话)
sudo apt-get remove docker docker-engine docker-ce docker.io
更新 apt 包索引:
sudo apt-get update
执行下列命令行,使 apt 可以通过 HTTPS 协议去使用存储库:
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
添加 Docker 官方提供的 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
设置 stable 存储库:
sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”
最后再次更新 apt 包索引:
安装最新版本的 docker-ce:
sudo apt-get install -y docker-ce
安装完毕后,可以看到 Docker 服务已经从 /lib/systemd/system/docker.service
启动了,dockerd 进程 id 为 4921:
命令行 ps -aux 查看进程 id 为 4921 的进程路径:/usr/bin/dockerd -H fd://
使用命令 sudo docker version
可以查看安装 docker
的版本:
使用命令 sudo docker run hello-world
,能观察到从远程下载这个测试用的容器:
Pulling from library/hello-world:
然后看到打印消息:
Hello from Docker!
说明 Docker 安装成功。
练习2:如何处理 Docker 错误消息 request canceled
在本地安装 Kubernetes 时,遇到错误消息:
request canceled while waiting for connection(Client.Timeout exceeded while awaiting headers)
这个原因是 Docker 应用没有正确设置代理。在 Mac 上设置代理非常方便:
在 Proxies 面板里,选择 Manual proxy configuration
, 即手动设置。
设置完之后,点击按钮 Apply & Restart
:
之后在 shell 里使用命令行 docker pull gcr.io/google_containers/pause-amd64:3.1
可以成功把 Docker 镜像下载到本地。
使用命令 docker images
,能够查看到成功安装的镜像:pause-amd64
练习3:如何处理 Docker 错误消息:please add——insecure-registry
本地安装 Kubernetes 时,遇到如下的错误消息:
pleade add --insecure-registry gcr.io to daemon’s arguments
解决方案:点击 Docker 的 Preference 菜单:
点击 Daemon 标签页,在 Insecure registries
里维护记录:
将错误信息里提到的 gcr.io 维护进 Insecure registries, 点击按钮 Apply & Restart
, 重新启动Docker Daemon:
之后错误消息消失。本解决方案在 Mac OS 上测试通过。
练习4:从 Hello World 例子学习 Docker 镜像的目录存储设计
我们成功安装完 Docker 后,执行命令行 sudo docker run hello-world
, 如果是第一次执行,则会从远程拉取 hello-world
的镜像到本地,然后运行,显示 hello world
.
以 ubuntu 系统为例,本地镜像存储于目录 /var/lib/docker
文件夹下:
相关目录介绍如下。
- /var/lib/dockerker/image/overlay2:存储镜像管理数据的目录,以使用的存储驱动命名,在我的 ubuntu 系统上,使用的驱动为 overlay2。
其中 repositories.json 文件相当于 SAP UI5 里的 manifest.json, 以及 nodejs 项目中的project.json:
- /var/lib/docker/image/overlay2/distribution$: 从远端拉到本地的镜像相关元数据。
- /var/lib/docker/image/overlay2/imagedb: 镜像数据库。
- /var/lib/docker/image/overlay2/imagedb/content:
每镜像层次的配置 digest, 也就是镜像 ID。content 文件夹里能看到一个 sha256 子文件夹。
进入该子文件夹,会看到一个以镜像 ID 命名的文件,我们用命令行 docker images
看到的镜像 ID 的前 12 位就来自这个文件。
- /var/lib/docker/image/overlay2/layerdb: 镜像每个 layer 的元数据。
进入 sha256,会看到 layer 的 chain ID:
chain ID 内的内容:
总结
本文首先介绍了 Docker 在 Ubuntu 系统上的安装步骤,然后通过本地安装 Kubernetes 时遇到的两个和 Docker 相关的错误,分享了实际项目中 Docker Proxy 和 Insecure Registry 的设置步骤,最后从 Docker Hello World 级别的入门例子入手,介绍了 Docker 镜像存储目录的设计原理。