由浅入深 docker 系列

最近公司在做一个项目,为了方便程序员配置环境以及线上自动测试,架构师配置了docker环境,之前就经常听说docker却不会用,这次也就顺便学习了下,看了很多资料,解决了很多困惑,也觉得很多文章写的不够清晰深入,因此想自己写一个系列,能帮助别人更快的入门、更彻底的认识docker。

初步计划共有六篇文章,第一篇介绍docker的安装及简单使用,docker pull、run、start等等;第二篇介绍单个docker的构建,Dockfile相关指令;第三篇介绍如何方便的使用多个docker容器组合提供服务,即docker-compose项目;第四篇介绍kernel与user space,容器与虚拟机的区别、优劣等等;第五篇介绍docker的资源隔离,主要为linux内核的cgroups功能;第六篇介绍docker的文件分层,即Union File System。

相信这个系列文章看完,你能够熟悉docker的基本使用、构建,对docker的整体架构、原理、优劣有清晰的认识,在使用中遇到问题也能够快速准确的定位、解决,不至于连关键点都找不到,只能靠试,效率极低。

这个系列主要是为了讲自己学习中困惑,以及觉得别人没有讲明白的地方,本人水平有限,难免有错误或者遗漏之处,欢迎留言讨论~


一:docker的产生是为了解决什么问题?有什么优点?

新技术产生必然是为了解决某些需求、痛点,否则这项技术就没有意义。而docker的出现,解决了应用快速部署、隔离性等问题。举例来说,现在Python很火,你想学习写个爬虫,然后要装python、scrapy以及一堆依赖;过几天你又要装django,它们之间依赖的包版本可能冲突,很痛苦,如果用docker则它们是独立的环境,互不影响,这就是隔离性,(当然你也可以用virtualEnv等工具);但是可能你朋友看到你的程序觉得哇好酷,我也想试试,你又得指导他安装环境,又很痛苦,如果用docker则你把配置文件发给他,一条命令启动,这就是快速部署,想想这能带来多少方便,当然docker还有其它优势,轻量、安全等,我们慢慢说,逐步体会。

二:docker的安装

docker官方提供了 windows和 mac平台的一键安装包,这是最省心的安装方式,可以在docker官网下载(需要注册账号,记住,接下来还要使用),直接运行,如果需要权限同意即可。

不过这对系统版本有要求,根据官方说明,windows 要求 win10 64位,教育版或专业版,主板开启虚拟化(一般默认开启),4G 内存。mac 要求macos 10.11以后,不能安装 VirtualBox 4.3.30以前版本。如果你无法满足这些,可以尝试Docker Toolbox

对于 linux 安装或者更详细的指导,可以参考官方文档

三:docker的基本概念

docker 安装之后需要手动启动,看到如下界面,即代表启动成功。

打开终端,执行 docker -v,能看到 docker 版本信息。

接下来,我们介绍下 docker 的基本概念, image镜像,container容器,Repository仓库。docker 本意是集装箱,但在这里,我们暂时不用这个比喻,到后面讲解文件系统时再用,更好理解。之前讲过,docker 的出现是为了应用的可移植、快速部署,对此来说,docker 镜像就是安装文件,你从网上下载的 exe 或其它文件;容器就是你安装到本机的程序;仓库,就是你下载软件的地方。

既然仓库是下载软件的地方,你自然会想到,是不是有很多地方可以下载?是的,有很多公开或者私人仓库。而其中,Docker Hub是 docker 官方的仓库注册服务器,上面有众多官方和私人仓库,接下来我们都将从这里下载需要的镜像。首先你需要登录,使用之前注册的 docker 账号,可以在启动界面输入用户密码或者命令行输入 docker login 登录。

四:docker 的使用

1. HelloWorld

一切准备好了,当然要先运行下 helloWorld,简单执行 docker run hello-world,即可看到Hello -world 输出及docker对此做的解释。

我们发现,docker 没有在本地找到hello-world,于是从仓库下载然后运行。 docker 镜像名称全称为repository/image:tag,repository 代表不同的开发者仓库,默认为 docker 官方仓库即library;tag 代表标签,可以理解为版本,默认为 latest,因此实际上我们上面下载的是library/hello-world:latest

2. Ubuntu

但是,这个运行的 hello-world 对我们毫无帮助。假如我们想运行一个 ubuntu 试试,该如何做呢?

第一步,需要找一个合适的镜像,我们可以在命令行搜索,docker search ubuntu,然后会得到一系列镜像名称,以及简介,star数,是否官方维护等信息,你可以选择一个合适的使用。

当然,你也可以到 DockerHub手动搜索,在这里你能得到更多镜像的介绍、帮助,重要的是有版本信息,我们可以选择想要的版本,比如16.04。

第二步,将镜像下载到本地,以便重复使用。命令:docker pull ubuntu:16.04

如果执行 docker image ls,可以看到所有你下载过的镜像。

第三步,运行容器。命令:docker run ubuntu:16.04

你会发现,并没有任何输出。这是因为,docker 本质上是一个进程,我们并没有给他传入命令,因此我们给它传入 uname -a,看下它的内核版本。

可以看到,程序正常输出了。当然你的输出可能不大一样,后面介绍 docker 原理时你就知道原因了。这里你可以将 uname 换位任何你想执行的命令。

但是还不够,既然是 ubuntu,我们可能想进入系统,安装软件,做一些操作。这就需要-it 参数,执行 docker run -it ubuntu:16.04 /bin/bash,可以发现我们得到了一个 shell,你可以正常的安装软件或者使用了,你所做的一切都在容器内部,不影响你的系统。

这里,-i 表示interactive交互式,-t 表示得到一个 terminal。

如果你安装了一些软件,比如 git,然后 exit退出,再次执行 run 命令进入,你会发现 git 找不到了,这是因为每次执行 run 命令都将从我们下载的镜像新建一个容器,而 git 是装在上一个容器里,自然找不到了。那我们需要如何做呢?

首先,执行 docker container ls -a 查看所有的容器(不加-a 只能看到正在运行的容器),你应该能看到不止一个 ubuntu 的容器,注意它们的 id、commamd、names不同。

找到我们执行 /bin/bash 命令的 ubuntu 容器的 id 或者 name,然后执行 docker start -i [id/name],就可以进入之前创建的容器,可以继续之前的工作。

当然,你应该还会用到其它的一些参数,比如--name指定容器名字,后面再 start 这个容器就不用查 id 了;-v挂载文件,将你本地的代码挂载进 docker;或者-p映射端口,将 docker 的端口映射到本机,以便提供http 等服务。
例如,创建一个名字为 lixiang-ubuntu的镜像,将我本地 code下的代码挂载到镜像/root/app目录下,并将虚拟机的80端口映射到本机8080,命令如下:

可以看到,app 目录下已经有了本机的文件,你可以将你的代码、ssh 文件等共享给 docker,注意你对docker 里挂载的文件的修改,实质是对本机文件的修改。这样你就可以在本地用 IDE 编辑文件,然后用docker 里的环境运行程序。如果你需要提供 http 服务,则在docker 内80端口起服务,在本机8080端口即可正常访问。

同样,如果你关闭了此容器,下次执行 docker start -i lixiang-ubuntu 就可以继续工作了。

如果你需要其它的环境,比如 python、Scrapy、TensorFlow 等,尽管在 DockerHub 上搜索,然后 docker pull、docker run、docker start 就好了,应该已经能够满足你的大多数需求。

最后,再简单说下 docker 容器、镜像的删除等。

首先,执行 docker ps 或者 docker container ls 可以看到正在运行的容器。

执行docker ps -a或者 docker container ls -a可以看到本机所有的容器。

执行 docker container rm [id/name]可以删除对应容器,一次可以指定多个容器。

执行 docker image ls 可以查看本机所有的镜像文件。

执行 docker image rm [id/name] 可以删除对应镜像,如果镜像正在被容器引用则无法删除。

因为图片引用的知乎的,好像不太稳定,原文写在了我的知乎,可以前往查看。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

提到 docker,我就想到 https://github.com/laradock/laradock 这个仓库,我都是跟着这个仓库学习的,边抄边学。
建议搞一个自己的 docker 小仓库,边用边抄边学,效果会更好。

5年前 评论

@Vick 因为图片引用的知乎的,好像不太稳定,原文写在了我的知乎,可以前往查看。

5年前 评论

可以再讲下 docker-compose

5年前 评论

@lovecn 会的,第三篇讲,可以看文章里的计划

5年前 评论

讲的很棒,刚开始接触,感觉讲的简洁明了~收藏收藏

5年前 评论
不温柔

知乎的也挂了很多啊

5年前 评论

楼主,图片可以直接复制粘贴过来的。

5年前 评论

嗯 docker总结的挺不错的 比较详细和有条理~

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!