Docker入门心得(一)
前言:
最近辞职找工作,比较有空,所以花了时间学习了一下docker,感觉这是一个有意思的技术。
我把最近的学习心得整理了一下,写了这篇文章。由于docker我也是初学,没经过项目实践,对它理解不够深刻。虽然文章中的知识点,我都查阅过多篇文章或者亲身实践印证,但尽管如此,还是难免有错误的地方,如果有人发现问题,欢迎留言指正。
docker是什么:
docker是一种新型的,轻量级的虚拟技术,它把软件及其依赖的环境打包起来,形成一个虚拟的整体,方便开发维护人员进行管理和调度。
docker与集装箱:
docker的英文意思是“码头工人”,而它的图标是一艘船上面放了许多个集装箱。集装箱是一种运送的货物统一规格的箱子,工人把货物放到集装箱里面,然后将箱子放在船上或车上运输到其它地方。
集团箱运输效率非常高,而且可以很方便地切换运输工具。而docker就是it界的集团箱技术,它把各式各样的软件封装成一个“箱子”里面,称之为“镜像”。人们把方便地进行对镜像进行传输,并在各种系统(目前只支持linux类)上运行。一个运行状态的镜像称之为“容器”。这些容器提供了统一的管理接口,让人们可以方便地运行,必要时也容易组装在一起。
docker和虚拟机的区别:
初学docker,很多人会有一个疑问:docker与虚拟机有什么区别?我在这里简单介绍一下。
从下面这张图,是从网络文章《这可能是最为详细的docker入门总结》里面摘取出来的。
左边的是docker虚拟技术的架构图,右边是使用vmware虚拟技术的。从图片上看,我们可以知道docker是在操作系统上做的虚拟层,而vmware是在硬件层上做的虚拟层。
一个docker容器一般只包括运行软件本身及其依赖的运行库(外壳层和应用软件),而一个vmware虚拟机则需要包括完整的操作系统(内核层和外壳层,应用程序和文件系统)。
因为实现原理不同,导致docker和虚拟机在很多方面上有差异,这里总结如下:
|
docker |
虚拟机 |
消耗资源 |
只消耗软件实际运行需要的资源,一台普通pc机可以轻松启动几十到上百个容器 |
需要预分配cpu/内存/硬盘资源,一台普通pc机一般只能启动几个虚拟机 |
文件大小 |
mb级别,只包括运行必要的文件和一些元数据,一般只包含操作系统外壳不包含内核 |
gb级别,需要包括完整的操作系统以及预分配的磁盘文件 |
隔离性 |
docker可以限制容器的资源消耗,但不能防止别的进程占用容器资源 |
虚拟机之前相互干扰比较少 |
启动速度 |
启动速度快,可以在秒级 |
十秒级甚至分钟级 |
安全性 |
docker运行环境导致开发维护人员需要使用root权限,风险比较高。有一些黑客手段可以在容器里面对宿主机器进行破坏。 |
安全性比较高 |
稳定性 |
docker版本一直在快速更新,不同版本间细节差异会比较大。 |
技术较稳定 |
这里补充一点操作系统的知识,有助于加深对这节内容的理解。linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。如图:
docker容器和虚拟机的相同点:
ø 都有和宿主机器独立的网络设置(包括主机名,ip,dns等)
ø 独立的目录结构
ø 独立的pid、ipc
docker使用例子:
俗话说百闻不如一见。这里使用docker搭建一个wordpress应用做为例子,演示如何使用docker,给大家一个直观的感觉。
演示过程你会看到一些陌生的名词或者命令,不过没关系,你可以忽略继续看这篇文章,后面会有解释。
1 首先我们用docker创建一个虚拟的网络环境,用来部署wordpress
[huangcihui:/home/huangcihui/wordpress] docker network create wordpress-net-demo
fed21aad3090bc95f9a1aba14f58a64a1f9a6f7830aa60c409c0a5edca2c8937
说明:新建的虚拟网络命名为wordpress-net-demo,后面需要使用到。
2 wordpress需要使用mysql,所以我们先用docker创建一个mysql容器
[huangcihui:/home/huangcihui/wordpress] docker run -d --name wordpress-mysql-demo --network wordpress-net-demo --network-alias db -e mysql_root_password=somewordpress -e mysql_database=wordpress -e mysql_user=wordpress -e mysql_password=wordpress -v $pwd/db-demo:/var/lib/mysql mysql:5.7
1ce24c93292641115885c6a186a925dd77747c9a70ae0533035c76c870d640e8
说明:
使用镜像mysql:5.7建立了一个容器,名称为wordpress-mysql-demo
-e参数是设置容器里面程序运行的环境变量,这里通过环境变量定义了mysql的基本参数
这里新建了一个mysql容器,并且指定其在虚拟网络wordpress-net-demo里面的域名为db,后面wordpress连接数据库时需要使用这个域名。(这里db和容器名称都会注册到前面创建的虚拟网络wordpress-net-demo内嵌的dns服务器127.0.0.11上)
mysql生成的数据文件默认存放在容器里面的/var/lib/mysq目录,我们使用-v参数,把这个目录映射到当前主机目录db-demo下面。如果不这样设置,容器删除后数据库数据也会跟着容器一起删除。
3 接着我们再docker创建一个wordpress容器
[huangcihui:/home/huangcihui/wordpress] docker run -d --name wordpress-demo --network wordpress-net-demo --network-alias wordpress -e wordpress_db_host=db:3306 -e wordpress_db_user=wordpress -e wordpress_db_password=wordpress -e wordpress_db_name=wordpress -p 8080:80 -v ${pwd}/wp-content-demo:/var/www/html/wp-content wordpress:latest
11fa9298da3e748448a5c0120a2fb5a2e65c078370807702ca68119b4810a61c
说明:
使用镜像wordpress:latest建立了一个容器,名称为wordpress-demo
通过启动时设置的环境变量指定了连接的数据库主机名称为db
使用-v把宿主机器上的wp-content-demo目录映射给容器,这样可以留存wordpress配置信息。
-p 8080:80参数的含义是把当前机器的8080端口映射到容器的80端口上面
容器启动后用curl测试是否能成功访问:http://192.168.2.109:8080/
如果命令能成功访问,一般说明启动成功,如果出现异常,可以使用docker logs wordpress-demo查看程序输出的错误信息
4 现在我们可以在自己机器上浏览这个新建的wordpress平台了
在浏览器输入 http://虚拟机ip:8080即可访问(如果访问失败,请检查虚拟机网络配置或者防火墙设置)
设置好博客信息后生成的相关文件会存放在db-demo和wp-content-demo目录下
从这个例子,我们可以看出docker的方便之处。使用docker你不需要先在网上找自己系统适用的mysql和wordpress安装包,再分别安装它们,并根据自己机器环境进行配置,最后才能启动一个wordpress。
使用docker,你只需要执行docker run,程序就会自动到docker hub寻找相应的镜像,并把它下载回来运行。
docker应用场景:
docker在以下场景下,可以有效提高我们的工作效率:
ø 替代虚拟机的部分功能
使用docker可以在一台机上模拟多机集群环境,可以让不同开发人员启动相同的程序而不互相干扰,可以方便地试验程序在不同操作系统环境运行情况。这些原来需要使用虚拟机实现的功能,现在可以使用docker轻松代替。
ø 简化配置,模拟生产环境
由于docker提供了网络,磁盘映射功能,使用我们不需要针对不同机器环境修改程序配置也可以运行。在开发/测试机器环境与生产机器环境有不同的情况,这个特性显得无比有用。
ø 使用docker实现快速部署
大名鼎鼎的kubernetes(k8s)就是一个基于容器技术的快速部署工具,而docker就是人们常用的容器技术之一。可以说docker实现了“一次部署,到处运行”。
ø 方便地同步与共享软件
人们可以轻松地将自己的软件打包上传到docker hub,根据各人需要随时下载到其它机器运行。当软件需要更新时,只需要重新执行docker pull <镜像名>,即可自动下载最新版本。
随着docker的更新以及它越来越广泛地被应用,docker还会有更多应用场景,大家可以根据docker特性自己挖掘。