天天看点

阿里云serverless部署docker镜像

一:Docker

本质上就是容器

内容:我们可以在docker上挂载多个container容器,而这个容器可以放不同的内容:比如说springboot项目,前端项目,数据库向mysql,sqlserver,oracle,之前刚刚接触docker就是因为oracle安装一直有问题,使用docker去安装数据库可以通过几行命令就可以搞定,轻松快捷。

环境:docker可以在mac,linux,windows环境运行,受环境的影响较小。也就是说如果只有一套部署环境下,docker可以部署多个不同项目,且这些项目都是属于独立的,不受其他项目的影响,每个容器之间属于不关联的,不用担心一些软件端口冲突,这些容器共享一个操作系统。

优点:

1.迁移方便,如果需要将一个项目部署到另外一台环境,只需要将项目镜像save成一个tar包,直接在tar包放到一个有docker环境的系统中,docker环境也是很好搭建的,很快。在这docker环境中加载这个tar包即可,适合一些交付的项目。

2.版本迭代方便,如果需要更新版本,可将之间的容器停掉即可,生成一个新的版本的镜像再运行即可,如果需要回退版本的话,可以将新上的版本的容器停掉,运行上一个版本的容器即可。

3.一般来说,镜像占的内存并不多,主要是看镜像运行起来的项目占用的内存情况,就项目启动和容器来说,容器启动的时间是比较快的。

演示将springboot项目打包成镜像的过程

1.将项目打包成镜像

docker build -f /home/docker-TarPackage/test/Dockerfile -t test:0.0.2 .

解释:

docker build -f Dockerfile的文件位置 镜像名:版本号 .

2.查看镜像

docker images

3.利用镜像生成一个容器,并指定其对外端口号

docker run -p 8082:8080 test:0.0.1

解释

docker run -p 对外暴露端口:项目内部端口 镜像名:版本号

这个时候项目其实已经启动成功了,但是如果命令操作页面,容器会自动关闭

4.查看生成的容器

docker ps -a

5.启动对应的容器

docker start d2c1107efdc1

docker start 容器id

6.查看容器日志

docker logs d2c

docker logs 容器id

7.删除容器和镜像

docker rm 容器id

⚠️删除容器之前需要将容器stop,启动的容器是删除不了的

docker stop 容器id

docker rmi 镜像id

⚠️删除镜像之前需要删除对应的容器

8.如果需要将镜像拉出来去另外的docker环境中去运行需要将现有docker环境的image打成tar包即可

docker save test > /home/docker-TarPackage/test.tar

解释:docker save 镜像名 > 生成tar的地址/需要生成tar包的名称

9.将tar上传到另外的服务器上加载

docker load< /home/docker-TarPackage/test.tar

docker load< 生成tar的地址/tar包的名称

剩下的就是生成容器和启动的过程了,和上面描述的过程一样

Dockerfile 内容讲解

FROM java:8

指定基础镜像,其实就是一个jdk8的环境,这里的jdk其实也是一个基础镜像

VOLUME /tmp

这个是指定一个挂载目录,创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

ADD gem-fc-0.0.1-SNAPSHOT.jar app.jar

类似于copy,gem-fc-0.0.1-SNAPSHOT.jar是我们项目打成的jar包,名字要和项目jar保持一致,app.jar是在容器中的名字。功能就是把项目jar复制到容器当中

RUN bash -c ‘touch /app.jar’

这个就是启动容器中生成的app.jar的命令

EXPOSE 8080

指定容器要打开的端口,告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口,其实就是项目配置文件的端口号

ENTRYPOINT [“java”,"-Djava.security.egd=file:/dev/AES.java./urandom","-jar","/app.jar"]

ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/urandom” 作为 Entropy Source

总结:

VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。改步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录

项目的 jar 文件作为 “app.jar” 添加到容器的

ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/urandom” 作为 Entropy Source

二.阿里云Serverless

sae我之前测试的是基于docker镜像部署的,实质上他是支持镜像,war包和jar包部署

我觉得sae部署好处在于减少运维压力,只需要把镜像放上去直接部署就行,不需要关注服务器方面的事情,因为那些sae已经做过了,还有就是减少成本人力,sae有的是按照项目启动的时间收费的。

阿里云serverless镜像部署前提是需要把服务器上打包的镜像上传到阿里云

1.登陆阿里云

2.找到容器镜像服务并创建命名空间

3. 随后创建镜像仓库

4.使用的代码源是本地仓库的

5.登陆阿里云docker

sudo docker login --us[email protected] registry.cn-shanghai.aliyuncs.com

密码需要在访问凭证中设置固定密码

演示

6.先查看docker中有哪些镜像

docker images

7.给镜像设置标签

docker tag f03ec99cd2a2 registry.cn-shanghai.aliyuncs.com/gemdev/test:v0.0.1

解释

Docker tag 镜像id 仓库地址/命名空间/仓库名称 :版本号

8.将镜像推送到阿里云仓库

docker push registry.cn-shanghai.aliyuncs.com/gemdev/test:v0.0.1

解释

Docker push 仓库地址/命名空间/仓库名称 :版本号

9.推送成功,查看仓库的镜像版本

10.上传完以后可以把本地镜像删除,拉取阿里云镜像测试一下

后面就是进行serverless部署镜像了

1.登陆Serverless应用引擎SAE

2.创建应用

需要提前配置好安全组

阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。

3.应用配置部署

这里可以选择部署的方式和应用的类型

部署方式分为docker镜像,war包部署,jar包部署

应用类型分为java,php,还有其他

如果选择镜像部署

镜像部署的来源也分多种:

1)自己私有的阿里云镜像

这个就是由本地服务器上传到阿里云镜像库中的镜像

2)Demo镜像

这个是阿里云为了给初学者测试的一些demo镜像

3)公有镜像

这个是存在其他的镜像仓库的镜像,要保证公网可以拉取到这些镜像即可

4)其他阿里云帐号私有镜像

选择我的阿里云镜像,然后选择对应的仓库命名空间和仓库名,然后在这个仓库中选择想要部署的镜像版本即可

1.启动命令设置

这个就等同于生成镜像中的DockerFile里面的ENTRYPOINT属性

也就是容器的启动命令

由于Docker运行时仅支持一条ENTRYPOINT命令,所以SAE控制台中设置的启动命令,将会覆盖制作应用容器Docker镜像时Dockerfile中所设置的ENTRYPOINT

如果不属于这些命令,建议不要改

2.环境变量设置

这个是为了设置容器环境的一些环境变量,可以去自定义一些变量名称和变量值,也可以提前配好

配置完成以后点击完成,应用会重启,重启完以后环境变量就会生效

3.Host绑定设置

这个是使用域名绑定ip,部署完成以后通过域名访问,这个我没试过

4.应用健康检查设置

分http请求 tcp请求 执行命令检查

HTTP请求检查:通过向实例发送HTTP请求检查健康情况。通过HTTP访问获得的HTTP状态码位于[200,399]之间,则认为访问成功,实例健康;否则认为失败,实例不健康。

TCP端口检查:通过向实例发送一个TCP Socket来检查实例的健康情况。如果可以建立连接,则认为实例健康;如果连接失败,则认为不健康。

执行命令检查:通过在实例中执行探针检测命令来检查实例的健康情况。如果执行命令后返回的状态码为0,则认为执行成功,实例健康;如果不为0,则认为执行失败,实例不健康

后面这些阿里云文档上都有,就不多解释了

4.确实规格-确认创建

5.可以查看变更记录查看应用是否部署完成

这样就属于部署完成

6.可以去日志管理中查看实时日志

查看是否有报错情况,如果没有,就进行下一步的发布了

7.去应用的基本信息中查看

可以选择访问地址,我之前试过私网访问,一直访问不了,后来选择了公网访问的方式

8.添加公网slb访问

9.选择tcp协议,填写slb端口和容器端口

slb端口可以自定义,容器端口要和容器中项目端口号保持一直,不然会导致,发布成功以后,访问不了其地址。

10.发布完成以后,查看变更记录,如果变更完成以后,应用详情页面会生成一个公网的访问地址+端口号,访问地址+端口号+方法地址即可

11.访问

12。删除应用需要先将应用停掉,然后才能删除应用。

缺点:部署在阿里云sae上有时候会和一些端口有冲突,就像之前的邮箱服务,修改端口号也登陆不了网易云邮箱。这个还需进一步研究,毕竟阿里云sae和linux服务器有些配置可能不一样。