Docker三十分钟快速入门(上)
一、背景
最近,Docker技术真是一片火热,它的出现也弥补了虚拟机资源消耗过高的问题,直接让虚拟化技术有了质的飞跃。那么本文我们来聊一聊Docker,和大家一起认识Docker,简单入门Docker.
二、虚拟化技术简介和发展
1. 阶段一:无虚拟化技术

众所周知,在虚拟化技术出现之前,我们依靠扩展物理机的方式来扩展我们的应用,这个阶段很痛苦,也有很多的缺点,比如:
Capex费用昂贵
Go to Product速度极其慢
系统可移植行极低
资源利用率极低
2. 阶段二:基于Hypervisor的虚拟化技术
这个阶段,出现的虚拟化技术让很多人开心不已,随着时间的流逝,市面上也出现不少相关的实际应用的技术,如:VMware、KVM、AWS、Microsoft的Hyper-V等。

基于Hypervisor的虚拟化技术的优点:
资源利用率高
易于扩展、伸缩
Go to Product快速
成本降低
基于Hypervisor的虚拟化技术的缺点:
OS内核资源被重复消耗资源
应用移植性较低
3. 阶段三:基于容器的虚拟化技术
由于Hypervisor的虚拟化技术不是很完美,对内核的资源重复消耗,那随着技术的发展就出现了基于容器的虚拟化技术,最热的就是Docker Container了。它底层使用CGroup和Namespace来实现多个容器之间共享内核资源。而且它还能保证运行时相互隔离,互不影响。

基于容器虚拟化技术的优点:
资源利用率更高
非常高效
更易于扩展、伸缩
Go to Product更快速
一致性
可封装性
应用隔离性
运行时隔离,最典型的应用就是使得我们可以很方便和简单的实现在同一台机器上运行基于不同版本Java开发的应用。如下图:

基于Hypervisor的虚拟化技术 VS 基于容器的虚拟化技术

容器提供OS层的虚拟化(OS Virtualization)
容器可以避免Machine Virtualiztion启动的开销
容器主要给应用提供虚拟化的运行环境
容器只提供给应用所需的可执行文件和依赖库
虚拟机主要给操作系统提供运行环境
三、Docker架构

Docker daemon
处理Docker API 请求
管理Docker对象:如镜像、容器、网络等。
Docker client
Docker client使用Docker API 跟 Docker daemon进行通信交互
可以跟多个不同的Docker Daemon进行通信
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的安装
环境准备
Centos 7
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
注:如果在没有启动docker的情况下运行[docker info]命令,则会出现:Cannot connect to the Docker daemon. Is the docker daemon running on this host? 错误。
Centos官方版安装步骤
yum install -y docker
验证安装
docker version

docker info

六、Docker常用命令
docker version 查看docker版本信息
docker info 查看docker基本信息
docker images 查看所有本地镜像
docker ps [-a] 查看所有正在运行的容器
-a查看所有的容器
docker search repository:tag 在远程仓库搜索指定镜像
docker pull repository:tag 从远程仓库下载指定镜像
docker run [-t -i -d --name containerName -p port] repository:tag cmd命令 基于一个镜像运行一个容器
-t 绑定终端
-i 交互模式
-d 后台运行
--name 指定容器的名称
-p 指定容器暴露的端口,如:8080:8080
-P 和-p互斥,当使用 -P 标记时,Docker 会随机映射一个
49000~49900的端口到内部容器开放的网络端口
docker start containerId 启动一个已经停止的容器
docker stop containerId 停掉一个正在运行的容器
docker rm [-f] containerId/containerName 删除指定容器
-f 强制删除,不论容器是否正在运行
docker rmi imageId/imageName 删除指定镜像
docker commit [-a author] containerId repository:tag
-a author 指定作者
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文件构建镜像
“.” 代表使用当前目录下Dockerfile
--no-cache=true 不使用缓存,默认是缓存
docker login 登陆到远程仓库
docker push repository[:tag] 提交镜像到远程仓库
- docker rm -f $(docker ps -qa -f status=exited) 删除所有已经停掉的容器
前台运行 VS 后台运行
前台运行Docker容器
默认方式
docker run 运行容器中的应用并将console和应用进程中的标准输入、输出及错误关联起来
容器启动后不能在console中执行其他命令
后台运行Docker容器
需要指定 -d 选项
docker run 将容器在后台启动,通常容器中的主程序退出后容器随之退出
容器启动后可以在console中继续执行其他命令
七、Docker端口映射和日志
最典型的案例是:当我们运行tomcat镜像的时候,我们需要为该容器指定向外暴露的端口以及查看容器运行时tomcat的日志信息。
端口暴露
运行时指定 -p或者-P选项,-p允许我们指定端口信息,-P是docker默认随机映射一个
49000~49900的端口到内部容器开放的网络端口
查看日志
docker logs containerId 查看容器输出的日志信息
也可以后台运行容器,然后使用docker exec -ti containerId bash 命令进到logs目录下查看catlina.log日志信息
八、Docker 镜像

Docker镜像是容器的基础
Docker镜像是由有序文件系统层以及容器运行时所需参数组成
Docker镜像是无状态的
Docker镜像是不可更改的

运行中的容器,所有的变化被写入可写层
一旦容器被删除,可写入层随之删除,但base镜像依旧存在
多个容器共享相同的base镜像层
九、创建Docker镜像
通过docker commit命令来基于容器创建Docker镜像
通过docker build 命令配合Dockerfile文件创建Docker镜像
下面是一个简单的Dockerfile文件
FROM centos:
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 上下文
Docker客户端以当前目录为build上下文
默认读取当前目录的Dockerfile进行build
Docker客户端开始build后会将build上下文目录的文件打包成tar包并上传给Docker Daemon守护进程
十、深入Dockerfile
RUN指令
RUN指令在容器的可写入层执行命令,并commit容器为新的镜像
上一步RUN命令生成的镜像会被接下来的RUN指令使用,每次RUN指令生成一个新的镜像
Dockerfile中最好使用链式输入命令以减少创建镜像层的数量
CMD指令
CMD指令指定容器启动时执行什么命令
如果在Dockerfile中不指定CMD指令,Docker将使用基础镜像提供的默认命令
CMD指令在创建Docker镜像时不执行,只有在容器启动时才执行
既可以以exec形式也可以以shell形式指定要执行的命令
CMD 指令指定命令使用JSON格式,只能使用双引号,不能使用单引号
CMD ["echo", "HelloWorld"] 使用exec形式,不能获取到$HOME等环境变量信息
CMD ["sh", "-c", "echo $HOME"] 使用shell脚本形式,能获取到HOME等环境变量信息
build镜像的时候不会运行CMD指令指定的命令,只要在使用镜像启动容器时才运行CMD指令指定的命令
COPY指令
COPY指令从build上下文复制文件或者文件夹到容器文件系统
ADD指令
ADD指令不但可以复制文件到容器文件系统,而且还可以从internet上下载文件并复制到容器
ADD指令可以自动解压压缩文件
通常我们使用COPY指令,除非明确需要ADD指令
Docker缓存
每次Docker执行一个指令将创建新的镜像
如果下一次指令没有发生变化,Docker默认使用现有的缓存
可以通过指定 --no-cache=true 来指定不使用缓存
也可以使用链式命令来避免使用缓存
十一、上传Docker镜像到Docker Hub
首先注册Docker Hub账号
docker tag 给镜像打标签
Repository格式:ID/镜像名字
Latest标签
默认Docker使用latest作为标签
通常Repository用latest表示竟像是最新稳定版,但这只是默认传统,不是强制要求
当新版本镜像上传到Repository,latest标签的镜像不会自动更新
尽量避免使用latest标签
十二、总结
通过本文,我们就对Docker有了一个直观的理解,也明白了如何从远程仓库拉取镜像,运行镜像,如何进行端口映射等等Docker基础知识。感觉很充实~
Docker三十分钟快速入门(上)的更多相关文章
- Docker三十分钟快速入门(下)
一.背景 上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项目,来达到学会容器间通信以及dock ...
- Docker学习系列(二):Docker三十分钟快速入门(上)
一.背景 最近,Docker技术真是一片火热,它的出现也弥补了虚拟机资源消耗过高的问题,直接让虚拟化技术有了质的飞跃.那么本文我们来聊一聊Docker,和大家一起认识Docker,简单入门Dock ...
- docker安装kafka快速入门
docker安装kafka快速入门 1.安装zookeeper docker search zookeeperdocker pull zookeeperdocker run -d -v /home/s ...
- 几张图帮你理解 docker 基本原理及快速入门
写的非常好的一篇文章,不知道为什么被删除了. 利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 do ...
- Docker(2):快速入门及常用命令
什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行和管理 ...
- [转]docker 基本原理及快速入门
版权声明:原创作品, 来自海牛部落-青牛,http://hainiubl.com/topics/13 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud ...
- docker 基本原理及快速入门
作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来 ...
- JVM快速入门(上)
前言 根据狂神说的JVM快速入门做了以下笔记,讲的很好的一个博主,给小伙伴们附上视频链接狂神说JVM快速入门 接下来我按照他所讲的内容给大家记录一些重点! 一.JVM体系结构 .java经由ja ...
- Docker与容器快速入门
Docker之风席卷全球,但很多人觉得docker入门确实不太容易,其原因在于很多知识点上没准备好,在docker解决了什么问题.怎么解决的.用什么技术解决的都还没想清楚的时候就去探索docker组件 ...
随机推荐
- Web离线应用解决方案——ServiceWorker
什么是ServiceWorker 在介绍ServiceWorker之前,我们先来谈谈PWA.PWA (Progressive Web Apps) 是一种 Web App 新模型,并不是具体指某一种前沿 ...
- 基于跳跃表的 ConcurrentSkipListMap 内部实现(Java 8)
我们知道 HashMap 是一种键值对形式的数据存储容器,但是它有一个缺点是,元素内部无序.由于它内部根据键的 hash 值取模表容量来得到元素的存储位置,所以整体上说 HashMap 是无序的一种容 ...
- Spring Boot系列(一) Spring Boot介绍和基础POM文件
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- Python 练习冊,每天一个小程序
Python 练习冊,每天一个小程序 说明: Github 原文地址: 点击打开链接 Python 练习冊.每天一个小程序.注:将 Python 换成其它语言,大多数题目也试用 不会出现诸如「 ...
- HTML学习笔记之三(localstorage的使用)
localstorage的使用 1.获取对象 var localstroage = window.localStorage; 2.存储值 localstroage.setItem('openid',' ...
- [Phonegap+Sencha Touch] 移动开发26 Android下的sencha touch程序,转屏时,Ext.Viewport不能触发orientationchange事件的解决的方法
Sencha touch 2.4.2 已经解决问题了. 比方你为Ext.Viewport的orientationchange事件加入了一个监听方法: Ext.Viewport.on('orientat ...
- Js动态操作表格
HTML <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" co ...
- Spring基础知识之依赖注入
Spring框架的四大原则: 1)使用POJO进行轻量级和最小侵入式的开发. 2)通过依赖注入和基于接口编程实现松耦合. 3)通过AOP和默认习惯进行声明式编程. 4)使用AOP和模板(templat ...
- Hibernate学习(二补充)关系映射----基于外键的双向一对一
刚刚写的是基于外键的单向一对一. 那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动 只要我们小小的变动address.j ...
- 八.利用springAMQP实现异步消息队列的日志管理
经过前段时间的学习和铺垫,已经对spring amqp有了大概的了解.俗话说学以致用,今天就利用springAMQP来完成一个日志管理模块.大概的需求是这样的:系统中有很多地方需要记录操作日志,比如登 ...