一、Docker是啥
Docker是什么?官方的解释是:轻量级的操作系统虚拟化解决方案
看概念还是比较抽象,直接看个例子吧:我要在centos上安装一个软件,例如redis或者mysql。以前的做法:1、下载tar;2、解压;3、修改配置文件;4、启动。有了Docker之后呢,一个命令:docker run --name redis -p 6379:6379 -d redis:3.2
完成了软件安装和启动。当然,要自定义redis的配置,就需要稍微复杂点了。
对比起来看,Docker确实让运维工作效率提升了好几倍!
想象一下你要安装一个比较复杂的套件,套件中需要用到mysql、redis、go语言环境、邮件服务器,还需要修改linux主机的系统配置,还要创建特定的新用户,My god,你只是想简单体验一下这个套件的服务,现在你开始望而却步了,因为太复杂,万一配置错误污染了主机环境,那可得不偿失。
如果有魔法,可以一行命令就启动这个套件,而且是在独立的容器中运行他,那么所有的问题都不是问题了。Docker就是这个魔法!
二、Hello World
这是一个非常简单的示例:启动mysql服务,并在外部访问他
1、安装
Docker Engine改为Docker CE(社区版)了,安装教程:点击
直接使用阿里云的加速功能。
2、启动mysql
在主机上输入命令:docker run --name mysql -e MYSQL_ROOT_PASSWORD=Aa123456 -d mysql:5.7
mysql就被安装,并且启动了。root的密码为Aa123456,开放的端口是3306。
用数据库管理工具进行连接,就可以直接访问数据库了。
三、Hello World解析
第一次看世界,发现好新奇啊。不懂世界的运行规则,不明白为啥叶子上有水珠,不明白阳光为何是七彩的!
不用着急,答案就在寻找中。
上面的Hello World可以很好的让你体会到Docker的神奇之处,不论多么复杂的软件,docker都能一行命令就搞定。
下面来分析一下上面启动mysql的那行命令:docker run --name mysql -e MYSQL_ROOT_PASSWORD=Aa123456 -d mysql:5.7
,不过为了更好的展示docker的各个方面,我们把上面的命令进行扩展,变成:docker run --name mysql -e MYSQL_ROOT_PASSWORD=Aa123456 -v /home/work/config:/etc/mysql/conf.d -p 3306:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
。 放心,这个命令和简易命令的效果是一样的,不过多了几个其他配置项,我们把命令分解来看。
1、docker run
这个命令简单解释:用来运行一个docker镜像,运行起来的镜像称为容器。
有同学问:那么啥是镜像,啥又是容器呢?
所谓镜像,就是操作系统的一个底片或叫副本。例如你装windows系统的时候,一般会用到光盘(得多古老)或者ios镜像,有了底片,我们把他们复制到对应的机器上,把windows系统写入到硬盘,这就是传说中的装系统了(给女生装了很多系统之后,总会有一两个挽留你的)。
容器又是啥类?容器是铁,容器是缸,容器是不朽的铁窗!咳咳,注意自己是官方讲解员。容器呢,就是一个隔离的运行环境,当你把镜像复制过来,然后启动了操作系统,传统的操作系统直接运行在硬件上,而从docker仓库而来的操作系统就需要运行在容器中。
纳尼,这是为啥?
这是因为操作系统中嵌套了一个操作系统,里面的操作系统就叫做容器了。
2、 --name mysql
这个命令是设置了容器的名称,叫做mysql。当你启动了容器之后,可以使用docker ps
来查看正在运行的容器,最后一列就是容器名称啦!
3、-e MYSQL_ROOT_PASSWORD=Aa123456
设置了容器中的环境变量。
这里设立了一个叫MYSQL_ROOT_PASSWORD
的环境变量,在容器中mysql server会用到这个变量,并把这个变量的值设置为root的初始密码。
4、-v /home/work/config:/etc/mysql/conf.d
设置了数据卷映射。
这个概念第一次接触显得有点复杂。可以想一个大概场景,容器启动后,里面是一个独立的操作系统、独立的文件系统,如果我需要把宿主机(宿主机?就是你的Linux主机啦)的一部分数据和容器进行共享,要怎么做呢?
例如我现在在宿主机有/home/work/config/mysql.conf
文件,这个文件就是我自定义的mysql配置文件,我需要容器中的mysql启动的时候读取的是这个配置文件,这时候就要用到-v来做映射。
v就是volumn的缩写!
5、-p 3306:3306
设置了端口的映射。
跟上面一样,容器是独立的,内部肯定监听了很多端口,但如果没有配置,这些端口是不能被外部访问的。
这时候,需要把容器中的某个特定端口映射到宿主机,这样的话,外部访问宿主机,其实呢,访问的是容器中的程序!
6、-d
以守护进程来运行。
d就是daemon,也就是容器启动后会一直保持运行状态,而不会立马退出。
7、mysql:5.7
这个是镜像名。
冒号前面是基础镜像名,冒号后面是镜像版本。
有趣的问题来啦,虽然知道了镜像名,那这个镜像是从哪里来的呢?当你运行容器的时候,会先看到一段下载的流程,聪明的你可能猜出来了,镜像从远程仓库而来,类似于Java中的Maven,Node中的npm,centos中的yum。
这个远程仓库最著名的就是官方的docker hub,而在国内,用的最多的应该是阿里的docker镜像服务。
8、--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
容器中的启动程序要用到的参数。 当容器启动的时候,一般会有一个默认的执行程序或者是脚本,那么这一行就是给默认执行程序或脚本用到的。
9、查看容器
容器启动完成后,可以用docker ps来查看运行中的容器,用docker stop来停止容器,用docker ps -a可以看到已停止的容器,用docker rm 可以移除容器。
小结
这只是个入门教程,如果感兴趣的话,可以再研究一下:数据卷、网络、dockerfile、docker-compose等知识。推荐书籍:《第一本Docker书》