由浅入深 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 协议》,转载必须注明作者和本文链接
图挂了?
@Vick 因为图片引用的知乎的,好像不太稳定,原文写在了我的知乎,可以前往查看。
可以再讲下 docker-compose
@lovecn 会的,第三篇讲,可以看文章里的计划
讲的很棒,刚开始接触,感觉讲的简洁明了~收藏收藏
知乎的也挂了很多啊
K8S了?
提到 docker,我就想到 https://github.com/laradock/laradock 这个仓库,我都是跟着这个仓库学习的,边抄边学。
建议搞一个自己的 docker 小仓库,边用边抄边学,效果会更好。
楼主,图片可以直接复制粘贴过来的。
嗯 docker总结的挺不错的 比较详细和有条理~