30分钟快速上手Docker,看这篇就对了!

Stella981
• 阅读 223

30分钟快速上手Docker,看这篇就对了!

一、历史演化

1、演化史

30分钟快速上手Docker,看这篇就对了!

2、物理机时代

2.1、图解

一个物理机上安装操作系统,然后直接运行我们的软件。也就是说你电脑上直接跑了一个软件,并没有开虚拟机什么的,资源极其浪费。

30分钟快速上手Docker,看这篇就对了!

2.2、缺点

  • 部署慢

  • 成本高

虚拟机都不开,直接上物理机部署应用,那成本能不高嘛

  • 资源浪费

硬件资源没有合理利用

  • 不易迁移和增加机器

每次迁移都要重新安装一模一样的运行环境等

  • 受限于硬件

3、虚拟机时代

3.1、图解

一个物理机上虚拟化出来多个虚拟机,每个虚拟机上进行安装操作系统,然后在虚拟机上直接运行我们的软件。比如阿里云、腾讯云等云服务器都是虚拟机。

30分钟快速上手Docker,看这篇就对了!

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 fastsudo yum -y install docker-ce

2.4、验证是否安装成功

sudo service docker startdocker version

2.5、先爽一把helloworld

好不容易安装完了,先爽一把helloworld。

docker pull hello-worlddocker run hello-world

30分钟快速上手Docker,看这篇就对了!

四、更换镜像地址

需要更换镜像仓库地址为阿里云的。

1、啥意思

记得maven嘛?maven下载下来一般都会改配置文件,将其远程仓库地址改为阿里云的,docker其实也一样,如果把他比作maven的话,可以理解成从远程仓库(镜像仓库)拉取jar包(镜像文件),但是远程镜像仓库是国外的,所以需要换成国内的。

2、更换步骤

(1)打开网站

https://www.aliyun.com/

(2)搜索“容器镜像服务”

30分钟快速上手Docker,看这篇就对了!

(3)点击“立即开通”

30分钟快速上手Docker,看这篇就对了!

(4)点击“镜像加速器”

30分钟快速上手Docker,看这篇就对了!

(5)执行命令

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo 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、图解

30分钟快速上手Docker,看这篇就对了!

七、实战部署Tomcat

1、找镜像

(1)去远程仓库找镜像 https://hub.docker.com/

(2)

30分钟快速上手Docker,看这篇就对了!

(3)一般带官方logo的,且名字就是官方名字的(比如tomcat),且start最高的,那就是正品。其他的可能都是个人的,个人的不靠谱。

30分钟快速上手Docker,看这篇就对了!

(4)

30分钟快速上手Docker,看这篇就对了!

2、安装tomcat

2.1、拉取镜像

docker pull tomcat

完整命令是:docker pull 镜像名<:tags> 从远程仓库拉取镜像。如果没写:tags则代表是latest版本。如下图

30分钟快速上手Docker,看这篇就对了!

比如也可以拉取带tags的镜像

docker pull tomcat:8.5.55-jdk8-openjdk

这个tag是从如下地方获取的

30分钟快速上手Docker,看这篇就对了!

2.2、查看镜像

docker images

2.3、启动容器

镜像有了该启动容器玩玩了。

docker run tomcat

完整命令是:docker run 镜像名<:tags> 这里没指定tag就代表是latest, docker images可以查看镜像tags等信息。

2.4、问题

我们已经装逼三连:docker pulldocker imagesdocker 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

30分钟快速上手Docker,看这篇就对了!

# 进入容器的tomcatdocker exec -it ac1c3d62b75d /bin/bash

格式:docker exec [-it] 容器id 命令

exec:在对应容器中执行命令

-it:采用交互方式执行命令

执行ls -l查看目录

30分钟快速上手Docker,看这篇就对了!

可以看下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,可以发现带了个红帽系统

30分钟快速上手Docker,看这篇就对了!

  • jdk

java -version

  • tomcat

这个还用验证?

十、容器原理

1、图解

30分钟快速上手Docker,看这篇就对了!

2、总结

created -> running -> paused -> deleted

3、验证

docker create tomcat# 查看容器状态,会发现是createddocker ps -a

30分钟快速上手Docker,看这篇就对了!

docker start 8c4a21f47b8f# 查看容器状态,会发现是up, up就对应running,代表运行中docker ps

30分钟快速上手Docker,看这篇就对了!

# docker stop命令会让容器进入exit状态,这个不等于paused,paused没有演示的必要。docker stop 8c4a21f47b8f



# rm删除容器。也就对应deleted状态docker rm 8c4a21f47bf

十一、docker总结

发现优点了没?

  • 一个宿主机上或者虚拟机上启动N个docker,每个docker是一个tomcat,之前集群是多个虚拟机,或者宿主机,现在是一个虚拟机上开N个docker容器,然后映射不同的端口,牛逼。当然你会说负载均衡,挂了一个第二个还能支持,这种需要多台虚拟机的。但是也大大节省了资源消耗。虽然你一台机器也能改端口来完成,但是docker节省资源,而且资源隔离,N个容器之间彼此独立。

  • 资源隔离,多个容器之间彼此不干扰。

  • 环境统一,因为只要镜像的tag一样,那么启动的容器的环境都一致。牛逼!

END

Java面试题专栏

【81期】面试官:说说HashMap 中的容量与扩容实现

【82期】面试中被问到SQL优化,看这篇就对了!

【83期】面试被问到了Redis和MongoDB的区别?看这里就对了

【84期】面试中设计模式能问些什么?比如说一下三种单例模式实现

【85期】谈谈Java面向对象设计的六大原则,中高级面试常问!

【86期】五个刁钻的String面试问题及解答

【87期】面试官问:Java序列化和反序列化为什么要实现Serializable接口

【88期】面试官问:你能说说 Spring 中,接口的bean是如何注入的吗?

【89期】面试官 5 连问一个 TCP 连接可以发多少个 HTTP 请求?

【90期】面试官:说一下使用 Redis 实现大规模的帖子浏览计数的思路

30分钟快速上手Docker,看这篇就对了!

我知道你 “在看”

本文分享自微信公众号 - Java知音(Java_friends)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
小森森 小森森
2个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本 欢迎添加左边的微信一起探讨!项目地址:](https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n) \2. Bug修复更新日历 2. 情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意), \ \ 和 注意
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Stella981 Stella981
1年前
Angular material mat
Icon Icon Name mat-icon code _add\_comment_ add comment icon <mat-icon> add\_comment</mat-icon> _attach\_file_ attach file icon <mat-icon> attach\_file</mat-icon> _attach\
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为