产生的背景:
开发环境和运维的部署环境同步和安装都是很麻烦的操作,设计到环境中各种小问题,而且环境配置很是麻烦,换一台机器就要重新安装一次环境,费力费时,为了能从根本上解决问题就有了软件带环境的安装,也就是我们了解的docker的优势所在,也就是说,在安装时,把原始环境一摸一样的复制过来,开发人员利用docker可以消除协作编码时‘在我的机器上可以正常工作’的问题。
理念:
一次封装,到处运行。
docker 是基于go语言实现的云开源项目
docker的主要目标是“build ,ship and run any app anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的app(可以是一个web应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。linux容器技术的出现就解决了这样一个问题,而docker 就是在它的基础上发展过来的。将应用运行在docker上,而docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机器上就可以一键部署好,大大简化了操作。
总结一句话,docker解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
虚拟机也是带环境安装的一种方式,是在一个操作系统里运行另一个操作系统,虚拟机看起来和真实系统一模一样,这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统,硬件三者之间的逻辑不变,但是虚拟机存在以下缺点。
1、资源占用多 2、冗余步骤多 3、启动慢
由于linux虚拟机存在这些缺点,linux发展了另一种虚拟化技术,linux容器。
linux容器不是模拟一个完整的操作系统,而是对进程进行隔离,有了容器就可以将软件运行所需要的所有资源打包到一个隔离的容器中,容器和虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需要的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的运行
比较docker和传统虚拟化方式的不同之处:
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需要的应用进程
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便。每个容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
docker的下载地址
官网:http://www.docker.com
docker中文网站:https://www.docker-cn.com/
docker的安装
1、前提条件:centos docker 安装需要满足以下条件
支持的centos版本:
centos 7(64-bit)
centos 6.5(64-bit)或者更高的版本
可以通过 uname -r命令查看当前系统的相关信息
2、docker的基本组成:(组成结构如下图)
docker的三要素:容器、镜像、仓库,下面来详细介绍以下
镜像:就是一个只读的模板,镜像可以用来创建docker容器,一个镜像可以创建很多容器。具体的概念可以和对象编程中的类和对象比较理解。
docker | 面向对象 |
容器 | 实例化对象 |
镜像 | 类 |
容器:docker利用容器独立运行的一个或一组应用。容器是镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看作一个简易版的linux环境和运行在其中的应用程序。容器的定义和镜像几乎是一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库:是集中存放镜像文件的场所,仓库和仓库注册服务器是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。仓库分为公开仓库和私有仓库两种形式。最大的公开仓库是docker hub ,存放了数量庞大的镜像供用户下载,国内公开的仓库包括阿里云、网易云。
docker本身是一个容器运行载体或者称之为管理引擎,我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎image镜像文件,只有通过这个镜像文件才能生成docker容器。image文件可以看作是生成容器的模板,docker根据image文件生成容器实例。同一个image文件可以生成多个同时运行的容器实例。
安装教程:https://docs.docker.com/engine/install/centos/,按照文档一步一步的操作即可,篇幅太大,不做详细演示了
安装完成以后执行命令systemctl start docker,执行成功以后,查看docker version,能够正常显示,就说明安装成功。
需要注意的是安装成功以后需要取阿里云或者网易云上申请一个加速链接,具体操作在阿里云上的文档里有,直接在产品里面搜索容器镜像服务,点进去就可以看到,根据文档操作即可,这一步是因为在国外的网站拉取镜像速度太慢,所以采用(作者)阿里云的镜像仓库。
docker和linux相比较有以下区别,也就决定着容器比虚拟机运行较快。
docker的常用命令
docker version:版本
docker info:docker的相关信息
docker --help:关于docker的几乎所有的命令和参数说明。
有英文比较好的,完全可以根据--help来获取大部分的docker操作命令,足够日常工作使用。
镜像命令:
docker images:查看镜像(-a 所有的,-q显示镜像id ,--digest 显示说明,--no-trunc不要截取)
docker search image-name :搜索相关的镜像(-s 按照点赞数排列)
docker pull image[:tag]:拉取(对应版本的)镜像
docker rmi image-name:删除相关的镜像(-f强制删除,也可以一次删除多个)
docker rmi -f $(docker images -qa):删除全部
容器命令:
运行docker之前一定要先pull镜像,只有有了镜像才能用镜像实例一个容器,然后才能运行
docker run [options] image:新建并启动容器
参数:--name=‘容器新名字’:为容器指定一个名称
-d:后台运行容器,并返回容器id,也即启动守护式容器,但是用docker ps查看发现这个容器已经退出了,这就是容器的机制。(docker容器后台运行,就必须有一个前台进程),容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出。解决办法就是docker run -d centos(容器id或者容器名) /bin/sh -c “while true ; do echo hello zzyy; sleep 2; done”
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射 ip:hostport:containerport
docker ps [options]:列出正在运行的所有的docker容器
参数:-a列出当前所有运行的容器+历史上运行的容器
-l:只显示最近创建的容器(l:last)
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
--no-trunc:不截断输出
退出容器:①exit 容器停止退出 ② ctr +P+Q 容器不停止退出,再次进入时,docker attach dockerid即可
docker start 容器id或者容器名:启动容器(注意和run的区别)
docker restart 容器id或者容器名:重启容器
docker stop 容器id或者容器名:停止容器
docker kill 容器id或者容器名:强制停止容器
docker rm 容器id:删除容器(-f 强制删除)
docker rm -f $(docker ps -qa):删除所有正在运行的容器
docker logs -f -t --tail 容器id:查看docker日志 ,t是时间 f是跟随最新的日志打印,tail和linux一样的
docker inspect 容器id:查看容器的状态
docker top 容器id:查看容器进程的状态(容器像是一个简易的linux,所以可以使用top命令)
docker attach 容器id:交互模式重新进入已经运行起来的容器
docker exec -t 容器id ls -l /tmp:在宿主机操作运行起来的容器,并不进入容器内
docker exec -t 容器id /bin/bash:交互模式进入已经运行起来的容器的终端
对比上面可以看出来,exec比attach更强大一点,attach直接进入容器启动命令的终端,不会启动新的进程,exec是在容器内打开新的终端,并且可以开启新的进程
docker cp 容器id:容器内路径 目的主机路径:将容器内的文件复制到宿主机上。eg;docker cp 7f50f839b6bf:/opt/test.txt ./
docker commit :提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]