介绍
- docker 基于 Go 语言实现的云开源项目
- docker 可以消除协作编码时“在我的机器上可以正常工作”的问题,避免在部署中出现版本、配置问题。
- 系统平滑移植、容器虚拟化技术
- docker 通过对应用程序的封装、分发、部署、运行等生命周期的管理,使用户的 app、web应用等及其运行环境能够做到“一次镜像,处处运行”,实现了跨平台、跨服务器
- docker 解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
docker 的基本组成
- 镜像:是一个只读模板,可以用来创建 docker 容器,一个镜像可以创建多个容器
- 容器:是镜像创建的运行实例,为镜像提供了一个标准的和隔离的运行环境。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 linux 环境和运行在其中的应用程序
- 仓库:集中存放镜像文件的场所(docker hub)
例子
- 正常程序开发之后,只提交源代码打成 jar 包,在服务器上部署需要配置环境;而配置环境可能会产生诸多问题(MySQL 版本不一致、redis 补丁等)
- 引入 docker 之后,提交镜像文件(包含源码 + 配置环境),放在 docker 引擎部署
传统虚拟机与 docker 的区别
- docker 容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,容器没有自己的内核且没有进行硬件虚拟。同时容器之间相互隔离,每个容器都有自己的文件系统,容器之间进程不会相互影响。
- 传统虚拟机是在硬件层面实现虚拟化,需要虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需应用进程
- 与传统的虚拟机相比,docker 的优势体现为启动速度快、占用体积小
总结
docker 的平台架构
docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职
运行基本流程:
-
用户使用 docker client 与 docker daemon 建立通信,并发送请求
-
docker daemon 作为 docker 架构中的主体部分,首先提供 docker server 的功能使其可以接受 docker client的请求
-
docker engine 执行内部的一系列工作,每一项工作都是以一个 job 的形式存在
-
job 的运行过程中,当需要容器镜像时,则从 docker registry 中下载镜像,并通过镜像管理驱动 graph driver 将下载镜像以 graph 的形式存储
-
当需要为 docker 创建网络环境时,通过网络管理驱动 network driver 创建并配置 docker 容器网络环境
-
当需要限制 docker 容器运行资源或者执行用户指令等操作时,则通过 exec driver 来完成
-
libcontainer 是一项独立的容器管理包,network driver 以及 exec driver 都是通过 libcontainer 来实现具体对容器进行的操作
Ubuntu 安装 docker
- docker 并非一个通用的容器工具,依赖于已存在并运行的 linux 内核环境;docker 实质上是在已经运行的 linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部属的 linux 主机
- 所以,docker 必须部署在 linux 内核的系统上,如果其他系统(Windows)想部署 docker 就必须安装一个虚拟 linux 环境。
命令
-
安装docker:sudo apt-get install -y docker.io
-
启动docker服务:systemctl start docker
-
查看docker状态:systemctl status docker
-
查看docker版本:docker version
-
设置开机启动:systemctl enable docker
-
停止docker服务:systemctl stop docker