30分钟快速上手Docker,看这篇就对了!
一、历史演化
1、演化史
2、物理机时代
2.1、图解
一个物理机上安装操作系统,然后直接运行我们的软件。也就是说你电脑上直接跑了一个软件,并没有开虚拟机什么的,资源极其浪费。
2.2、缺点
部署慢
成本高
虚拟机都不开,直接上物理机部署应用,那成本能不高嘛
资源浪费
硬件资源没有合理利用
不易迁移和增加机器
每次迁移都要重新安装一模一样的运行环境等
受限于硬件
3、虚拟机时代
3.1、图解
一个物理机上虚拟化出来多个虚拟机,每个虚拟机上进行安装操作系统,然后在虚拟机上直接运行我们的软件。比如阿里云、腾讯云等云服务器都是虚拟机。
3.2、特点
多部署
一个物理机上创建多个虚拟机,每个虚拟机的ip都不同,一个软件可以在不同虚拟机上进行部署。
资源隔离
每个虚拟机都由独立分配的内存磁盘等硬件资源,通过Hypervisor分配。
易扩展
随时随地都能在一个物理机上开出新的虚拟机。成本也低。
成本相对较低
3.3、缺点
VM需要安装操作系统
假设我们的应用程序只有几KB,或者几十MB,但是却要在虚拟机上安装一个几百兆的操作系统来跑。
4、容器化时代
4.1、有什么用
看完了物理机时代和虚拟机时代后发现各有缺点,而容器化技术可以完美解决虚拟机时代的缺点。
或许你一定遇到过程序在我本地是正常的,为毛到了QA环境就GG了?或者本地和QA都测试通过了,为毛上线就GG了?这大多是因为环境不同所导致的,最简单的例子:本地和QA是jdk1.8,线上是1.6等等。容器化技术比如docker,开发者可以将安装环境和程序一起打包给运维,运维直接安装你这个打包的“脚本”即可,所有的环境都是你本地正常运行的。
如果没看懂就粗浅的理解为:你用shell命令写了个脚本,下载jdk,配置环境变量、下载tomcat、部署你的程序等等这一套流程,然后交给运维,运维直接sh xxx.sh就完事了,环境什么的都是你给的,不会出现环境不一致的情况。你肯定有疑问:我虚拟机上有jdk了,你给我的脚本里再安装jdk肯定不行啊,容器化技术可以让资源隔离,互不影响。
4.2、对比虚拟机时代
虚拟化技术是物理硬件的隔离,容器化技术是app层面的隔离,两者不冲突。往往容器化时代都是基于虚拟机基础之上做的资源隔离。它可以基于虚拟机的操作系统部署多服务,不再需要额外安装操作系。
4.3、特点
标准化的迁移方式
那肯定啊,开发者将环境和程序打包给运维,运维直接执行就完事了。
统一的参数配置
废话,包都是开发者给的,开发者难道把一个应用程序打两个不同的包给运维?
自动化部署
应用集群监控
开发与运维之间的沟通桥梁
加粗了,自行体会。
二、什么是Docker?
Docker就是容器化技术的一种具体实现。基于Go语言开发。
加粗的一句话已经解释的明明白白了,不明白就等于没看懂上面的。
三、Docker的安装
基于Centos7的安装。
1、官方安装地址
https://docs.docker.com/engine/install/centos/
官方由于是国外的,所以不推荐,推荐下面的安装方式。
2、国内源安装
2.1、安装工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
device-mapper-persistent-data lvm2是干嘛的?
docker要想数据存储就必须要安装这两个,这两个是为了docker做数据存储用的。
2.2、添加源为国内
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.3、更新安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
2.4、验证是否安装成功
sudo service docker start
docker version
2.5、先爽一把helloworld
好不容易安装完了,先爽一把helloworld。
docker pull hello-world
docker run hello-world
四、更换镜像地址
需要更换镜像仓库地址为阿里云的。
1、啥意思
记得maven嘛?maven下载下来一般都会改配置文件,将其远程仓库地址改为阿里云的,docker其实也一样,如果把他比作maven的话,可以理解成从远程仓库(镜像仓库)拉取jar包(镜像文件),但是远程镜像仓库是国外的,所以需要换成国内的。
2、更换步骤
(1)打开网站
https://www.aliyun.com/
(2)搜索“容器镜像服务”
(3)点击“立即开通”
(4)点击“镜像加速器”
(5)执行命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
(6)大功告成
上面1-5步骤执行完成后就大功告成了,就可以用docker pull xxx
来测试下了,速度贼拉快。
五、Docker的基本概念
1、容器与镜像
1.1、镜像
镜像是只读的文件,提供了运行程序完整的软硬件资源,是应用程序的“集装箱”。
1.2、容器
容器是镜像的实例,由Docker负责创建,容器之间彼此隔离。
1.3、一句话概况
一个镜像可以创建多个容器,容器之间彼此隔离,互不影响。
2、仓库
2.1、本地仓库
存放了自己docker pull
下来的镜像。
2.2、远程仓库
存放了各种各样的镜像,docker pull
命令就是先去本地仓库检查是否有这个镜像,没有的话就去远程仓库拉取镜像放到本地仓库。镜像都是别人打包好的应用程序,只读。
docker远程仓库地址:https://hub.docker.com/
直接搜索就行,不用注册登录。
2.3、一句话概况
跟maven仓库的含义几乎一样。
3、Docker Daemon
用于管理镜像和容器,客户端发起docker run
的请求会交给docker daemon处理,docker daemon会给这个镜像开辟一个新的容器。再比如客户端发起docker pull
命令也是交给docker daemon,docker daemon去检查本地仓库有没有,本地仓库没有的话docker daemon去远程仓库拉取镜像放到本地仓库。
六、docker原理
1、描述
原理很简单,核心在于docker daemon,客户端所有的请求都会交给daemon处理,比如下图中的三个命令的完整执行流程是这样的:
1.1、docker build
client发送docker build
给docker daemon,docker daemon收到请求后会构建镜像放到本地仓库。
1.2、docker pull
client发送docker pull
命令给docker daemon,docker daemon收到命令后会优先检查本地仓库是否存在此镜像,若不存在则去远程仓库拉取镜像并放到本地仓库,若存在则不走远程仓库。
1.3、docker run
client发送docker run
命令给docker daemon,docker daemon收到命令后会启动一个新的容器,所以一个镜像可以有多个容器,只要我run一次就会产生一个新的容器出来。
2、图解
七、实战部署Tomcat
1、找镜像
(1)去远程仓库找镜像 https://hub.docker.com/
(2)
(3)一般带官方logo的,且名字就是官方名字的(比如tomcat),且start最高的,那就是正品。其他的可能都是个人的,个人的不靠谱。
(4)
2、安装tomcat
2.1、拉取镜像
docker pull tomcat
完整命令是:docker pull 镜像名<:tags> 从远程仓库拉取镜像。如果没写:tags则代表是latest版本。如下图
比如也可以拉取带tags的镜像
docker pull tomcat:8.5.55-jdk8-openjdk
这个tag是从如下地方获取的
2.2、查看镜像
docker images
2.3、启动容器
镜像有了该启动容器玩玩了。
docker run tomcat
完整命令是:docker run 镜像名<:tags> 这里没指定tag就代表是latest,
docker images
可以查看镜像tags等信息。
2.4、问题
我们已经装逼三连:docker pull
、docker images
、docker run
,将tomcat正常启动了,默认端口8080,问题来了,我怎么访问呢?它是在docker里的,不是我宿主机的8080端口,这就需要做一个端口映射。宿主机和docker启动的tomcat的端口映射。
2.5、端口映射
docker run -p 8000:8080 tomcat
也就是启动参数里多加个-p参数,-p参数用于端口映射,前面是宿主机端口,后面是容器端口。
2.6、测试
浏览器输入:http://localhost:8800
404?那是因为新版本tomcat将webapps下面的内容都删了,所以找不到了原来的index.jsp文件了。这又有问题了,我怎么进入我容器里的tomcat目录?比如看个log,找到webapps给他添加文件等操作。
2.7、进入容器里的tomcat
# 先用docker ps命令查看启动的容器
docker ps
# 进入容器的tomcat
docker exec -it ac1c3d62b75d /bin/bash
格式:docker exec [-it] 容器id 命令
exec:在对应容器中执行命令
-it:采用交互方式执行命令
执行ls -l
查看目录
可以看下webapps,里面空空如也。所以404,但是外层有一个webapps.dist
文件夹,这个文件夹是原有tomcat的主页面,我们可以删除webapps,然后mv命令将webapps.dist
改为webapps,等自动部署完在访问网页就正常了。
mv后tomcat部署稍微慢点,等1-2min,在访问就行。
2.8、怎么后台启动
现在问题:ctrl+c就结束进程了。
# -d 参数即可
docker run -p 8000:8080 -d tomcat
2.9、总结
以上步骤其实就干了这么几件事:
docker pull 镜像
docker run 镜像
-p 端口映射
-d 后台启动
docker exec -it 镜像id /bin/bash
八、常用命令总结
命令 | 解释 |
---|---|
docker pull 镜像名<:tags> | 从远程仓库拉取镜像到本地仓库 |
docker images | 查看本地仓库所有镜像 |
docker run 镜像名<:tags> | 基于镜像创建容器并启动,可以添加-d port1:port2参数,port1:宿主机端口,port2:容器端口, -d参数代表后台运行 |
docker ps | 查看当前所有启动的容器 |
docker ps -a | 查看本地所有容器,包含未启动的,删除容器的时候可用来查询容器id |
docker start/stop/restart 容器id | 启动/停止/重启容器 |
docker rm <-f> 容器id | 删除<-f:强制删除>容器,运行中的容器不能删除,-f可以强制 |
docker rmi <-f> 镜像名称 <:tags> | 删除<强制删除>镜像,镜像有容器在启动,不能被删除,-f可以强制 |
docker exec [-it] 容器id 命令 | 进入容器主目录,exec:在对应容器中执行命令,-it:采用交互方式执行命令 |
九、容器内部结构
1、内部结构
你jdk都没安装,怎么就能跑tomcat?tomcat容器内部包含了如下:
一个超级迷你的linux系统
jdk
tomcat
2、验证
先进入容器
docker exec -it ac1c3d62b75d /bin/bash
linux系统
执行
cat /proc/version
,可以发现带了个红帽系统
jdk
java -version
tomcat
这个还用验证?
十、容器原理
1、图解
2、总结
created -> running -> paused -> deleted
3、验证
docker create tomcat
# 查看容器状态,会发现是created
docker ps -a
docker start 8c4a21f47b8f
# 查看容器状态,会发现是up, up就对应running,代表运行中
docker ps
# docker stop命令会让容器进入exit状态,这个不等于paused,paused没有演示的必要。
docker stop 8c4a21f47b8f
# rm删除容器。也就对应deleted状态
docker rm 8c4a21f47bf
十一、docker总结
发现优点了没?
一个宿主机上或者虚拟机上启动N个docker,每个docker是一个tomcat,之前集群是多个虚拟机,或者宿主机,现在是一个虚拟机上开N个docker容器,然后映射不同的端口,牛逼。当然你会说负载均衡,挂了一个第二个还能支持,这种需要多台虚拟机的。但是也大大节省了资源消耗。虽然你一台机器也能改端口来完成,但是docker节省资源,而且资源隔离,N个容器之间彼此独立。
资源隔离,多个容器之间彼此不干扰。
环境统一,因为只要镜像的tag一样,那么启动的容器的环境都一致。牛逼!
下文我们将介绍:Dockerfile,欢迎关注
30分钟快速上手Docker,看这篇就对了!的更多相关文章
- 30 分钟快速入门 Docker 教程
原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 一.欢迎来到 Docker 世界 1. ...
- 30分钟快速掌握AngularJs
[后端人员耍前端系列]AngularJs篇:30分钟快速掌握AngularJs 一.前言 对于前端系列,自然少不了AngularJs的介绍了.在前面文章中,我们介绍了如何使用KnockoutJs来 ...
- 三分钟快速上手TensorFlow 2.0 (下)——模型的部署 、大规模训练、加速
前文:三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署 TensorFlow 模型导出 使用 SavedModel 完整导出模型 不仅包含参数的权值,还包含计算的流程(即计算 ...
- 三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署
本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 前文:三分钟快速上手TensorFlow 2.0 (上)——前置基础.模型建立与可视化 tf.train. ...
- 三分钟快速上手TensorFlow 2.0 (上)——前置基础、模型建立与可视化
本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 学习笔记类似提纲,具体细节参照上文链接 一些前置的基础 随机数 tf.random uniform(sha ...
- 【Microsoft Azure 的1024种玩法】一.一分钟快速上手搭建宝塔管理面板
简介 宝塔Linux面板是提升运维效率的服务器管理软件,其支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能.今天带大家一起学习的内容为一分钟快速上手搭建 ...
- 快速上手Ubuntu之安装篇——安装win7,Ubuntu16.04双系统【转】
本文转载自:http://blog.csdn.net/qq_28205153/article/details/52203512 Linux可以说是开发者的系统,对于开发者来说,Linux发行版不仅为我 ...
- AngularJS 30分钟快速入门【译】
引用自:http://www.revillweb.com/tutorials/angularjs-in-30-minutes-angularjs-tutorial/,翻译如下: 简介 我三年前开始使用 ...
- 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker
如果想在一台电脑上搭建一个多节点的Hadoop集群,传统的方式是使用多个虚拟机.但这种方式占用的资源比较多,一台笔记本能同时运行的虚拟机的数量是很有限的.这个时候我们可以使用Docker.Docker ...
随机推荐
- Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器
第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...
- js 函数的多图片预加载(preload) 带插件版完整解析
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS实现图片预加载效果 本篇文章写的 ...
- python 遍历, 获取目录下所有文件名和文件夹的方法-----os.walk(), os.listdir
http://www.runoob.com/python/os-walk.html https://www.cnblogs.com/dreamer-fish/p/3820625.html 转载于:ht ...
- nodejs操作MySQL,mysql连接池及事务的使用
https://blog.csdn.net/jasnet_u/article/details/88605168
- Fourier Transform
为了在统一框架里分析周期信号与非周期信号,可以给周期信号也建立傅里叶变换. 有两种方法求周期信号的傅里叶变换: **1. 利用傅里叶级数进行构造 ** 对于周期信号\(x(t)\),其傅里叶级数展开式 ...
- 图论--网络流--最大流--POJ 1698 Alice's Chance
Description Alice, a charming girl, have been dreaming of being a movie star for long. Her chances w ...
- JDK 配置环境变量
1.配置环境变量 右击 我的电脑 --> 属性 --> 高级系统设置 --> 高级 --> 环境变量 在系统变量里新建 JAVA_HOME 变量,变量值如下 D:\work_s ...
- python(random 模块)
一.Random 模块 注意:random() 是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法. 1.random.random() 返回随机生成的一个 ...
- Java——HTTP超详细总结
HTTP协议概述 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...
- B. Modulo Sum dp
https://codeforces.com/contest/577/problem/B 先读懂题意,substring 这个是子串说明不可以跳 subsequence这个是子序列可以跳 这个题目是一 ...