由浅入深 docker 系列(1)

第一篇介绍 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] 可以删除对应镜像,如果镜像正在被容器引用则无法删除。

 

« »

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *