文章目录
关于Docker:Docker简介Docker优势Docker的基本组成 Docker安装:Springboot项目部署到Docker实现局域网内多台电脑可以访问关于Docker:
Docker简介
为什么要有Docker:
假定您在开发一个一个项目,您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。此外,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。您希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销。请问?
您要如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?
答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。
环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
Before
之前在服务器配置一个应用的运行环境,要安装各种软件,举例一个项目的环境来说,Java/RabbitMQ/MySQL/JDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 Windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。
After
Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作
。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”
。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
。
·解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。
容器发展简史(下图)
Docker优势
更快速的应用交付和部署
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
更便捷的升级和扩缩容
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
Docker的基本组成
镜像(image)
Docker 镜像(Image)就是一个只读
的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器
。(一个类对象可以通过多次new 创建多个实例对象)
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象
。
·容器(container)
从面向对象角度
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例
。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
从镜像容器角度
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库(Repository)是集中存放镜像
文件的场所。
类似于
Maven仓库,存放各种jar包的地方;
github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub
(/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
·总结
需要正确的理解仓库/镜像/容器这几个概念:
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
镜像文件
image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
容器实例
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
仓库
就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
Docker平台架构
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
Docker安装:
前提条件
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,
要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x
查看自己的内核
uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。
·确定你是CentOS7及以上版本
cat /etc/redhat-release
·卸载旧版本
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
·CentOS7能上外网, ping通百度测试
·yum安装gcc相关
yum -y install gccyum -y install gcc-c++
·安装需要的软件包
yum install -y yum-utils
踩坑点
官网上推荐的是国外的仓库可能会出现
报错:
1 [Errno 14] curl#35 - TCP connection reset by peer
2 [Errno 12] curl#35 - Timeout
推荐使用阿里云
yum-config-manager --add-repo /docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
·安装 Docker Engine
yum -y install docker-ce docker-ce-cli containerd.io
·启动docker
systemctl start docker
·测试
docker version
docker的服务端和客户端
卸载docker
systemctl stop dockeryum remove docker-ce docker-ce-cli containerd.iorm -rf /var/lib/dockerrm -rf /var/lib/containerd
阿里云镜像加速
·粘贴脚本直接执行
·直接粘
mkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://aa25jngu."]}EOF
·重启服务器
systemctl daemon-reloadsystemctl restart docker
参考来自周阳老师的版Docker实战教程/video/BV1gr4y1U7CY?p=1&vd_source=2310ca86b708440c01f9ed0d135158f3
Springboot项目部署到Docker
要求条件
1.idea创建的没有错误的springboot项目 2.安装好docker环境的linux服务器 centos7 3.xshell工具
打包springboot项目
使用idea工具进行打包
打开target所在目录可以看到打包完成
使用xshell连接上centos
在自定的目录下创建 dockerFile文件夹
进入到dockerFile文件夹
通过lrzsz上传jar包到虚拟机
创建Dockerfile文件文件名必须为Dockerfile,不能是其他名称
现在dockerFile文件夹下存在两个文件
编辑Dockerfile文件 :命令 vi Dockerfile
#基于java镜像创建新镜像FROM java:8# 作者MAINTAINER pg_13#开放8081端口EXPOSE 8081#规定时区等环境ENV TZ=Asia/ShanghaiRUN ln -sf /usr/share/zoneinfo/{TZ} /etc/localtime &&echo "{TZ}" > /etc/timezone# 将jar包添加到容器中并更名为datascreen.jarADD springboot_08_datascreen-0.0.1-SNAPSHOT.jar /datascreen.jar# 运行jar包RUN bash -c 'touch /datascreen.jar'ENTRYPOINT ["java","-jar","/datascreen.jar"]~
完成后按esc,然后按Shift+: 输入命令wq 保存退出。
**制作docker镜像**
编辑好Dockerfile文件保存后,在当前文件夹输入命令
docker build -f Dockerfile -t datascreen:v1.0 .
(datascreen:v1.0表示镜像名称,可以自己输入其他的。命令后面的 . 不能省略
)
输入命令,回车后,出现如下界面,表示镜像制作成功
入命令 docker images查看镜像
可以看到镜像制作成功。
创建容器,运行springboot项目制作的镜像
输入命令:
// -d表示后台运行
-p后面有两个端口,分别是:宿主机端口(也就是当前虚拟机):容器端口
datascreen 表示你的容器名称
datascreen:v1.0 表示容器使用的哪个镜像
-p 是做端口映射,此时将服务器中的8080端口映射到容器中的8081(server.port=8081)项目中端口配置的是8081)端口
docker run -d -p 8080:8081 --name=datascreen datascreen:v1.0
输入该命令后,回车,即完成了springboot在docker上的部署
浏览器验证:(虚拟机ip加上端口)
部署多个节点(可以8081和8082端口访问)
docker run -d -p 8081:8081 --name=datascreen1 datascreen:v1.0
docker run -d -p 8082:8081 --name=datascreen2 datascreen:v1.0
实现局域网内多台电脑可以访问
在虚拟网络编辑里 点击NAT设置做端口转发
在上面我们已经将服务器中的8080端口映射到容器中的8081,简单来说就是项目中端口配置的是8081端口,但是我们可以通过服务器ip+8080端口进行访问springboot项目,
在这步我们将主机80端口映射到虚拟机8080端口,我们直接访问自己的ip(默认会加上80端口)就可以实现虚拟机加8080端口的效果,一样可以访问到springboot项目
让局域网的人都能访问到该项目
打开windows防火墙 点击高级设置
新建一个入站规则
选择特定本地端口,填写80
然后一直下一步 填写名称和描述就完成了
测试的话可以用同一个局域网
下的机子 访问该机子的ip(默认加80端口)
就可以访问到centos7上docker上部署的springboot项目了
docker简介和安装(阿里云加速)以及Springboot项目部署docker 实现局域网下同时访问项目(详细过程)