Docker概述
Docker为什么出现
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发 + 运维之间的协作我们需要
关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环 境的兼
容,对运维人员是极大的考验!
环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题, 软
件可以带环境安装? 也就是说,安装的时候,把原始环境一模一样地复制过来。解决开发人员说的 “ 在我的机器
上可正常工作” 的问题。
之前在服务器配置一个应用的运行环境,要安装各种软件,就拿一个基本的工程项目的环境来说吧, Java/
Tomcat/MySQL/JDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如 我们是在 Win
dows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同 样操作系统的服务器,
要移植应用也是非常麻烦的。
传统上认为,软件编码开发 / 测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码文件 等(
Java 为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得 以部署应用程式,
开发需要清楚的告诉运维部署团队,用的全部配置文件 + 所有软件环境。不过,即便如 此,仍然常常发生部署失败的
状况。
Docker 之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
Docker 镜像的设计, 使得 Docker 得以打破过去「程序即应用」的观念。通过 Docker 镜像 ( images ) 将 应用程序所需
要的系统环境,由下而上打包,达到应用程序跨平台间的无缝接轨运作。
Docker 的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并
且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水
果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他
们都运走。
docker 就是类似的理念。
Docker的历史
2010 年,几个搞 IT 的年轻人,在美国旧金山成立了一家名叫 “dotCloud” 的公司。
这家公司主要提供基于 PaaS 的云计算技术服务。具体来说,是和 LXC 有关的容器技术。
后来, dotCloud 公司将自己的容器技术进行了简化和标准化,并命名为 —— Docker 。
Docker 技术诞生之后,并没有引起行业的关注。而 dotCloud 公司,作为一家小型创业企业,在激烈的竞
争之下,也步履维艰。
正当他们快要坚持不下去的时候,脑子里蹦出了 “ 开源 ” 的想法。
什么是 “ 开源 ” ?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大
家一起参与进来,贡献代码和意见。
有的软件是一开始就开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不
活,就吃 “ 百家饭 ” 嘛。
2013 年 3 月, dotCloud 公司的创始人之一, Docker 之父, 28 岁的 Solomon Hykes 正式决定,将
Docker 项目开源。
不开则已,一开惊人。
越来越多的 IT 工程师发现了 Docker 的优点,然后蜂拥而至,加入 Docker 开源社区。
Docker 的人气迅速攀升,速度之快,令人瞠目结舌。
开源当月, Docker 0.1 版本发布。此后的每一个月, Docker 都会发布一个版本。到 2014 年 6 月 9 日,
Docker 1.0 版本正式发布。
此时的 Docker ,已经成为行业里人气最火爆的开源技术,没有之一。甚至像 Google 、微软、 Amazon 、
VMware 这样的巨头,都对它青睐有加,表示将全力支持。
Docker 和容器技术为什么会这么火爆?说白了,就是因为它 “ 轻 ” 。
在容器技术之前,业界的网红是 虚拟机 。虚拟机技术的代表,是 VMWare 和 OpenStack 。 相信很多人都用过虚拟机。
虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模 拟一台甚至多台“ 子电脑 ” 出来。
在 “ 子电脑 ” 里,你可以和正常电脑一样运行程序,例如开 QQ 。如果你愿意,你可以变出好几个 “ 子电
脑 ” ,里面都开上 QQ 。 “子电脑”和“子电脑” 之间,是 相互隔离 的,互不影响。
虚拟机属于虚拟化技术。而 Docker 这样的容器技术,也是虚拟化技术,属于 轻量级的虚拟化 。
虚拟机虽然可以隔离出很多 “ 子电脑 ” ,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如
VMWare )。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似 “ 沙
箱 ” )。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个
Docker 容器)。此外,它占的空间很小,虚拟机一般要几 GB 到几十 GB 的空间,而容器只需要 MB 级甚至
KB 级。
正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。
Docker的理念
Docker 是基于 Go 语言实现的云开源项目。
Docker 的主要目标是 “Build , Ship and Run Any App , Anywhere” ,也就是通过对应用组件的封装、分
发、部署、运行等生命周期的管理,使用户的 APP (可以是一个 WEB 应用或数据库应用等等)及其运行
环境能够做到 “ 一次封装,到处运行 ” 。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在
Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需
要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
Docker能干嘛
之前的虚拟机技术
虚拟机( virtual machine )就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序
对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文
件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,
操作系统和硬件三者之间的逻辑不变。
所有的app应用都依赖一个libraries,如果libraries出问题name其他的都会有问题
虚拟机的缺点:
1 、资源占用多
2 、冗余步骤多
3 、启动慢
容器虚拟化技术
由于前面虚拟机存在这些缺点, Linux 发展出了另一种虚拟化技术: Linux 容器( Linux Containers ,缩
写为 LXC )。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的
所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作
所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
可以看到容器之间互不影响,一个有问题不会影响其他的
比较了 Docker 和传统虚拟化方式的不同之处:
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用 进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。
因此容器要比传统虚拟机更为轻便。
每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能充分利用计算资 源。
开发 / 运维( DevOps )
更快速的应用交付和部署:
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂
的配置才能正常运行。 Docker 化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即
可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
更便捷的升级和扩缩容:
随着微服务架构和 Docker 的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积
木一样,每个 Docker 容器将变成一块 “ 积木 ” ,应用的升级将变得非常容易。当现有的容器不足以支撑业
务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒
级。
更简单的系统运维:
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关
的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的
BUG 。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用: Docker 是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的 Hypervisor [ 管理程序 ] 支持,所以在
一台物理机上可以运行很多个容器实例,可大大提升物理服务器的 CPU 和内存的利用率。
Docker安装
Docker的基本组成
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很 多容器。 就好似 Java 中的 类和对象,类就是镜像,容器就是对象!
容器( container ):
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。 它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等) 和运行在其中的应用程序。 容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写 的。
仓库( repository ):
仓库(Repository)是集中存放镜像文件的场所。 仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓 库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。 国内的公开仓库包括阿里云 、网易云 等
小结:
需要正确的理解仓储 / 镜像 / 容器这几个概念 :
1、Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个
可交付的运行环境,这个打包好的运行环境就似乎 image 镜像文件。只有通过这个镜像文件才能生
成 Docker 容器。 image 文件可以看作是容器的模板。 Docker 根据 image 文件生成容器的实例。
同一个 image 文件,可以生成多个同时运行的容器实例。
2、image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
3、一个容器运行一种服务,当我们需要的时候,就可以通过 docker 客户端创建一个对应的运行实例,
也就是我们的容器
4、至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来
就可以了。
环境说明
这里我使用的是阿里云的服务器(前面我已经聊过了另一种docker安装方式)
查看自己的内核:
uname -r 命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型
等)。
[root@kuangshen ~]# uname -r
3.10.0-1062.12.1.el7.x86_64
查看版本信息:
cat /etc/os-release
[root@kuangshen ~] # cat /etc/os-release
NAME = "CentOS Linux"
VERSION = "7 (Core)"
ID = "centos"
ID_LIKE = "rhel fedora"
VERSION_ID = "7"
PRETTY_NAME = "CentOS Linux 7 (Core)"
ANSI_COLOR = "0;31"
CPE_NAME = "cpe:/o:centos:centos:7"
HOME_URL = "https://www.centos.org/"
BUG_REPORT_URL = "https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT = "CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION = "7"
REDHAT_SUPPORT_PRODUCT = "centos"
REDHAT_SUPPORT_PRODUCT_VERSION = "7"
安装
1、 确定你是 CentOS7 及以上版本,我们已经做过了
2、yum 安装 gcc 相关环境(需要确保 虚拟机可以上外网 )
yum -y install gcc
yum -y install gcc-c ++
3、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
4、安装需要的软件包
5、 设置镜像仓库
# 错误
yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo
## 报错
[Errno 14 ] curl #35 - TCP connection reset by peer
[Errno 12 ] curl #35 - Timeout
# 正确推荐使用国内的
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-
ce/linux/centos/docker-ce.repo
阿里云加速器
docker run hello-world
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://t4bt9dhe.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
6、 更新 yum 软件包索引
yum makecache fast
7、安装 Docker CE
yum install docker-ce docker-ce-cli containerd.io
8、 启动 Docker
systemctl start docker
9、测试命令
#查看docker版本号
docker version
#运行docker镜像
docker run hello-world
#查看运行的镜像
docker images
10、卸载(扩展)
systemctl stop docker
yum -y remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker