一分钟内形成docker的模糊概念
网上很多文章避免将docker与虚拟机混为一谈,但对于初学者来说,完全可以将docker当做一种虚拟机技术,只需要牢牢记住一点最重要的区别:docker依赖于物理机的内核,所以在linux下“生成的docker”,一般不能直接在windows下运行。(虚拟机是完完全全模拟了一台物理机,这是一个很大的区别)。
当你有了这样的一个模糊概念,接下来只需要快速了解docker的三个基础组成部分,仓库、镜像、容器,就可以快速的应用起来。类比虚拟机,镜像就相当于安装虚拟机时用的iso文件,仓库自然就是一个官方存放镜像的地方,方便用户直接“下载”,当你的虚拟机运行起来后,就相当于一个容器。
我为什么使用docker,需求是什么
在很多项目中,我们需要对一些url进行定时拨测,获取这些url的各种指标,例如响应时间、渲染时间等等,网上有许多开源的工具供我们挑选使用,sitespeed就是其中之一。sitespeed可以对访问过程进行度量,形成各种指标。访问过程进行录相、截图。指标分为浏览(体验)类指标、评分指标、DNS指标等几个维度。关于sitespeed更为详细的介绍可自行搜索。
然后由于其使用图形界面的浏览器,不太适合做为服务端程序运行,同时其各种依赖库的安装配置较为麻烦,故以docker的方式运行是比较合适的。https://www.sitespeed.io/在sitespeed.io的官方介绍上也指出所提供的docker镜像部署了所有的运行环境,对于用户只需直接使用即可。
离线安装docker:部署yum源或者rpm/deb包安装
对于某些特定环境,服务器是不允许访问互联网的,因此不能直接从软件源下载docker进行安装,这就造成了很多依赖包安装的麻烦。在此可以有几种不同的离线安装方式可供选择:
- 对于ubuntu系统,你只需一台联网的同环境的虚拟机就可以得到deb安装包和所有的依赖包。
apt-get install --download-only docker
这条命令的具体用法可以自行搜索,解决令人头疼的依赖问题简直舒服。 - 对于centos系统,同样可以搜索所有的依赖包,通过rpm包的方法安装。但更加推荐部署本地yum源的方式,简单高效一劳永逸,部署步骤可自行搜索。
镜像文件的导入导出
不能访问互联网,意味着docker提供的官方仓库也不可访问,因此需要我们在本地虚拟机docker pull sitespeed.io
相应的镜像,可以简单测试是否可用。
[~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest e38bc07ac18e 7 weeks ago 1.85 kB
docker.io/sitespeedio/sitespeed.io latest 38463a656de8 8 weeks ago 1.77 GB
[~]$ docker run hello-world
Hello from Docker!
通过docker images
看到本地存放了两个镜像,docker run *
命令可以简单的在某个镜像文件基础上启动一个容器。
接下来要做的就是将镜像文件使用save命令导出为tar文件:
docker save 38463a656de8> /root/sitespeed.tar
通过物理设备传输至离线服务器上,通过load命令导入镜像:
docker load < /root/sitespeed.tar
导入完成后,用docker images命令查看,惊奇的发现REPOSITORY和TAG列均为<none>,所以save命令保存的并不是所有的信息,具体的区别自行搜索即可。不过不影响使用,我们只要修改一下就可以正常使用了。
docker tag 38463a656de8 docker.io/sitespeedio/sitespeed.io:latest
docker镜像是如何制作的
基于docker提供的服务,我们想要制作自己特定功能的docker镜像,只需要按照格式编写一个Dockerfile文件即可。一个简单的Dockerfile如下:
FROM ubuntu14.04
COPY start.sh /start.sh
RUN apt-get install -y gcc
CMD
ENTRYPOINT ["/start.sh"]
FROM命令用于指定一个基础镜像(当然可以指定一个空镜像scratch),COPY和RUN都是字面意思,CMD和ENTRYPOINT 指定docker启动时的运行命令,关于二者的区别,在此不细说,推荐使用ENTRYPOINT。
编写完成后,运行命令:docker build -t my_name:my_tag
通过docker images
命令就可以看到本地已经有了刚刚创建的镜像,通过
docker run my_name:my_tag
就可以启动并运行。
不得不提的是,Dockerfile中的每一条命令都会创建一个临时层,(类似于套娃的感觉)所以要注意命令的书写方式,比如多条RUN命令合为一条书写。同时,减少不必要的操作。例如,新建一个文件,在后面步骤又删除了,这样两次操作都会存储在最终的docker镜像中,生成镜像的体积也会增大,这就是网上一些不成熟的镜像体积很大的原因。
关于docker启动时的很多参数都可以自己按需查找,个人觉得-v和--entrypoint参数结合使用,会对大家测试一些小东西很有帮助。
-v 指定一个本地目录挂载到容器中指定位置
--entrypoint 指定docker运行入口,覆盖Dockerfile中的CMD和ENTRYPOINT
例如:
docker run --entrypoint /app/start.sh -v /root/app:/app docker_img.io
首先通过-v将本地的/root/app目录挂载到镜像中的/app目录,之后再通过--entryponit指定运行入口为/app/start.sh。
有了这样的用法,我们可以通过Dockerfile建立一个包含各种运行环境的基础镜像,通过这样的方式,测试我们自己的小程序(虽然应用场景有限)。当然还是要牢记文章开头所说的,docker是需要基于物理机的内核。
补充:关于docker的垃圾回收问题
在某次意外操作后,发现依赖docker的应用无法正常运行,排查原因发现竟然是磁盘空间不足,docker无法启动。发现在/var/lib/docker/目录下存在大量文件,原来docker每次运行时会在/var/lib/docker/containers以及/var/lib/docker/overlay下生成一些相关文件,具体作用可自行查阅。但问题在于docker运行结束并不会自动回收产生的这些记录文件,随着时间的积累,导致历史文件会越来越多。如何解决,docker官方提供了相关的垃圾回收功能,需手动运行,当然也可以自己编写垃圾回收守护进程,或者在github上有许多好的开源程序可供使用。
本文主要叙述了一些简单的docker使用场景,若果个别地方有错误,请不吝指出。