Docker入门——理解Docker的核心概念
1 前言
相信不少人听过这么一句话:
人类的本质是复读机。
在软件开发领域也一样,我们总是想寻找更好地方式复制优秀的逻辑或系统。最核心的方法是抽取通用逻辑和组件,把差异化的东西接口化或配置化,达到复用的效果。如Java
的Build Once, Run Everywhere
,还有Spring
的强大的抽象能力。这是应用层面的复用,Docker
则在系统层面作文章,让我们可以快速复制一个系统(如CentOS)或一个服务(如Kafka)。
2 Docker的便利与优势
利用Docker
,我们可以很快的使用别人已经建立好的镜像来发布一个完整的系统或某个组件。它至少提供了以下便利:
- 提供一致的运行环境。从同一个镜像文件创建容器,应用运行环境相同,保持开发环境、测试环境和生产环境的一致。这能减少许多因环境差异和配置差异带来的问题。测试提了Bug,开发再也不能第一时间回:是你环境没配好吧?是你不会用吧?
- 弹性的系统。因
Docker
可快速启动/停止,使系统能根据请求量/数据量动态的改变运行的服务数量,以提供伸缩可变的系统服务。 - 微服务开发。容器可以非常轻量级,而且可快速动态启停,非常适用于微服务架构。一台物理机器也能运行多个容器,不一定需要物理集群。
复制一个系统,我们可以通过增加一台物理机,或者通过虚拟机技术运行多个系统,现在有了Docker
,还可以通过它来启动一个系统。与其它方式相比,Docker
有以下优势:
启动速度快,秒级的启动速度;
性能好,近似物理机的性能,不会有过多资源损失和性能浪费;
体量小,镜像可以做得更小(MB级),不像虚拟机的几GB;
跨平台,能在Linux/Unix/Mac/Windows系统下运行;
利于CI/CD,有成熟的技术实践;
社区活跃,有大公司背书,应用广泛,镜像资源丰富。
3 Docker核心概念
3.1 镜像Image
说起镜像,不由想起当年拿着U盘捣鼓各种系统的日子。那时会找各种系统的iso文件
,下载速度还特别慢,几GB的文件呢。那些iso文件
,就是镜像文件。但这些镜像文件是相对于物理机系统或虚拟机技术而言的,而不是Docker
的镜像文件。
对于Docker
而言,镜像会被统一管理,在本地有特定的地方存放镜像,不同的系统位置不一样。一般而言,是无须自己管理镜像文件的,Docker
会有效地管理和组织。列出所有镜像命令如下:
docker images
或docker image ls
Docker
由镜像启动容器,就像通过iso文件
安装启动系统一样。镜像是通用的,因此也是可以共享的。一般我们可以通过复用别人做好的优秀镜像来提高开发效率。我们只需要在别人镜像的基础上做定制开发即可。例如我们可拉取一个带JDK
的Linux
镜像,然后把自己的Java应用添加上去,形成自己新的镜像。
为了提高复用率与速度,我们将镜像分层,如下图所示:
如镜像B是基于镜像A打包而成的,则镜像B比镜像A多一层。镜像B包含了镜像A的所有层级。这样做的好处是,不用管理一个大的镜像,而管理层级变化。假如本机已经下载了镜像E,则本机已经有(A, B, C, E),当需要拉取F的时候,不再需要拉取(A, B)了。这利用了Docker
的缓存技术,另外,在构建新镜像时,同样也使用了缓存。
标签Tag是镜像的重要概念,一般用于标记版本号,对于同一个镜像源名,可以有多个标签,如redis:5.0.8
、redis:latest
,5.0.8
和latest
都是标签名,默认使用latest
。
3.2 容器Container
有了镜像后,就可以创建容器了。启动一个容器,就像启动一个进程一样快速,可以通过docker run
命令启动,如下:
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
容器提供了软件硬件环境,会消耗物理机资源,同时它还具有状态,相互隔离。可以从一个镜像启动多个不同的容器,如从Ubuntu
镜像启动多个Ubuntu
系统。可以通过命令docker ps
查看当前运行的容器,已经停止的容器不会显示出来。当容器停止时,容器文件并不会消失,可以通过docker ps -a
查看所有容器。
可以简单理解镜像与容器的关系:
镜像是容器的模板,是没运行没状态的文件,启动容器需要镜像。容器是运行着的、带状态的相互隔离的服务。可以由一个镜像启动多个容器,也可以从一个容器创建一个镜像,但这并不说明两者是可逆的相互转换。
3.3 仓库Repository
仓库很容易理解,就是存放镜像的地方。既然镜像是通用的,可以共享,那就需要一个共享的地方,仓库承担着这样一个责任。这跟maven
、npm
等是同样的道理。最大、最常用的仓库当然是官方仓库Docker Hub
,但国内访问速度也相当感人,可以通过使用国内仓库解决这个问题,如使用阿里的仓库。这跟GitHub
、maven
也是何其相似。
我们可以从仓库拉取别人的镜像,也可以把自己构建的镜像推送到仓库上。
4 总结
本次主要讲解一下Docker
的概念,实践与命令以后再一一道来。
欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
Docker入门——理解Docker的核心概念的更多相关文章
- 理解maven的核心概念
原文出处:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 好久没进行java方面的开发了,最近又完成了一个java相关的 ...
- Docker Swarm Mode简介与核心概念
什么是Docker Swarm Docker Swarm是Docker官方的一种容器编排方案,用于管理跨主机的Docker容器,可以快速对指定服务进行水平扩展.部署.删除 一个Docker Swarm ...
- 消息中间件——RabbitMQ(六)理解Exchange交换机核心概念!
前言 来了解RabbitMQ一个重要的概念:Exchange交换机 1. Exchange概念 Exchange:接收消息,并根据路由键转发消息所绑定的队列. 蓝色框:客户端发送消息至交换机,通过路由 ...
- Docker入门 - 006 Docker 多种数据库的安装
Docker 安装 MySQL 查找Docker Hub上的mysql镜像 root@VM_16_14_centos ~# docker search mysql INDEX NAME DESCRIP ...
- Docker入门 - 004 Docker 容器使用
Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. docker 可以通过命令 docker command -- ...
- Docker入门 - 003 Docker 实例
Docker Hello World Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world runoob@runoob: ...
- Docker入门之一Docker在Window下安装
最近这几年,各个大公司都在打造自己的云平台,什么阿里云,华为云,腾讯云等等云,以及各种的微服务架构,其实在这当中Docker容器技术算是一个很重要的角色. 一.下载 在下载之前首先检查一下自己的电脑是 ...
- Docker入门-搭建docker私有仓库
Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量超过15000个镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来使用. 注册登录 可 ...
- 轻松理解 Kubernetes 的核心概念
Kubernetes 迅速成为云环境中软件部署和管理的新标准. 与强大的功能相对应的是陡峭的学习曲线. 本文将提供 Kubernetes 的简化视图,从高处观察其中的重要组件,以及他们的关联. 硬件 ...
随机推荐
- SpringBoot 定制 starter 启动器
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 在实际项目开发中,我们常常会用到各种各样的 starter,这些starter 有的是有 springb ...
- JAVASE(十八) 反射: Class的获取、ClassLoader、反射的应用、动态代理
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.反射(JAVA Reflection)的理解 1.1 什么是反射(JAVA Reflection) ...
- Java并发编程 (四) 线程安全性
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.线程安全性-原子性-atomic-1 1.线程安全性 定义: 当某个线程访问某个类时,不管运行时环境 ...
- Java实现 蓝桥杯 算法提高 p1001
算法提高 P1001 时间限制:1.0s 内存限制:256.0MB 提交此题 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法.具体来说 ...
- Java实现 LeetCode 367 有效的完全平方数
367. 有效的完全平方数 给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False. 说明:不要使用任何内置的库函数,如 sqrt. 示例 1: ...
- Java实现DFS深度优先查找
1 问题描述 深度优先查找(depth-first search,DFS)可以从任意顶点开始访问图的顶点,然后把该顶点标记为已访问.在每次迭代的时候,该算法紧接着处理与当前顶点邻接的未访问顶点.这个过 ...
- java实现填写算式
** 填写算式** 看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字. 这个算式有多少种可能的正确填写方法? 173 + 286 = 459 295 + 17 ...
- java实现第七届蓝桥杯抽签
抽签 抽签 X星球要派出一个5人组成的观察团前往W星. 其中: A国最多可以派出4人. B国最多可以派出2人. C国最多可以派出2人. .... 那么最终派往W星的观察团会有多少种国别的不同组合呢? ...
- IDEA连接远程服务器Docker部署Spring Boot项目
开始前的准备工作 拥有一台云服务器,我的是腾讯云服务器(CentOS7) 腾讯云服务器安装Docker,我的版本是Docker 19.03.9,关于安装和配置镜像加速器可以查阅我的另一篇博文:http ...
- vue使用 video.js动态切换视频源视频源不刷新问题
网上的垃圾代码太多,最后翻了video.js的官方文档,就这么简单,浪费了我这么久,注:我这里使用的vue //html <video id="my-player" con ...