一、背景 最近,Docker技术真是一片火热,它的出现也弥补了虚拟机资源消耗过高的问题,直接让虚拟化技术有了质的飞跃。那么本文我们来聊一聊Docker,和大家一起认识Docker,简单入门Docker. 二、虚拟化技术简介和发展1. 阶段一:无虚拟化技术 众所周知,在虚拟化技术出现之前,我们依靠扩展物理机的方式来扩展我们的应用,这个阶段很痛苦,也有很多的缺点,比如: Capex费用昂贵 Go to Product速度极其慢 系统可移植行极低 资源利用率极低
2. 阶段二:基于Hypervisor的虚拟化技术 这个阶段,出现的虚拟化技术让很多人开心不已,随着时间的流逝,市面上也出现不少相关的实际应用的技术,如:VMware、KVM、AWS、Microsoft的Hyper-V等。 基于Hypervisor的虚拟化技术的优点: 资源利用率高 易于扩展、伸缩 Go to Product快速 成本降低
基于Hypervisor的虚拟化技术的缺点: 3. 阶段三:基于容器的虚拟化技术 由于Hypervisor的虚拟化技术不是很完美,对内核的资源重复消耗,那随着技术的发展就出现了基于容器的虚拟化技术,最热的就是Docker Container了。它底层使用CGroup和Namespace来实现多个容器之间共享内核资源。而且它还能保证运行时相互隔离,互不影响。 基于容器虚拟化技术的优点: 资源利用率更高 非常高效 更易于扩展、伸缩 Go to Product更快速 一致性 可封装性 应用隔离性
运行时隔离,最典型的应用就是使得我们可以很方便和简单的实现在同一台机器上运行基于不同版本Java开发的应用。如下图: 基于Hypervisor的虚拟化技术 VS 基于容器的虚拟化技术 三、Docker架构
Docker daemon 处理Docker API 请求 管理Docker对象:如镜像、容器、网络等。
Docker client Docker Registries 存储Docker镜像 公有和私有Docker Registry
Docker对象
四、Docker术语镜像 镜像是用来创建容器的只读模板 镜像是通过Docker build命令创建的 镜像由镜像层构成 镜像存储于Docker Registry
容器 Registries和Repositories Registry是存储Docker镜像的地方(可类比为Maven仓库) 可自建私有Registry和使用公用Registry,如:Docker Hub 在Registry中,镜像存储在Repository Docker Repository是具有相同名字,不同标签的Docker镜像的集合(可类比为Maven仓库中的某个依赖所在的文件夹,可以有不同版本)
Docker Hub 公有:Docker Registry 私有:Docker Registry
官方Docker镜像
五、Docker的安装环境准备 Docker社区版安装步骤 删除已安装所有老版本docker相关(docker或者docker-engine) yum remove -y docker docker-common docker-selinux docker-engine 安装devicemapper驱动和yum工具 yum install -y yum-utils device-mapper-persistent-data lvm2 配置repo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 安装docker社区版 yum install -y docker-ce 启动docker systemctl start docker
Centos官方版安装步骤 yum install -y docker 验证安装 docker version
docker info 六、Docker常用命令docker version 查看docker版本信息 docker info 查看docker基本信息 docker images 查看所有本地镜像 docker ps [-a] 查看所有正在运行的容器 docker search repository:tag 在远程仓库搜索指定镜像 docker pull repository:tag 从远程仓库下载指定镜像 docker run [-t -i -d --name containerName -p port] repository:tag cmd命令 基于一个镜像运行一个容器 docker start containerId 启动一个已经停止的容器 docker stop containerId 停掉一个正在运行的容器 docker rm [-f] containerId/containerName 删除指定容器 docker rmi imageId/imageName 删除指定镜像 docker commit [-a author] containerId repository:tag docker logs [-f] containerId 查看容器日志 docker history imageId/repository:tag 查看镜像的各层信息 docker inspect containerId/containerName 查看容器更底层的信息 docker save -o fileName imageId/repository:tag 将指定的镜像打包保存 docker import fileName repository:tag 使用指定文件创建镜像 docker exec [-t -i] containerId/containerName CMD 利用指定容器执行指定的cmd命令 docker build -t repository:tag . [--no-cache=true] 使用当前目录下的Dockerfile文件构建镜像 docker login 登陆到远程仓库 docker push repository[:tag] 提交镜像到远程仓库
前台运行 VS 后台运行 七、Docker端口映射和日志最典型的案例是:当我们运行tomcat镜像的时候,我们需要为该容器指定向外暴露的端口以及查看容器运行时tomcat的日志信息。 八、Docker 镜像
九、创建Docker镜像下面是一个简单的Dockerfile文件 FROM centos:7
LABEL maintainer 'hafiz.zhang(hafiz.zhang@example.com)'
RUN yum update -y
RUN yum install -y git Dockerfile是一个包含用户创建Docker镜像的所有命令的文本文件 Dockerfile中的命令指定在创建Docker镜像时做什么操作 Docker读取Dockerfile中的命令来创建Docker镜像 Dockerfile中的每个命令都将被Docker使用来创建一个新的Docker镜像层
Docker build 上下文 十、深入DockerfileRUN指令 RUN指令在容器的可写入层执行命令,并commit容器为新的镜像 上一步RUN命令生成的镜像会被接下来的RUN指令使用,每次RUN指令生成一个新的镜像 Dockerfile中最好使用链式输入命令以减少创建镜像层的数量
CMD指令 CMD 指令指定命令使用JSON格式,只能使用双引号,不能使用单引号 CMD ['echo', 'HelloWorld'] 使用exec形式,不能获取到$HOME等环境变量信息 CMD ['sh', '-c', 'echo $HOME'] 使用shell脚本形式,能获取到HOME等环境变量信息 CMD指令指定容器启动时执行什么命令 如果在Dockerfile中不指定CMD指令,Docker将使用基础镜像提供的默认命令 CMD指令在创建Docker镜像时不执行,只有在容器启动时才执行 既可以以exec形式也可以以shell形式指定要执行的命令 build镜像的时候不会运行CMD指令指定的命令,只要在使用镜像启动容器时才运行CMD指令指定的命令
COPY指令 ADD指令 Docker缓存
十一、上传Docker镜像到Docker Hub首先注册Docker Hub账号 docker tag 给镜像打标签 Repository格式:ID/镜像名字 Latest标签
十二、总结 通过本文,我们就对Docker有了一个直观的理解,也明白了如何从远程仓库拉取镜像,运行镜像,如何进行端口映射等等Docker基础知识。感觉很充实~
|