docker内部结构图:
平时部署项目其实不需要docker的,项目数量比较少的情况下,包括微服务出现后,很多时候使用微服务架构了,而且也用docker做部署,实际上现在很多公司做项目,不管项目多少,觉得docker和k8s就是微服务标配,个人觉得不然,因为具体架构根据项目大小来定,当然都是想先搭建微服务以后便于扩展(也对)。但是部署项目个人觉得不超过5个项目还是用原生的部署(如:tomcat、nohup java -jar xxx & 等形式)比较好,因为了解部署底层命令,不至于以后离开docker连基本命令都忘了。----仅限个人观点
先说说docker部署微服务简单结构原理,从上图中简单分为左中右三部分结构,以便后面描述清楚而划分。我们平常的服务器linux系统(物理机)、或者说本地装的vmware虚拟机这里简称宿主机。docker就安装宿主机里面简称docker-host ,在docker-host下面就是各种容器,如redis、nginx、rabitmq、mysql、我们的项目等这些简称为docker容器里面的服务,要想放在容器里面就需要构建镜像,docker对于常用的第三方服务都封装构建好了专属镜像文件,我们的项目要放容器里面就需要构建自己的镜像文件,如上图中间部分,每个容器都互相安全隔离,而且我们的项目也可以放在不同容器里面,最后如图左边部分,只需要三个命令便可完成项目部署,这也是docker受欢迎的原因,图右边为一些常用的第三方服务远程镜像,方便我们下载,相当于jar包依赖服务仓库一样,如:nexus 私服、阿里云仓库。。。
下载地址:docker镜像地址
一、docker中通过Dockerfile构建项目容器(项目镜像)
首先得准备好jar包(这里暂时简单验证项目jar包,后续提供微服务部署示例及问题点)
上图所示,1:为jar包在宿主机位置。2:为构建镜像需要的Dockerfile文件。3为准备的jar包。
打开Dockerfile文件看看内容;当前文件下的命令:vim Dockerfile
简单解释一下里面的内容:
from:基础镜像文件,项目本身需要java版本为8
add:添加文件,从src目录复制文件到容器的dest,其中 src可以是 Dockerfile所在目录的相对路径,也可以是一个 URL,还可以是一个压缩包
简单点说:宿主机里面名字是准备好的原来jar包名,复制到容器里面名字变为:app.jar
按照步骤这里暂时用下面命令查不出来,这个只有在构建之成功之后才可以查询出,为了清楚理解截图为下图,进入容器命令为:
docker exec -it 467f8fa851f7 /bin/bash
上图,标号1表示进入到容器里面的命令查询,出容器命令:exit; 。标号2表示构建成功后jar包的名字,可自定义,这里注意:Dockerfile里面准备的jar包名一定不能写错,不然构建时会找不到文件 。
expose:声明容器在运行时对外提供的服务端口,注意:这里请记住准备的jar里面的端口号,即:webtest-1.0-SNAPSHOT.jar 端口这里为8888
entrypoint:容器入口, ENTRYPOINT和 CMD指令的目的一样,都是指定 Docker容器启动时执行的命令,可多次设置,但只有最后一个有 效。看Dockerfile 该命令后的参数,是不是和原生运行jar包命令很像:java -jar xxx.jar
构建命令:docker build ‐t webtest:0.0.1 .
命令解释:后面项目名(自定义):版本号(自定义),这里千万记住版本号后面还有一个 .(空格+点)
如果理解了上面几个命令的作用,并且参数也配置正确,一般构建会成功,即没有error命令提示,或者说时每个步骤都成功,并且打印出日志信息。
二、运行docker容器并启动项目
命令:docker run -d -p 9999:8888 webtest:0.0.1
解释命令:9999为指定外部浏览器访问端口,即Dockerfile里面expose对应端口,8888为原生jar包里项目启动后访问的端口,前面也用红色标注做了提示,然后构建命令时的项目名称:版本号。
运行该命令后可以用:curl localhost:8761/index.html 先做一下内部访问,如果是原生项目响应结果,那么就说明外部可以访问了;如果说是下图:说明端口或者路径不对好及时做检查
这里为了演示错误示范,并没有使用示例上的端口9999,如:
错误运行发布:docker run -d -p 8761:8888 webtest:0.0.1
错误查询:curl localhost:8761/index.html
如果访问成功,说明外网也可以(注意端口正确对应9999,访问路劲检查index.html)
这里的localhost即192.168.1.66 为ifconfig 查询的宿主机地址,外网访问时ip为宿主机的ip,即当前linux系统的ip,可用:ifconfig查询,netmask 255.255.255.0 所对应的ip,这个根据具体外网访问配置情况而定。最后附图:
以上简单的对docker的构建、启动项目的示例,后续走微服务整体构建及部署。
看了本博客有疑虑的同僚请留言,不能及时回复的,谅解,谢谢留言探讨!