Docker基础篇——入门
Docker入门
为什么会有Docker?
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置是极其麻烦且容易出现问题的。在这个流程中,十分考研开发+运维之间的协作,需要关心很多东西,特别是各种版本的迭代之后,不同版本环境的兼容等一些问题。这也是很多互联网公司在开发一款产品不得不面对的问题。
为了解决这个问题,Docker应运而生,提供了一个标准化的解决方案。开发人员通过Docker将运行环境和代码打包成镜像,分发到企业的Docker的仓库里,运维人员通过将Docker仓库里的镜像拉取到本机,直接将镜像装载到容器里去进行产品的测试和运维。通过以上流程,简化了环境配置、操作系统等问题造成的高的开发和运维成本,提高了开发和运维的工作效率,消除了协作编码时常常会碰到的“在我的电脑上可以跑”、“换电脑就要重新配置环境”、“只在某个操作系统可以跑”等问题。
简单来说,Docker使得软件可以带环境安装,避免了底层环境不同造成的一系列问题。
传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
Docker的理念
Docker是基于Go语言实现的云开源项目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作,解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
Docker VS 虚拟机
虚拟机技术
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:
- 资源占用多;
- 冗余步骤多;
- 启动慢;
容器虚拟化技术
由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
两者对比
Docker 和传统虚拟化方式的不同之处:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便;
每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源;
Docker对开发和运维的影响
一次构建、随处运行。
更快速的应用交付和部署
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
更便捷的升级和扩缩容
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
Docker在企业的应用
新浪
美团
Docker基本组成
Docker架构图
镜像(images)
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
容器(Container)
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(Repository)
仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等
小结
需要正确的理解仓储/镜像/容器这几个概念:
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。
Docker安装
Centos6.5以上的版本才支持docker。因为docker使用go语言写的,go在2014年才出现。
1 | [dw@dk usr]$ uname -r |
docker官网:http://www.docker.com
docker中文网站:https://www.docker-cn.com/
Docker Hub官网: https://hub.docker.com/
Centos6.8安装Docker
1.yum install -y epel-release
Docker使用EPEL发布,RHEL系的OS首先要确保已经持有EPEL仓库,否则先检查OS的版本,然后安装相应的EPEL包。
2.yum install -y docker-io
3.安装后的配置文件:/etc/sysconfig/docker
4.启动Docker后台服务:service docker start
5.docker version验证
Centos7安装Docker
按照官方文档做即可。(本机采用的是Centos7)
- Set up the repository
1 | sudo yum install -y yum-utils |
Install Docker Engine
- Install the latest version of Docker Engine and containerd, or go to the next step to install a specific version:
1
sudo yum install docker-ce docker-ce-cli containerd.io
- To install a specific version of Docker Engine, list the available versions in the repo, then select and install:
1
2
3yum list docker-ce --showduplicates | sort -r
# <VERSION_STRING>:docker-ce-18.09.1
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io- Start Docker
1
sudo systemctl start docker
- Verify that Docker Engine is installed correctly by running the
hello-world
image.
1
sudo docker run hello-world
执行
sudo docker run hello-world
后,会先到本地镜像查找,如果没有就去官方镜像仓库拉取,如果官方没有就报错。
Docker测试:运行Hello World
阿里云镜像加速
因为正常拉取镜像,Docker会去官方拉取,由于官方在海外,所以会造成拉取速度很慢或拉取不到,因此国内的一些公司就把海外的镜像下载到自己的服务器上,供国内公司或开发者进行拉取使用。
1.注册一个阿里云账号
aliyun:开放云原生应用-云原生(Cloud Native)-云原生介绍 - 阿里云 (aliyun.com)
2.在宿主机上直接执行配置(复制到终端直接多行粘贴运行即可)
完成后可以在/etc/docker
路径下找到daemon.json
配置文件。
1 | sudo mkdir -p /etc/docker |
3.网易云镜像加速(基本上同阿里云只是镜像链接有所不同)
测试运行Hello world
1.docker run hello-world
容器需要镜像运行,本地没有这个镜像会去云端拉取并启动容器内运行。
Docker底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。
为什么Docker比VM快
- docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
- docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。
下一篇 Docker的常用命令