本文先简单介绍Docker,并利用一个例子演示如何使用,然后介绍几种分享Docker的方式。
一、Docker原理
其实Docker没有想象中难以理解和上手,它非常简单,这里不直接大段复制教科书式的概念。用自己的话来概述其本质。
1.1 四个名词
有几个名词是使用频率很高的,我们一定要有所了解。
- image(镜像)
- 我们可以理解为一个文件,它包含了执行过程中需要的所有东西-代码、执行环境、各种库、配置文件等等。在docker中,image是只读文件,它像一个洋葱,一层一层地累加修改点,从而构成各种各样的形式。例如ubuntu的image、nginx的image等等。当两个image中的几层是相同的,docker就可以只实际保存一份,在底层共享。
- container(容器)
- container就是一个image的运行实例。由于image是只读的,加载进内存后,为它挂载文件系统、加入一层可读写文件层,真正跑起来。
- repository(仓库)
- 我们的image可以提交push到远程仓库,也可以从仓库里pull拉取到本地。这个和git很类似,其实docker仓库这里借鉴了很多git的设计理念。
- *registry(注册服务)
- 额外说一下,这里不要和仓库混淆,注册服务是保存仓库的地方,每个仓库存放某一类镜像。国内有墙的存在,从官方registry下载镜像很慢。所以一般都会将registry替换为国内的镜像,例如阿里云的,这样会快很多,下部分的内容会演示如何操作。
1.2 与传统的虚拟机底层对比
我们基本都使用过像VMware、VirtualBox等虚拟机软件,这些软件会虚拟化一个机器的概念,我们需要安装操作系统、软件等,就如同虚拟化了一个硬件机器一样。这层虚拟化可想而知,效率不高,占有宿主机的内存和cpu都较高。
那么Docker同样作为一个虚拟化技术,为何现在这么流行和普及呢?用一张官网的图来说明:
可以从左图看出,Docker中一个执行容器和其他容器都共享当前Linux内核等,它运行在一个进程上,和宿主机器上其他普通的进程没啥区别,不会占用过多内存,所以非常轻量。
而传统的虚拟机就不同了,它在宿主机中完全虚拟化了一个环境,还需要操作系统、运行库等等,这个过程会占用很多的内存和cpu。同时,由于模拟层数过多,效率也不高。我们平时使用虚拟机过程中,应该有所感受。
1.3 Docker受欢迎的根本原因
上面说到Docker很轻量,这还仅仅是它的一个优点,并不足以颠覆目前的运维模式。**我觉得它最重要的一个点就是:通过一次创建或配置,代码就可以在任意机器、时间,完全一样的部署运行**。大家再也不用担心环境不一致的问题,繁琐的部署过程也变得异常简单。这一点解决了诟病多年的环境部署难题,受到了开发、运维、测试等的一致拥护,也从一定程度上颠覆了传统开发和运维的模式。
二、Mac下搭建环境
接下来介绍下mac下如何搭建docker环境,然后演示如何运行Nginx容器。
环境介绍:
机器:mac os 10.12.3
2.1 搭建docker环境
2.1.1 官网下载Docker安装包
官网下载链接:https://download.docker.com/mac/stable/Docker.dmg
直接很慢,我是用迅雷下的,国内会快点。
2.1.2 安装
双击安装包文件,如下图拖入。
然后在应用列表里双击打开,各种ok都点上,最后系统状态栏会出现Docker的Icon图标,然后点击看到“Docker is running!”,说明安装成功。
打开一个终端,执行以下命令验证是否安装成功:
docker version
我这里显示这样,说明安装成功了:
2.1.3 设置阿里云registry镜像站点加速
为了更快的下载image,我们使用阿里云的registry镜像站点。
- 获取专属阿里云镜像站点地址
访问阿里云:https://cr.console.aliyun.com/#/accelerato
下图红框中的地址。
- 本地设置
如下图操作点击Preferences,点击Daemon,点+号,添加上面阿里云里得到的地址,然后点击“applly&restart”让它重启生效。
2.2 本地运行Nginx容器
一个简单的示例。
2.2.1 拉取Nginx的image镜像
先拉取Nginx的image镜像文件到本地执行:
docker pull nginx
上面命令会从仓库拉取nginx的最新镜像到本地。
2.2.2 run镜像
然后再运行该image镜像,-d是后台执行,-p是把本地8000端口映射到容器的80端口,执行:
docker run -d -p 8000:80 nginx
2.2.3 验证
打开浏览器,访问:http://127.0.0.1:8000
三、几种分享方式
3.1 镜像本地导出、载入
3.1.1 导出镜像
使用命令将本地配置好的镜像导出为文件,例如将上面的nginx镜像导出为文件,执行:
docker save -o nginx.tar nginx:latest
然后再在前目录就会有镜像文件nginx.tar。
3.1.2 载入镜像
将tar文件载入到本地镜像库中,执行:
docker load --input nginx.tar
3.2 容器本地导出、载入
某些时候需要将一个容器迁移到另一个容器。
3.2.1 导出容器
不管容器当前是否在运行,都可使用docker export命令来导出:
docker export -o nginx_container.tar da2
其中da2为容器的唯一标识的前若干位。
3.2.2 导入镜像
docker import nginx_container.tar - nginx:v.1
3.3 将镜像push到仓库
将镜像push到仓库,类似git一样推到云端。Docker仓库也分公共和私有仓库。如果需要在其它地方部署,只需要从云端的仓库拉到本地运行即可。
3.4 Dockerfile编写
Dockerfile就如同一个配置文件,它描述了每一步的操作,最终直接构建出一个镜像出来。其实DockerFile有自己的一套语法,后面有时间专门整理下,这里不阐述。
示例
接下来使用一个小例子来感受一下,以下为官方的hell-world镜像的Dockerfile内容:
FROM scratch COPY hello / CMD ["/hello"]
FROM scratch,的意思是以scratch镜像为基础,如果本地没有,会自动拉到本地。
COPY hello /,COPY指令将本地当前目录下的hello文件复制到镜像内“/”路径下。
CMD ["/hello"],CMD指令指明镜像启动时自动执行的命令,此处执行上一步传入的hello文件。
这样,我们使用Dockerfile就能将环境配置固化,大家都能一键生成相同的运行环境。更进一步,开发、测试、运维等等的环境就能轻松统一起来,这样大家就可以更专注地聚焦业务逻辑,而不用关心如何去配置环境。
四、总结
大家可以看到,简单使用Docker并不是很难。现在公司里运维基本是都是基于Docker了,腾讯云、阿里云上也都能支持Docker部署,后面自己做的项目也会尽量往上靠。
Docker如何改造?Kubernetes如何部署?已经列到计划里啦~