一、Docker介绍
1.容器技术的前言
假设我们正在研发聊天APP,这时候,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试人员去测试,这时测试同学也得开始从头到尾搭建这套环境,如果测试过程中出现问题程序员也不用担心,可以直接说,“明明在人家的环境上可以运行的”。
测试人员测完后终于可以上线了,这时运维人员又得重新从头到尾搭建这套环境,在费了九牛二虎之力搭建好环境开始上线之后,糟糕,上线系统就崩溃了,这时程序员又可以说,“明明在人家的环境上可以运行的”。
在这整个过程可以看到,我们重复搭建了三套环境,典型的浪费时间和效率,这时候容器技术应运而生。
这时候可能会有人说可以用虚拟机啊,VMware好用的飞起,先搭好一套虚拟机环境然后给测试和运维clone出来不就可以了吗?
在没有容器技术之前,这确实是一个好办法,只不过这个办法还没有那么好。
2.容器和虚拟机
2.1 以前的虚拟化技术
虚拟机就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机有这样的情况:
- 把内存浪费在“无用”的操作系统上,操作系统太过于笨重
- 启动时间问题,我们知道操作系统重启是非常慢的,因为操作系统要从头到尾把该检测的都检测了该加载的都加载上,这个过程非常缓慢,动辄数分钟
虚拟机的缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
那么有没有一种技术可以让我们获得虚拟机的好处又能克服这些缺点从而一举实现鱼和熊掌的兼得呢?那就是容器技术
2.2 容器虚拟化技术
由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
2.4 比较
从图中我们可以看到容器更加的轻量级且占用的资源更少,与操作系统动辄几G的内存占用相比,容器技术只需数M空间,因此我们可以在同样规格的硬件上大量部署容器,这是虚拟机所不能比拟的,而且不同于操作系统数分钟的启动时间容器几乎瞬时启动,容器技术为打包服务栈提供了一种更加高效的方式
注意:容器是一种通用技术,docker只是其中的一种实现。
3.什么是Docker?
Docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器。
Docker的主要目标是Build,Ship and Run Any App,Anywhere,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到一次封装,到处运行。
Docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。
因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了Docker中,那么无论运行在什么环境下程序的行为都是一致的,真正实现“build once, run everywhere”。
Docker的另一个好处就是快速部署,这是当前互联网公司最常见的一个应用场景,一个原因在于容器启动速度非常快,另一个原因在于只要确保一个容器中的程序正确运行,那么你就能确信无论在生产环境部署多少都能正确运行。
4.实际的运行
Docker作为开发人员需要掌握,作为运维人员必须掌握。一次构建,随处运行
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
资源
官网: http://www.docker.com
仓库: https://hub.docker.com
5.Docker的基本组成
5.1 镜像(image)
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建Docker 容器,一个镜像可以创建很多容器。
docker | 面向对象 |
容器 | 对象 |
镜像 | 类 |
5.2 容器(container)
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可
以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简
易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程
序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可
读可写的。
5.3 仓库(repository)
仓库(Repository)是集中存放镜像文件的场所。
仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
5.4 总结
- image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
- 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
- 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。
6.Docker工作过程
6.1 前提概念
- dockerfile
- image
- container
可以简单的把image理解为可执行程序,container就是运行起来的进程。
那么写程序需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是"编译器"。
因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置,之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令,image运行起来后就是docker container。
6.1 docker build
当我们写完dockerfile交给docker“编译”时使用这个命令,那么client在接收到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出“可执行程序”image。
6.2 docker run
有了“可执行程序”image后就可以运行程序了,接下来使用命令docker run,docker daemon接收到该命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container。
6.3 docker pull
其实docker build和docker run是两个最核心的命令,会用这两个命令基本上docker就可以用起来了,剩下的就是一些补充。
那么docker pull是什么意思呢?
前面,docker中image的概念就类似于“可执行程序”,我们可以从哪里下载到别人写好的应用程序呢?很简单,就好比手机软件,那就是APP Store,即应用商店。与之类似,既然image也是一种“可执行程序”,那么有没有"Docker Image Store"呢?答案是肯定的,这就是Docker Hub,docker官方的“应用商店”,你可以在这里下载到别人编写好的image,这样你就不用自己编写dockerfile了。
docker registry 可以用来存放各种image,公共的可以供任何人下载image的仓库就是docker Hub。那么该怎么从Docker Hub中下载image呢,就是这里的docker pull命令了。
因此,这个命令的实现也很简单,那就是用户通过docker client发送命令,docker daemon接收到命令后向docker registry发送image下载请求,下载后存放在本地,这样我们就可以使用image了。
6.4 总结
二、Docker安装
1.确认版本
[root@biao ~]# cat /etc/redhat-release
2.安装gcc相关
[root@biao ~]# yum -y install gcc gcc-c++
3.卸载旧版本
[root@biao ~]# yum -y remove docker docker-common docker-selinux docker-engine
4.安装软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
5.设置镜像仓库
[root@biao ~]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
已加载插件:fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
6.yum更新
yum makecache fast
7.安装Docker
CE 是官方提供的免费版本
yum -y install docker-ce
8.启动Docker
systemctl start docker
9.查看Docker版本
[root@biao ~]# docker version
10.HelloWord案例
[root@biao ~]# docker run hello-world
11.阿里云镜像加速
默认访问的仓库是在国外所以访问速度是没法保证的。为了更好地体验,我们可以配置阿里云镜像加速
按照官网提示,执行对应操作即可
[root@biao ~]# sudo mkdir -p /etc/docker
[root@biao ~]# cd /etc/docker
[root@biao docker]# ll
总用量 4
-rw-------. 1 root root 244 6月 6 07:50 key.json
[root@biao docker]# vim daemon.json
[root@biao docker]# cat daemon.json
{
"registry-mirrors": ["https://sy7jl5ii.mirror.aliyuncs.com"]
}
[root@biao docker]# sudo systemctl daemon-reload
[root@biao docker]# sudo systemctl restart docker
[root@biao docker]#
daemon.json的内容
{
"registry-mirrors": ["https://sy7jl5ii.mirror.aliyuncs.com"]
}
12.如果要卸载
systemctl stop docker yum -y remov docker-ce rm -rf /var/lib/docker