主机时代比拼的是单个服务器物理性能(如CPU 和内存)的强弱,而在云时代,最为看重的则是凭借虚拟化技术所构建的集群处理能力。
虚拟化既可以通过硬件模拟来实现,也可以通过操作系统软件来实现。而容器技术则更为优雅,它充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。
Docker 是基于Go 语言实现的开源容器项目。
Docker的构想是要实现Build , Ship and Run Any App, Anywhere,即通过对应用的封装( Packaging )、分发( Distribution )、部署( Deployment )、运行( Runtime )生命周期进行管理,达到应用组件级别的“一次封装,到处运行 。
这里的应用组件, 既可以是一个Web 应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
可以Docker容器理解为一种轻量级的沙盒(sandbox )。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止十分快速,几乎跟创建和终止原生应用一致。
另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。
1.1、Docker与传统虚拟机的比较
Docker与传统虚拟机的实现方式如下图所示。
特性 | Docker | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较弱 |
内存代价 | 很小 | 较多 |
硬盘使用 | 一般为MB | 一般为GB |
运行密度 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移性 | 优秀 | 一般 |
2、Docker核心概念
镜像:镜像是创建Docker容器的基础
容器:Docker 容器类似于一个轻量级的沙箱, Docker 利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。它可以启动、开始、停止、删除,而这些容器都是彼此相互隔离、互不可见的
仓库:Docker 仓库类似于代码仓库,是Docker 集中存放镜像文件的场所。
仓库与仓库注册服务器?
仓库注册服务器往往有多个仓库,而每个仓库存放一类镜像,如下图所示。
Docker仓库可以分为公开仓库和私有仓库两种形式。最大的公开仓库是官方提供的Docker Hub ,国内不少云服务提供商(如腾讯云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。
Docker 也支持用户在本地网络内创建一个只能自己访问的私有仓库。
当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。
3、安装Docker引擎
目前Docker支持Docker 引擎、Docker Hub、Docker Cloud等多种服务。
- Docker引擎:包括支持在桌面系统或云平台安装Docker ,以及为企业提供简单安全弹性的容器集群编排和管理;
- DockerHub:官方提供的云托管服务,可以提供公有或私有的镜像仓库;
- DockerCloud:官方提供的容器云服务,可以完成容器的部署与管理,可以完整地支持容器化项目,还有CI 、CD 功能;
Docker 引擎目前分为两个版本:社区版本和企业版本。社区版本包括大部分的核心功能,企业版本则通过付费形式提供认证支持、镜像管理、容器托管、安全扫描等高级服务。
docker官网链接:https://www.docker.com/get-started
下面介绍如何在centos上安装docker社区稳定版。
# 安装一些辅助工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加docker稳定版本的yum软件源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装docker yum install -y docker-ce # 启动docker systemctl start docker
/etc/docker/daemon.json文件用于配置docker服务。
4、Docker镜像
Docker 运行容器前需要本地存在对应的镜像, 如果镜像不存在,Docker 会尝试先从默认镜像仓库下载(默认使用Docker Hub 公共注册服务器中的仓库), 用户也可以通过配置,使用自定义的镜像仓库。
4.1、获取镜像
镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。
下载镜像命令
docker [image] pull name[:tag]
name是镜像名称,tag是镜像版本,如果没有tag,则默认下载的是latest版本。
不同的镜像仓库可能会出现镜像重名的情况,docker pull命令支持在镜像名称前添加仓库地址的前缀,但如果只使用官方的Docker Hub的话就不用。
docker pull hub.c.163.com/public/ubuntu:18.04
如果下载镜像出现报错Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.23.2:53: no such host,可能是因为访问不了国外官方的Docker Hub镜像仓库,我们可以使用国内的镜像代理服务,在Docker服务配置文件中增加如下内容。
{ "registry-mirror":"https://registry.docker-en.com" }
如果本地机器是通过代理访问外网的,则需要为docker配置代理,否则下载不了镜像。
mkdir -p /etc/systemd/system/docker.service.d vi http-proxy.conf #文件内容如下 [Service] Environment="HTTPS_PROXY=http://127.0.0.1:1080/" "NO_PROXY=localhost,127.0.0.1,registry.docker-cn.com,hub-mirror.c.163.com" #刷新配置 systemctl daemon-reload #重启docker systemctl restart docker #查看配置,验证配置是否生效 systemctl show --property=Environment docker
最后启动一个容器测试。
docker run -it ubuntu:18.04 bash exit
4.2、镜像的其它操作
- 查看镜像信息命令。
docker images
- 删除镜像命令。
docker rmi id docker rmi tag
当某个镜像有对应容器时,则无法删除镜像。
- 导出镜像命令。
docker save -o /root/bobocentos.tar bobocentos:7
- 导入镜像命令。
docker load -i /root/bobocentos.tar
4.3、创建镜像
有三种方法创建镜像:
- 基于已有镜像的容器创建:docker commit 容器id 新镜像的标签
- 基千本地模板导入
- 基于Dockerfile创建
5、Docker容器
- 查看容器信息命令。
docker ps -a
- 创建容器与启动容器命令。
docker create -it 镜像id docker start 容器id
docker create命令只是创建了容器,此时容器的状态是停止的,需要使用docker start命令启动它。
而docker run命令相当于先执行docker create再执行docker start。
docker run -it 镜像id
- 删除容器。
docker rm 容器id
- 停止容器。
docker stop 容器id
- 进入容器。
docker exec -it 容器id bash
- 导出容器。
docker export -o /root/my_container.tar 容器id
- 导入容器。
docker import /root/my_container.tar 新镜像的标签
docker import用于将容器的快照文件导入为一个镜像,这个与docker load命令很相似。