背景
相信作为软件开发者,对于docker
应该都不会陌生。自从有了docker
之后,我们环境的部署、迁移、实例扩容等都变得极为简单,我们再也不用担心测试时的环境跟正式环境不一样导致一堆非代码逻辑问题导致的错误,也可以更加灵活的为应用添加或删减相应的资源,让有限的资源可以以最大程度得到利用。那么,Docker
究竟是什么东西呢?他到底是通过什么方法实现上述功能的呢?其原理又是如何?今天我们就来一起探讨一下这个话题。
Docker是什么
Docker
是一个容器
。那么,既然是容器
,肯定是用来装东西的,杯子是水的容器,房子是人的容器,那么Docker
里面究竟装的是什么呢?实际上,在Docker
当中,我们装的是应用(Application)
。也就是说,Docker
是应用的容器。
Docker
是一种管理应用的现代手段,让应用管理变得更加容易预测与更加高效。
Docker的安装
关于Docker
的安装,官网已经给出了各个系统极为详细得方案,这边就不再赘述了,不明白的同学可以去看一下:docker安装
搜索与拉取镜像
docker
安装好之后,我们便可以尝试从docker hub
中搜索目标基础镜像,如:node
、mysql
等,docker hub

这里可以搜索到所有你想要的基础镜像,搜索到之后,我们就可以使用以下命令将目标镜像拉取到本地:
bash
docker pull node

PS: 如果觉得使用官方的仓库拉取太慢,可以参考以下教程使用阿里云的加速器
下载成功之后,使用以下命令可以查看已经下载到本地的镜像列表:
bash
docker images

运行镜像
镜像下载到本地之后,我们就可以尝试让镜像运行起来了,我们以mysql
为例,我们可以到docker hub
搜索相应镜像的详细信息,上面会有详细得运行参数介绍:

其中的一些参数解释:
name
:启动的容器实例的名称e
:代表给 docker 容器传入环境变量,如:MYSQL_ROOT_PASSWORD 代表 mysql 根用户的密码d
:docker
是支持分离模式的,如果你不想敲完上述命令后,命令行一直输出命令,无法做其他事情,可以通过此参数规定使用分离模式启动
bash
# 以下为一个真实启动的命令示例
docker run --name kmysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

执行命令之后,会在命令行中输出一长串的字符,这个就是启动起来的容器的id
,我们可以通过这个id
对这个启动起来的容器进行管理。
查看运行中的容器
我们的容器已经在后台运行起来了,那么,我们应该如何查看运行中的容器的信息呢?
bash
docker ps
# 或
docker container ls

通过这个命令,我们可以看到该容器启动的一些信息。
如果我们想要查看容器更加详细的基础信息,如启动起来的mysql
服务是在哪个ip
地址,这样你才能使用mysql
的客户端软件通过ip
去访问mysql
服务,可以使用以下命令:
bash
docker inspect 00d
# 使用以下命令可以搜索 ip 地址相关的信息
docker inspect 00d | grep "IPAddress"


mysql
服务启动起来之后,我们就可以尝试连接一下服务,看是否真的正常启动成功了。这边推荐使用dbeaver
数据库,以下是该数据的安装、启动、连接数据库的详情:
-
安装
bashdocker pull dbeaver/cloudbeaver
-
启动
bashsudo docker run --name cloudbeaver --rm -ti -p 8081:8978 -v /var/cloudbeaver/workspace:/opt/cloudbeaver/workspace dbeaver/cloudbeaver:latest
运行上述命令后,将会在本机的
8081
端口启动一个web
服务,我们只需要访问:http://localhost:8081
即可。 -
连接数据库







至此,我们就已经使用dbeaver
成功连接上了我们本地启动的mysql
服务了。
Docker的原理
简单的讲,Docker不隔离计算,只隔离环境
什么是环境
环境包括:文件系统
、网络
、用户
、权限
等。
比如说在Docker
容器内的进程,只能看到Docker
容器内部的资源,例如我们再Docker
容器内部看到的根目录/
实际上在用户本机上可能只是映射到了某一个目录,如:/usr/fs/xxx
。
在进程中看到的网络,也是与用户本机的实际网络是相互隔离的。
执行进程的用户,也是Docker
容器内部的用户,与用户本机的用户也是完全隔离的。
什么是计算
与虚拟机不同的是:"docker不隔离计算。docker容器中的进程也是真实的进程,而不是虚拟进程。"
当docker
容器的进程写入文件的时候,并不是在虚拟机里面写入文件,而是在用户本地的操作系统中的文件系统中写入,只不过与我们经常使用的文件隔离开了而已。
docker是一种隔离技术而非虚拟化技术
虚拟化
技术最明显的特征是执行层面的虚拟化------虚拟CPU指令。例如你在电脑上装了一个虚拟机,但你的电脑并不会管理虚拟机的进程,因为虚拟机中的进程已经完全运行在虚拟化技术上了。
docker
则是将自己直接嫁接到了操作系统上,docker
中的进程,实际也是真实的进程。在docker
当中的文件系统,也是真实的文件系统,只是被挂在到了某个特殊的文件路径上并做了隔离而已。
在docker
中使用的网络,也是真实的网络,同样只是做了隔离而已。
