1 为什么会出现docker
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协助我们需要关心的问题很多,这也是很多互联网公司不得不面对的问题,
特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。
Docker之所以发展如此迅速,也是运维它给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。
环境配置如此麻烦,换一台机器,就要重新来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样的复制过来。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。
之前在服务器配置一个应用的运行环境,要安装各种软件,比如redis,mysql等换一台服务器还得重新安装
Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
2 docker的理念
Docker是基于Go语言实现的云开源项目。Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
一句话概括:
解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。
3 容器和虚拟机的比较
虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。
虚拟机的缺点:
1 资源占用多 2 冗余步骤多 3 启动慢
Linux容器(Linux Containers,缩写为 LXC)
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
*容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
4 能干嘛
· 开发/运维(DevOps)新一代开发工程师
· 一次构建、随处运行
· 更快速的应用交付和部署
· 更便捷的升级和扩缩容
· 更简单的系统运维
· 更高效的计算资源利用(Docker是内核级虚拟化)
应用场景:
5 去哪里下
· 官网
· docker官网:http://www.docker.com
· 仓库
· Docker Hub官网: https://hub.docker.com/
6 docker安装
6.1 前提条件
docker并非是一个通用的容器工具,它依赖于已存在并运行的linux内核环境
docker实际上是在已经运行的linux下制造了一个隔离的文件环境,因此他的执行效率等同于所部署的linux主机
因此docker必须部署在linux内核的系统上。
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,
要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x
查看centos版本:
cat /etc/redhat-relaese
uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)
6.2 docker的 基本组成
· 镜像(image)
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
· 容器(container)
1 从面向对象角度
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
2 从镜像容器角度
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
· 仓库(repository)
仓库(Repository)是集中存放镜像文件的场所。
类似于
Maven仓库,存放各种jar包的地方;
github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
· 小总结
需要正确的理解仓库/镜像/容器这几个概念:
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
镜像文件
6.3 安装步骤
· CentOS7安装Docker
· https://docs.docker.com/engine/install/centos/
· 安装步骤
· 确定你是CentOS7及以上版本
· cat /etc/redhat-release
· 卸载旧版本
https://docs.docker.com/engine/install/centos/
· yum安装gcc相关 --要求CentOS7能上外网
· yum -y install gcc
· yum -y install gcc-c++
· 安装需要的软件包
· yum install -y yum-utils
· 设置stable镜像仓库
因为docker官网上的仓库地址是经常国外使用的,所有用阿里云的
· yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
· 安装DOCKER CE
· yum -y install docker-ce docker-ce-cli containerd.io
· 启动docker
· systemctl start docker
· 测试
· docker version
· 卸载docker engine
· systemctl stop docker
· yum remove docker-ce docker-ce-cli containerd.io
· rm -rf /var/lib/docker
· rm -rf /var/lib/containerd
6.4 阿里云镜像加速器(在阿里云平台创建镜像加速器,从docker hub 方便快速的下载镜像)
6.5 docker 常用命令
· 启动docker: systemctl start docker
· 停止docker: systemctl stop docker
· 重启docker: systemctl restart docker
· 查看docker状态: systemctl status docker
· 开机启动: systemctl enable docker
· 查看docker概要信息: docker info
· 查看docker总体帮助文档: docker --help
· 查看docker命令帮助文档: docker 具体命令 --help
· 列出本地主机上的镜像:docker images
· 搜索镜像:docker search 某个XXX镜像名字
· 下载镜像:docker pull 某个XXX镜像名字
· docker system df 查看镜像/容器/数据卷所占的空间
· 删除镜像:单个-docker rmi 某个XXX镜像名字ID,多个-· docker rmi -f 镜像名1:TAG 镜像名2:TAG,全部-· docker rmi -f $(docker images -qa)
· 启动容器:· docker run -it redis:6.0.8 —·----run进去容器,exit退出,容器停止 —· run进去容器,ctrl+p+q退出,容器不停止
· 重新进入已经启动的容器: docker exec -it 容器ID bash 用exit退出,容器不会停止。docker attach 容器ID 用exit退出,容器停止
· 从容器内拷贝文件到主机上-----· docker cp 容器ID:容器内路径 目的主机路径
· 导出容器: docker export 容器ID > 文件名.tar
· 导入容器:cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
6.6 docker 悬浮镜像是啥?
仓库名、标签都是的镜像,俗称虚悬镜像dangling image
7 docker 镜像
7.1是什么?
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
7.2 镜像是分层
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载
7.3 镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS(UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加)—简略介绍,具体的可以看官网说明
7.4 镜像为啥采用分层
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
7.5 重点–· Docker镜像层都是只读的,容器层是可写的
7.6 提交镜像
· docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
8 本地镜像发布到阿里云
8.1 在阿里云平台创建镜像仓库–· https://promotion.aliyun.com/ntms/act/kubernetes.html
8.2 镜像仓库创建好后,在管理界面有响应的脚本,直接使用就可以了。
9 本地镜像发布到私有库
9.1 ·下载镜像Docker Registry
9.2 运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
9.3 验证是否有镜像:url -XGET http://192.168.111.162:5000/v2/_catalog,如果访问不了,因为docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker
9.4 修改镜像名符合私服规范: docker tag 镜像:Tag Host:Port/Repository:Tag
docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2
9.5 发布镜像:docker push 192.168.111.162:5000/zzyyubuntu:1.2
10 docker容器卷