写点什么

Docker 实战教程之从入门到提高 (一)

作者:Jerry Wang
  • 2022 年 4 月 11 日
  • 本文字数:2002 字

    阅读完需:约 7 分钟

Docker 实战教程之从入门到提高(一)

笔者将自己在云原生开发中的 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/docker/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 镜像存储目录的设计原理。

发布于: 2022 年 04 月 11 日阅读数: 51
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。

评论

发布
暂无评论
Docker 实战教程之从入门到提高(一)_Docker_Jerry Wang_InfoQ写作平台