Docker解决什么问题
大型企业级服务器内存(32G..more),CPU(8核...more),对单个应用来说是富足有余的,所以为了更好的利用服务器,传统的做法是安装多个虚拟机来部署更多的应用,但是虚拟机缺点是占用内存很大、部署麻烦,而Docker恰恰很大的解决了这两个问题。
什么是Docker
Docker使用Go语言开发,基于Linux内核cgroup,namespace,以及AUFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
由于隔离的进程独立于宿主和其它隔离的进程,因此也称其为容器。(具有独立的文件等系统...仿佛一个小型独立的系统)
Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互连到进程隔离等等,极大的简化了容器的创建和维护。
Docker和传统虚拟机不同:
传统虚拟机技术是在虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需的应用进程。
而容器的应用进程直接运行于宿主的内核,容器没有自己的内核,而且也没有进行硬件虚拟。容器比传统虚拟机更为轻便。
Docker优点
- 更高效的利用系统资源(比传统虚拟机技术更高效:减少不必要的内存占用,不需要建立新的系统...)
- 更快的启动时间(s级别,传统虚拟机m级别)
- 一致的运行环境:Docker镜像提供了除内核外完整的运行时环境,确保了运行环境的一致性(非常重要的特性,避免了不同系统之间表现不同)。
- 持续交付和部署
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
- 更轻松的迁移(不需要进行环境配置等操作)
- 更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
和传统虚拟机比较:
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
安装
Mac下载地址(下载安装即可):
https://store.docker.com/editions/community/docker-ce-desktop-mac?tab=description
Docker Store:国内下载镜像比较慢,参照docker 配置国内镜像源 设置即可。
Docker概念
镜像(Image)
是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会把容器和虚拟机搞混。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失。
仓库(Repository)
镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。
仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
常用命令
docker images # 查看docker镜像 -a 列出所有镜像
docker pull xxx # 拉取一个镜像 docker pull ubuntu
docker search xxx # 搜索某个镜像
docker rmi xxx # 移除docker镜像
docker run xxx # 启动某个容器 -d 容器在后台运行 -P 容器内部使用端口号映射到主机上 -p 1000:1000 容器和主机端口映射 -i 交互式操作 -t 终端 --rm 容器退出后删除