# 为什么要使用 Docker? |
作为一种新兴的虚拟化方式,`Docker` 跟传统的虚拟化方式相比具有众多的优势。 |
## 更高效的利用系统资源 |
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,`Docker` 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。 |
## 更快速的启动时间 |
传统的虚拟机技术启动应用服务往往需要数分钟,而 `Docker` 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。 |
## 一致的运行环境 |
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 `Docker` 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 *「这段代码在我机器上没问题啊」* 这类问题。 |
## 持续交付和部署 |
使用 `Docker` 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 [Dockerfile](../image/dockerfile/) 来进行镜像构建,并结合 [持续集成(ContinuousIntegration)](https://en.wikipedia.org/wiki/Continuous_integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 [持续部署(Continuous Delivery/Deployment)](https://en.wikipedia.org/wiki/Continuous_delivery) 系统进行自动部署。 |
而且使用 [`Dockerfile`](../image/build.md) 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。 |
## 更轻松的迁移 |
由于 `Docker` 确保了执行环境的一致性,使得应用的迁移更加容易。`Docker` 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。 |
## 更轻松的维护和扩展 |
`Docker` 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,`Docker` 团队同各个开源项目团队一起维护了一大批高质量的 [官方镜像](https://hub.docker.com/search/?type=image&image_filter=official),既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。 |
## 对比传统虚拟机总结 |
| 特性 | 容器 | 虚拟机 | |
| :--------| :--------| :----------| |
| 启动 | 秒级 | 分钟级 | |
| 硬盘使用 |一般为 `MB`|一般为 `GB`| |
| 性能 | 接近原生 | 弱于 | |
系统支持量 |
单机支持上千个容器 |
一般几十个 |
一、微服务架构介绍
通过将功能分解到各个离散的服务中以实现对解决方案的解耦。
你可以将其看作是在架构层次而非获取服务的
1、程序开发的角度:
把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
**2、定义:**围绕业务领域组件来创建应用,这些应用可独立地进行开发、管理和迭代。在分散的组件中使用云架构和平台式部署、管理和服务功能,使产品交付变得更加简单。
微服务(Microservice)这个概念是2012年出现的,作为加快Web和移动应用程序开发进程的一种方法,2014年开始受到各方的关注,而2015年,可以说是微服务的元年;
传统开发模式和微服务的区别:
传统开模式:
缺点:
1、效率低:开发都在同一个项目改代码,相互等待,冲突不断
2、维护难:代码功功能耦合在一起,新人不知道何从下手
3、不灵活:构建时间长,任何小修改都要重构整个项目,耗时
4、稳定性差:一个微小的问题,都可能导致整个应用挂掉
5、扩展性不够:无法满足高并发下的业务需求
基于微服务的开发模式:
1、一些列的独立的服务共同组成系统
1、一些列的独立的服务共同组成系统
2、单独部署,跑在自己的进程中
3、每个服务为独立的业务开发
4、分布式管理
5、非常强调隔离性
Java : 一次编译,到处运行 JVM Java虚拟机
Docker : 真正实现一次编译,到处运行
Docker 是一个开源的应用容器引擎,它基于 Google 公司推出的 Go 语言实现
让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
01、虚拟化容器技术-Docker简介
目标
了解虚拟化技术
概述
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网
络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更
好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指
的虚拟化资源包括计算能力和资料存储。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ArlD4Eh-1573219420311)(assets/1556260546266.png)]
(比如:vmware也是一个虚拟资源,大家都在使用vmware,大家都是在上面建立一个虚拟机,其实这就是一种虚拟化技术,或者半虚拟化技术,大家是不是使用vmware安装一个centos的系统或者安装一个windows的系统。那么你在上面操作其实和你在实体机上操作是不是比较类似,对吧,他们之间这种技术就是虚拟化技术。这种虚拟化技术它有一个小小的弊端,我们在我们的vmware上面创建了一个centos的虚拟机,它在使用的时候是以我当前的操作系统紧密相连的,简单点说,你的操作系统内存只有4G,你在创建虚拟机的时候你会分配8个G吗?说不能,说明虚拟机是依赖我们的当前的物理系统,它只不过是在之上构建了虚拟的系统,我们就可以使用它,这种其实就是一种半虚拟化技术。)
这种虚拟机技术,完全依赖底层的宿主机,每个虚拟机本身都是独立的,隔离的,每一个都有自己单独的内存,资源没有办法达到共享,资源达不到最大化的利用和使用。而docker和它不一样,它是共享的,大白话就是我的上面有docker容器可以共享我的资源,这个时候就会在宿主机上或者一台主机上,我可以部署很多个docker容器,他们是共享的 docker这种容器技术,给我们的开发和运维去做一个统一的环境,是非常非常好的,也是非常高效和快捷的。大家知道在真实的开发中,开发人员和与运维人员经常因为环境的问题出现故障和扯皮,这个是非常常见的纠纷,比如你在电脑上的环境都是你自己安装部署的,ok你开发完了运行没有任何问题,但是测试人员在测试的时候出问题了。为什么呢?因为它和你的环境不一样,比如你使用的是jdk1.8他使用的是1.7,常常因为各种版本的问题造成不必要的麻烦,而使用docker这个容器,首先他的第一件事情就是它能帮助我们统一运行环境。这样的话,这样的话能提高我们的开发效率,因为大家都使用的是同一个环境。所以说呀,docker以后在未来的开发环境中,用的越来越多,但是呢,docker在真正的学习过程中,它是有点偏运维方面。这也就是为什么现在招聘里面有一个职位叫:运维开发工程师
Docker和虚拟机形象比喻
什么是物理机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BWp7OwVU-1573219420311)(C:\Users\Arry\AppData\Roaming\Typora\typora-user-images\image-20191107184738575.png)]
什么是虚拟机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jGCaY0lt-1573219420314)(C:\Users\Arry\AppData\Roaming\Typora\typora-user-images\image-20191107184801679.png)]
什么是docker
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HPVSyVWo-1573219420316)(C:\Users\Arry\AppData\Roaming\Typora\typora-user-images\image-20191107184823656.png)]
03、虚拟化容器技术–什么是Docker
图例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QAnJdoO3-1573219420317)(assets/timg-1570839021079.jpg)]
一头鲸鱼通过身上的集装箱(Container)来将不同种类的货物进行隔离,而不是通过生出很多小鲸鱼来承运不同种类的货物。
Docker是一个开源的应用容器引擎,基于GO语言并遵从 Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的容器是完成使用沙箱机制,相互之间不会有任何接口重叠,更重要的容器性能开销极低。
04、虚拟化容器技术-- 什么镜像
远程仓库镜像地址
解释:镜像就像你下载了一个gz或zip压缩包。只不过这个镜像文件中意见包括了几个部分:
1:微型计算机(文件系统,网络)
2:当前镜像的文件,
比如你下载的tomcat,tomcat的镜像文件就包括了:
微型计算机 + Tomcat环境+Jdk环境 = Tomcat镜像
05、虚拟化容器技术-- 什么容器
什么是容器:就是镜像创建出来的一个运行的系统,与其说是系统还不如说,容器就是一个进程。
就好比你之前下载了tomcat就开始进行解压安装和运行。
01、当下Docker容器化技术的背景和支撑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0dAyiPfu-1573219420319)(C:\Users\Arry\AppData\Roaming\Typora\typora-user-images\image-20191107180105005.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJrh2jsZ-1573219420320)(C:\Users\Arry\AppData\Roaming\Typora\typora-user-images\image-20191107182009522.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B6ZWZWcp-1573219420320)(assets/1549786287808.png)]
06、虚拟化容器技术–Docker的安装
目标
掌握Docker的安装
环境
Linux环境中的Centos7.x以上版本 + 联网
步骤:
(1)yum 包更新到最新
> yum update
(2)安装依赖组件包,需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
> yum install -y yum-utils device-mapper-persistent-data lvm2
(3)设置yum源为阿里云 在哪里下载呢?
> yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)安装docker
> yum install docker-ce -y
(5)安装后查看docker版本
> docker -v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
07、虚拟化容器技术–设置ustc镜像源
目标
为了下载镜像更加快,可以配置docker镜像加速器
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
官方的镜像仓库: https://hub.docker.com/
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://0wrdwnn6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
5
6
7
8
08、虚拟化容器技术–Docker的启动与停止
目标
掌握docker的启动与停止等的常用命令
详细命令:
# 启动docker:
systemctl start docker
# 停止docker:
systemctl stop docker
# 重启docker:
systemctl restart docker
# 查看docker状态:
systemctl status docker
# 开机启动:
systemctl enable docker
systemctl unenable docker
# 查看docker概要信息
docker info
# 查看docker帮助文档
docker --help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
注意:systemctl命令是系统服务管理器指令
10、虚拟化容器技术–容器创建与启动容器
目标
掌握创建与启动容器的命令
详细操作:
1、查看镜像
docker images
1
2:拉取镜像
> docker pull 镜像的名字
# 比如
> docker pull tomcat
1
2
3
3:查看正在
项目部署和安装dockerUI整体步骤和流程*
docker 图形页面管理工具常用的有三种:
DockerUI
Portainer
Shipyard
DockerUI 是 Portainer 的前身,这三个工具通过docker api来获取管理的资源信息。平时我们常常对着shell对着这些命令行客户端,审美会很疲劳,如果有漂亮的图形化界面可以直观查看docker资源信息,也是非常方便的。今天我们就搭建单机版的三种常用图形页面管理工具。这三种图形化管理工具以Portainer最为受欢迎。
一. Portainer
1.查看dockerui Portainer镜像
docker search Portainer
1
2.选择喜欢的dockerui风格镜像,下载
docker pull docker.io/portainer/portainer
1
3. 启动UI
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test portainer/portainer
1
4:查看容器
docker ps -a
1
二. dockerUI
1.查看dockerUI镜像
docker search dockerui
1
2.选择喜欢的dockerui风格镜像,下载
docker pull abh1nav/dockerui
1
3. 启动UI
docker run -d --privileged --name dockerui -p 9001:9000 -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dockerui
1
4:查看容器
docker ps -a
1
掌握在docker内 tomcat的安装
第二步: https://hub.docker.com/search?q=&type=image
第三步:搜索 tomcat 找到 8.5.47-jdk8-openjdk
详细命令:
1、查看镜像
docker images
1
2、下载Tomcat镜像
#docker pull 镜像组件 比如:
> docker pull tomcat:8.5.47-jdk8-openjdk
1
2
3、创建tomcat容器
创建容器 -p表示地址映射
-v 是做宿主机和容器系统的目录映射,为什么要目录映射做,是因为:容器里的系统不能直接去上传文件。
docker run -di --name=mytomcat -p 8081:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:8.5.47-jdk8-openjdk
1
4、然后切入到/usr/local/webapps
> cd /usr/local/webapps
> rz 没有安装
> 安装 rz命令 yum install lrzsz -y
选择的war包即可
1
2
3
4
5
5、然后在浏览器通过 ip +8081端口访问
http://39.98.157.205:8081/Arry_WeiYun/weiyun.html
``
6、如果你想进入tomcat容器执行如下:
```properties
# docker exec 进入到容器系统内部 bash代表进入到当前容器的执行目录比如:tomcat就是直接进入到tomcat目录
> docker exec -it mytomcat bash
> cd webapps/
> ls
1
2
3
4
5
6
7
8
9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VH73bCC1-1573219420326)(C:\Users\Arry\AppData\Roaming\Typora\typora-user-images\image-20191107173449392.png)]
7、执行完毕可以使用UI镜像仓库,查看tomcat的状态
# 如果想退出容器到宿主机执行 exit
> exit