Docker
docker是什么?
Docker 是一个开源的平台,可以通过 Docker 进行开发、部署和运行应用程序。Docker 将应用程序和底层基础设施进行分离,实现更快的交付。通过 Docker 技术,可以像管应用一样管理项目的基础设施,比如基础依赖等,这里的具体技术其实就是镜像。通过 Docker 技术,可以精简的整个开发和交互的流程。
平台(platform)
官方将 Docker 定义为一个平台,但是其实更准确的来说,Docker 其实是一个技术栈,包括 Docker 镜像,可以类比为程序,是磁盘上面的静态文件,可以通过 Docker 来启动运行;Docker 容器,也就是 Docker 镜像的运行时实例;Docker Daemon,用来管理机器上的镜像、容器等。
应用程序和底层基础设施分离
传统的软件开发模式是我们先开发好我们的应用,然后在线上环境或者测试环境上先安装应用的基础依赖,比如像一些 C++ 的二进制文件会依赖一些操作系统的动态链接库。
依赖安装完成之后,然后将应用程序部署上去。使用 Docker 的镜像技术我们可以将这些依赖和应用程序都打包到镜像中,然后测试或者正式上线的时候只需要将整个镜像部署上去就可以了,不需要关心目标服务器上面的基础环境,这也就是应用程序和基础设施分离。也是精简开发流程的核心的所在。
Docker、虚拟机
Docker 和虚拟机的主要区别有:
- 所有的 Docker 应用共享一个宿主机操作系统,每个虚拟机有自己的操作系统
- 每个Docker 应用通过 Docker 层和宿主机的操作系统交互,而虚拟机应用直接和操作系统交互。
- 实际上Docker 并不会像虚拟机那样对应用进程的隔离环境负责,也不会创建任何实体的容器,真正对环境负责的是宿主机操作系统本身。
Docker 的应用场景
应用交付
使用 Docker 镜像,可以将所有的环境依赖都打包到镜像中,然后通过镜像来传输,这样会更加地高效。
- 开发者在本地编写代码进行开发,然后通过 Docker 镜像和其他协作者共享
- 使用 Docker 技术将应用 push 到测试环境,自动触发自动化 test case
- 当开发者发现应用程序的 bug 时,可以在本地开发环境进行修复。修复完之后再将应用重新部署到测试环境进行测试验证
- 当测试完成之后,需要给客户的环境升级,只要把修复完的应用镜像推送到客户可以访问的镜像中心即可
多版本混合部署
随着产品的不断更新换代,一台服务器上部署同一个应用的多个版本在企业内部非常常见。但一台服务器上部署同一个软件的多个版本,文件路径、端口等资源往往会发生冲突,造成多个版本无法共存的问题。
使用 docker,这个问题将非常简单。由于每个容器都有自己独立的文件系统,所以根本不存在文件路径冲突的问题;对于端口冲突问题,只需要在启动容器时指定不同的端口映射即可解决问题。
内部开发测试环境
传统的开发测试环境都是由运维人员进行专门的环境配置而搭建出来的,而且需要运维人员进行专门维护。环境一旦出现问题,恢复起来也很麻烦。
借助于 Docker 技术,将应用程序需要的依赖都固化到 Docker 镜像中,然后在对应的 Docker 容器中进行开发测试。就算环境出现问题,只要将当前容器删除重新启动即可恢复。
使用 Docker 镜像来维护内部开发测试环境还有另一个好处就是 DevOps,传统的应用开发部署要跨两个团队:开发团队负责开发,运维团队服务部署,一旦涉及到跨团队合作就要牵扯到沟通成本。而且开发作为应用的 owner,实际上对其依赖环境会更加的熟悉才对。
通过 Docker 镜像技术,开发人员在开发应用的过程中就将这些依赖固化到镜像中。在环境部署环节,即使需要运维人员参与,也只是负责拉起 Docker。整个过程都会更加的高效。
Docker 架构浅析
Docker 的架构比较复杂,并不是纯粹的只有 Server 和 Client。
几个主要的组成部分有:
-
Docker Client
安装完 Docker 包之后,直接使用敲命令:
docker
,界面是有提示的,这个 docker 就是 docker client。docker client 都是用来和 docker daemon 交互的。
-
Docker Daemon
docker daemon 是一个 docker 后台运行的守护进程,我们的 docker client 的命令就是和 Docker Daemon 来进行交互的。
-
Docker daemon 启动可以使用 service 或者 systemctl 操作.
# 启动服务 service docker start # 或者 systemctl start docker.service
然后我们使用
ps
命令就能看到 docker daemon 进程了。ps aux | grep dockerd
然后查看和 client 交互的 socket 文件也存在了。
ll /var/run/docker.sock
-
Docker Registry
Registry 中文一般翻译为注册中心,是用来存储 Docker 镜像的地方。Docker Registry 有多种不同的表现,比如 Docker Hub 就是一个公开的注册中心,同时各大云厂商也提供了自己的注册中心,比如阿里云、腾讯云等,甚至你可以搭建自己的私有注册中心。
Docker 默认使用 Docker Hub,比如执行
docker pull <image-name>
时,Docker 默认去 Docker Hub 中寻找名字为 image-name 的镜像。如果使用自己的 Registry 需要进行单独的配置。 -
Docker Images
image 一般中文称之为镜像。官方对镜像的定义比较复杂,我一般使用类比的方式来理解镜像。镜像可以理解成计算机系统中的程序,也就是静态的位于磁盘上面可以通过特定方式执行的文件(程序是操作系统可以识别的特定的二进制文件,Docker 镜像是可以被 Docker Daemon 识别并执行的特定文件)。
镜像和普通的可执行文件的区别在于镜像是分层架构,每个镜像一般都依赖于一个基础镜像。最基本的镜像叫 scratch 镜像。当然我们也可以构建自己的镜像,然后发布到镜像中心别人就也可以使用了。
-
Docker Container
容器是镜像的运行实例。
这个定义和进程的定义非常类似:进程是程序的运行实例。可以将镜像类比为程序,容器类比为进程。
容器默认是和其他容器以及其宿主机隔离开的。具体的隔离策略可以进行自定义设置。