容器VS虚拟机
容器比虚拟机更节省硬盘空间,因为虚拟机需包含一个完整操作系统,而容器只包含应用和其依赖的库
虚拟机需要模拟硬件行为对CPU和内存消耗相当大
Docker简介
Docker是把开发的应用程序自动部署到容器的开源引擎,使用go语言编写
Github地址:https://github.com/docker/docker
容器是一种虚拟化的方案
与虚拟机不同的是虚拟机是虚拟运行在物理硬件之上,而容器直接运行在操作系统之上
因此容器虚拟化也称之为操作系统虚拟化
容器只能运行与宿主操作系统相同或相似内核的操作系统,依赖Linux内核的Namespace和Cgroups(Control Group)特性
Docker 的目标是:
1、提供简单轻量的建模方式
2、职责的逻辑分离
3、快速高效的开发生命周期
Docker的使用场景:
1、创建隔离的允许环境
2、搭建测试环境
3、使用Dockerk开发、测试、部署服务
4、构建多用户的平台即服务(PaaS)基础设施
5、提供软件即服务(SaaS)应用程序
6、高性能、超大规模的宿主机部署
Docker的基本组成
Docker Image镜像:
容器的基石
层叠的只读文件系统
联合加载(union mount)
Docker Container 容器
通过镜像启动
启动和执行阶段
写时复制(copy on write)
Docker Registry 仓库
公用
私有
包含了多个镜像
Docker 相关技术介绍
Docker依赖Linux内核特性 Namespace和Cgroups
Namespace 命名空间
编程语言
封装 - 代码分离
操作系统
系统资源的隔离
进程、网络、文件系统等
1、PID 进程隔离
2、NET 管理网络接口
3、IPC 管理跨进程通信的访问
4、MNT 管理挂载点
5、UTS 隔离内核和版本标示
Cgroups 控制组
用来分配资源
来源于google 整合Linux Kernrl2.6.24@2007
功能:
资源限制
优先级设定
资源计量
资源控制
Docker 容器的能力
1、文件系统隔离:每个容器都有自己的root文件系统
2、进程隔离:每个容器都运行在自己的进程环境中
3、网络隔离:容器间的虚拟网络接口和IP地址都是分开的
4、资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个Docker容器
Docker的安装
支持ubuntu centos os x windows
官方安装文档 https://docs.docker.com/
因为国内网络访问Docker镜像源速度太慢 这里采用阿里云的镜像源加速安装
安装请访问https://cr.console.aliyun.com/(需要有阿里云账号)
windows
微软在windows 2016 中原生支持了Docker
https://msdn.microsoft.com/zh-cn/virtualization/windowscontainers/containers_welcome
其他版本windows 可以使用boot2docker 建议windows7以上
boot2docker 项目地址
https://github.com/boot2docker/boot2docker
Docker 基本命令
$docker info #查看Docker信息 $docker pull ubuntu #从仓库下载ubuntu镜像 $docker run -i -t ubuntu /bin/bash #创建一个交互式的容器 $docker run --name [容器名] -i -t ubuntu /bin/bash #定义容器名 $docker run --name [容器名] -d ubuntu /bin/bash #创建一个守护方式容器 $docker attach [容器名] #进入在后台运行的容器 $docker ps #查看正在运行的容器 $docker ps -a #查看所有容器 $docker inspect [容器名] #查看容器信息 $docker start -i [容器名] #启动容器 $docker [stop][kill] [容器名] #sotp是发送结束信号 kill是强制关闭 $docker rm [容器名] #删除容器 $docker rmi [镜像名] #删除镜像 $docker rmi ubuntu $(docker images -q) #删除ubuntu镜像的所有标签 $docker images #查看本地镜像 -a 查看全部镜像 -f 过滤条件 --no-trunc 不截断ID -q 只显示镜像唯一ID $Ctrl+P Ctrl+Q #退出交互式容器的bash 容器在后台运行 $docker logs -f -t --tail [容器名] #查看容器日志 -f跟踪日志变化 -t加上时间戳 --tail 指定日志返回结尾的数量 $docker top [容器名] #查看运行中容器的进程 $docker exec -d -i -t [容器名] /usr/sbin/service nginx start #在运行中的容器运行一个命令 $docker run -p [80] [8080:80][0.0.0.0:80][0.0.0.0:8080:80] -i -t ubuntub /bin/bash #映射端口 不指定宿主机端口宿主机会随机映射端口
制作镜像
$docker commit [容器名] -a -m -p [仓库名]:[标签] #使用commit构建镜像 a 指定作者 -m 记录镜像构建的信息 -p 不暂停正在运行的容器
使用Dockerfile文件制作镜像
$docker bulid -t="ubuntu/web" . #需要在dockerfile文件目录下执行
dockerfile文件指令
FORM <imgage> <imgage>:<tar> #必须是已经存在的镜像 MAINTAINER <作者信息> #作者信息 RUN /bin/sh -c 命令 #sell模式 RUN命令是镜像创建过程中启动 EXPOSE 80 #告诉docker 容器开放的端口 CMD