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容器和虚拟机的相同点:

Ø  都有和宿主机器独立的网络设置(包括主机名,IPDNS等)

Ø  独立的目录结构

Ø  独立的PIDIPC

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-demowp-content-demo目录下

从这个例子,我们可以看出docker的方便之处。使用docker你不需要先在网上找自己系统适用的mysqlwordpress安装包,再分别安装它们,并根据自己机器环境进行配置,最后才能启动一个wordpress

       使用docker,你只需要执行docker run,程序就会自动到docker hub寻找相应的镜像,并把它下载回来运行。

 

docker应用场景:

       docker在以下场景下,可以有效提高我们的工作效率:

 

Ø  替代虚拟机的部分功能

使用docker可以在一台机上模拟多机集群环境,可以让不同开发人员启动相同的程序而不互相干扰,可以方便地试验程序在不同操作系统环境运行情况。这些原来需要使用虚拟机实现的功能,现在可以使用docker轻松代替。

 

Ø  简化配置,模拟生产环境

由于docker提供了网络,磁盘映射功能,使用我们不需要针对不同机器环境修改程序配置也可以运行。在开发/测试机器环境与生产机器环境有不同的情况,这个特性显得无比有用。

 

Ø  使用docker实现快速部署

大名鼎鼎的Kubernetesk8s)就是一个基于容器技术的快速部署工具,而docker就是人们常用的容器技术之一。可以说docker实现了“一次部署,到处运行”。

 

Ø  方便地同步与共享软件

人们可以轻松地将自己的软件打包上传到docker hub,根据各人需要随时下载到其它机器运行。当软件需要更新时,只需要重新执行docker pull <镜像名>,即可自动下载最新版本。

 

随着docker的更新以及它越来越广泛地被应用,docker还会有更多应用场景,大家可以根据docker特性自己挖掘。

未完待续

posted @ 2020-03-29 14:49  皇家救星  阅读(799)  评论(2编辑  收藏  举报