欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Docker入门心得(一)

程序员文章站 2022-03-16 21:32:47
前言: 最近辞职找工作,比较有空,所以花了时间学习了一下docker,感觉这是一个有意思的技术。 我把最近的学习心得整理了一下,写了这篇文章。由于docker我也是初学,没经过项目实践,对它理解不够深刻。虽然文章中的知识点,我都查阅过多篇文章或者亲身实践印证,但尽管如此,还是难免有错误的地方,如果有 ......

前言:

       最近辞职找工作,比较有空,所以花了时间学习了一下docker,感觉这是一个有意思的技术。

       我把最近的学习心得整理了一下,写了这篇文章。由于docker我也是初学,没经过项目实践,对它理解不够深刻。虽然文章中的知识点,我都查阅过多篇文章或者亲身实践印证,但尽管如此,还是难免有错误的地方,如果有人发现问题,欢迎留言指正。

docker是什么:

       docker是一种新型的,轻量级的虚拟技术,它把软件及其依赖的环境打包起来,形成一个虚拟的整体,方便开发维护人员进行管理和调度。

docker与集装箱:

       docker的英文意思是码头工人,而它的图标是一艘船上面放了许多个集装箱。集装箱是一种运送的货物统一规格的箱子,工人把货物放到集装箱里面,然后将箱子放在船上或车上运输到其它地方。

       集团箱运输效率非常高,而且可以很方便地切换运输工具。而docker就是it界的集团箱技术,它把各式各样的软件封装成一个箱子里面,称之为“镜像”。人们把方便地进行对镜像进行传输,并在各种系统(目前只支持linux类)上运行。一个运行状态的镜像称之为“容器”。这些容器提供了统一的管理接口,让人们可以方便地运行,必要时也容易组装在一起。

 

docker和虚拟机的区别:

       初学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入门心得(一)

 

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即可访问(如果访问失败,请检查虚拟机网络配置或者防火墙设置)

Docker入门心得(一)

       设置好博客信息后生成的相关文件会存放在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特性自己挖掘。

未完待续