引言
掌握docker的基本操作已经是互联网开发人员必不可少的工作技能。你可能已经意识到这个问题,但是却不知道该如何入手,不知道docker具体能用来做什么。你可能很困惑,就像你在困惑k8s到底用来做什么一样。因为你工作中可能没有做过运维任务,服务的开发和部署都是在既定的流程框架内完成的。我一开始也是同样的困惑。没有经历过没docker的那些痛苦,或者说没有体验过docker带来的便利,有这样的困惑是正常的。
我们需要带着目的去学习。所以docker到底是什么,是用来解决什么问题的呢。
docker 是什么
抛开各种高大上的概念和术语,docker可以理解为一个运行时打包工具,一次打包就可以在装有docker的任何机器上运行。比如你要使用nginx部署一个静态网站到N台机器上,最直接的就是在这N台机器上安装nginx然后拷贝相关配置文件和代码到这N台机器的相应目录。实际上你可能会编写shell脚本来应对重复的工作,这是一个繁琐到让人抓狂的工作。另外一种是你可能使用虚拟机事先将运行环境nginx安装在虚拟机中,然后将虚拟机安装到N台主机上,避免了重复安装nginx的操作。但是虚拟机不是最佳方案,它启动一个完整的操作系统很耗系统资源,而且安装镜像比较大导致其传输效率很低。都把docker比做集装箱,操作系统或者云平台比做大货轮。那么虚拟机可以比做放在货轮上的大货车。两者优劣可想而知。
事实上关于服务的部署大致经历了三个时代:裸机部署时代、虚拟机部署时代、容器平台时代。由于虚拟机技术的弊端,它不是很普及可以说还没开始就被容器技术替代了。
可能还是很困惑,那么直接动手用docker跑一个你最熟悉的简单程序。要么继续深入的了解docker的概念:《可能是把Docker的概念讲的最清楚的一篇文章》。
docker 安装
现在docker的安装方式已经比较统一简洁,对于 windows或者mac系统的用户直接安装桌面版即可:https://www.docker.com/。
mac的docker桌面版我觉得是最适合开发和学习使用的,甚至还支持启动k8s环境。- windows桌面版没有用过不做评论,但是可以确定的是你如果在
windows中安装了VirtualBox或者其他虚拟机,那么windows桌面版和虚拟机你只能选择一个。一定要两者一起的话你只能使用docker machine安装docker,或者直接在虚拟机中安装docker。目前windows的linux子系统没法安装docker。总之,在windows下面玩docker有点不爽利。 - linux系统的用户一条命令安装最新版
docker ce(社区版,企业版是 docker ee):
curl https://get.docker.com|sh
当然也可以按照docker文档中的方式一步步安装:1docker安装文档。
先玩一下 docker
启动一个 nginx 服务
|
|
如果80端口事先没有被占用,在浏览器访问127.0.0.1就可以看到熟悉的nginx欢迎界面了。
让nginx服务运行一个自定义页面
不更改nginx配置的情况下,输出一个自定义页面。具体做法就是用我们编写好的页面替换nginx默认的欢迎页面。
查看nginx默认首页的位置:
|
|
以上都是为了查看nginx镜像中对nginx的默认站点的配置,你可能已经发现了在docker run命令最后面是可以运行任何当前镜像支持的命令的,不指定命令的时候运行镜像默认指定的命令,这个命令由Dockerfile文件定义。
可以看到默认首页位于 /usr/share/nginx/html 目录下,我们现在要做的就是使用自己创建的index.html代替默认的index.html。
替换默认首页
|
|
认识 Dockerfile
普遍的把docker比做集装箱,那么这个Dockerfile就是集装箱的货运单,它定义了集装箱包含哪些内容,docker按照这个货运单去创建集装箱(镜像)。
这里就不再深入讨论Dockerfile。直接继续上一小节的内容以对Dockerfile有个初步的认识。
- 创建一个 Dockerfile 文件,并编辑写入以下内容
|
|
确保整个过程中的index.html和Dockerfile都在一个文件夹下,然后运行以下镜像构建命令,将网页文件index.html打包到nginx这个运行时环境中,即名为docker-study的镜像:
|
|
运行镜像看看是否可以达到预期:
docker run -p 80:80 nginx-study
举一反三,我们也可以直接将编辑好的nginx配置打包到镜像中,以达到更多的目的。
了解 docker 三剑客
docker swarm
docker社区原生提供的容器集群管理工具。kubernetes已经是事实上的容器编排标准,尽管已经合并到docker主程序上,但是依然很尴尬。所以除非兴趣使然或者确实需要我建议直接去学习k8s,毕竟我就是从swarm转到k8s的。
docker compose
用来组装多容器应用的工具,可以在swarm集群中部署分布式应用,这个还是比较有用的可以让你少写很多重复命令,不仅在实际生产环境在平常开发中也是有必要掌握一下的。
docker machine
支持多平台安装docker的工具,和k8s的kubeadm是一个性质的工具,除非必要这个不用理会。