热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

传统项目的容器化及上线至Rancher应用商店的完整流程

实现效果:大体步骤:往Harbor上传相关的镜像在GitLab上传一个文件夹,文件夹包括

应用场景

写完了项目的代码,怎么将整个项目容器化?怎么让运行前端、后端、数据库等服务作为一个整体,通过页面轻轻松松地部署?

实现效果:

在Rancher页面上自己定义的应用商店里找到自己的应用图标,点击进入启动页面,配置一下信息,然后点击启动就可以把整个项目部署完,包括前端、后端、数据库等。

用Rancher的好处还有很多,比如可以页面上对容器进行重启、升级、删除等,还可以查看容器的日志。

下面是一些Rancher自带的应用,这些应用都是可以页面部署到机器上的。

大体步骤:
  1. 制作镜像,往镜像库harbor(Rancher能访问到的)上传相关的镜像;

  2. 在GitLab上传一个文件夹,文件夹包括docker-compose.yml文件、rancher-compose文件、一张svg图片,一个config.yml文件;

  3. 在Rancher上部署该应用。

具体过程:

一、制作镜像,上传镜像到镜像库

1. 生成jar包

(1) 首先在将工程配置文件中mysql的具体IP改成变量,为了动态地获取mysql的IP地址。

(2) 然后在工程目录下执行(这里用maven编译):

1mvn -DskipTests install

(3)生成的jar包在该工程的target目录下。

2. 写dockerfile

执行命令生成镜像(jar包和dockerfile放在同一个文件夹下;下面命令最后的点表示Dockerfile所在目录;双引号里为自定义的镜像名和镜像版本号):

1sudo docker build -t="ip:port/fileName/imageName:tag" .

解释:
为什么给镜像加上ip/fileName前缀,是为了更方便传到harbor,镜像名前半部分的ip是为了识别上传的时候传到哪里,fileName是为了识别传到Harbor上Project下的哪个文件夹。

3. 上传到harbor

(1) 登录harbor
先在宿主机配置daemon.json文件

1sudo vim /etc/docker/daemon.json

然后加上(自己把Harbor的IP、端口号添上,多个harbor中间用逗号隔开):

1{
2  "insecure-registries": ["harobrIp1:port1","harborIp2:port2"],
3  "registry-mirrors": ["https://registry.docker-cn.com"]
4}

保存,退出。然后:

1sudo systemctl daemon-reload
2sudo systemctl restart docker.service

通过命令行登录harbor

1sudo docker login harborIp:port

然后输入用户名和密码。

(2) push到harbor(以springappserver镜像为例,其它类似)

1sudo docker push harborIp:port/lamppole/springappserver:2018-06-05

二、准备Rancher的template

1. 写docker-compose.yml和 rancher-compose.yml等文件

(1) docker-compose.yml文件:

1version: '2'
2services:
3  mysql:
4    image: harborIp:port/lamppole/mysql:5.7
5    restart: always
6    ports:
7        - "3306:3306"
8    environment:
9        - MYSQL_ROOT_PASSWORD=rootPassword
10      - MYSQL_USER=userName
11      - MYSQL_PASSWORD=password
12      - MYSQL_DATABASE=databaseName
13  springappserver:
14    image: harbor:port/lamppole/springappserver:2018-06-05
15    restart: always
16    links:
17       - mysql:lamppole-mysql
18    ports:
19       - "8090:8090"
20  ngnix:
21    image: nginx
22    restart: always
23    ports:
24       - "8080:80"

解释:

  • environment下: 设置了mysql的root用户的密码,并创建了一个新的用户,设置了新用户的密码,同时创建了一个数据库;

  • link: 这里的springserver链接到mysql;

  • restart: 设置为alway时,如果容器退出,会自动重启;

(2) rancher-compose.yml文件:


1version: '2'
2.catalog:
3  name: "xxx"
4  version: "v1.0"
5  description: ""
6  questions:
7    - variable: "server_port1"
8      description: "server_port1"
9      label: "后端服务端口"
10      type: "int"
11      defualt: 8090
12      required: true
13  services:
14    mysql:
15      scale: 1
16      start_on_create: true
17    server:
18      scale: 1
19      start_on_create: true
20    nginx:
21      scale: 1
22      start_on_create: true

解释:

  • 第一个version是指compose格式的版本,第二个版本是我们自定义的应用的版本,到时可以在Rancher的页面上选择不同的版本。

  • questions下面是一些到时要在Rancher上配置的信息,这里要配置的是后端服务端口。这里的required为true,所以如果到时没有配置会弹出提示。

  • services下面就是我们要部署的三个服务:mysql、server和nginx(其实这个nginx我是给后面部署前端工程准备的)。

(3) config.yml文件

1name: "lamppole"
2description: "xxx项目平台"
3version: "v0.1"
4category: Experiment
5maintainer: 李想妮
6labels:
7  io.rancher.certified: Allblue


解释:config文件里设置的信息到时会在应用商店的图标上显示:


  • 1为配置文件里的name

  • 2为description

  • 3为io.rancher.certified的值

  • 4为svg图片

(4) 准备一张后缀为svg的图片,作为该应用在Rancher应用商店上的图标。
(5) 把上面的文件按照一定的规则放在文件夹里。

说明:

  • lamppole为上传到GitLab上的文件夹,上传后放在某个catalog的templates文件夹下;

  • 把docker-compose.yml文件和rancher-compose.yml文件放在项目文件夹lamppole下以正整数命名的文件夹下。数字文件夹按照不同的版本,从0开始,如果想放新的应用版本,下一次就加上一个以“1”命令的文件夹,放上同样的文件。

  • config.yml文件和svg图片放在数字文件夹外面,项目lamppole文件夹下。

2. 上传到GitLab

(1) 在本地新建一个空的文件夹,然后

1git init
2git remote add origin  http://gitLabIp:port/xxx/xxx-catalog.git
3git pull origin master

(2) 然后把本地的lamppole文件夹放到pull下来的templates文件夹下,然后

1git add templates/lamppole/
2git commit -m "添加xxx的template"
3git push origin master

三、在Rancher上部署

1. 登录Rancher

登录Rancher,输入用户名和密码。

2. 添加主机,如果已经添加可以不用

基础架构-->主机-->添加主机

填上宿主机IP后,点复制按钮将命令行copy到该IP的机器上执行。

注:实际上就是在机器上运行一个rancher-agent容器,如果没有这个agent, Rancher和运行该应用的机器之间无法通信。

3. 添加(或更新)自己的应用商店

在某个测试环境下,选择系统管理-->添加应用商店-->填入信息-->保存

4. 在上一步自定义的应用商店下找到lamppole应用

选择版本-->填写端口-->点击启动按钮启动:

这时应用就部署好了,在Rancher的应用里可以找到部署好的服务

在该宿主机上也能看到启动的容器了。


P.S. 到这里,虽然我还没把前端的代码部署上去(因为文章写到这的时候我还没拿到前端的代码或者dist文件夹),但是已经体现了完整的上线流程了。

补充:

1. 想升级服务怎么办?

重新制作一个镜像,给镜像不同的版本号,然后上传到镜像库,接着在Rancher页面上针对需要升级的服务进行点击升级,修改镜像名即可。(这种方法是升级多少个服务就得做多少遍这个步骤)

2. 如果想提供多个应用版本给用户部署的时候选择怎么办?

(1) 准备好相应的镜像
(2) 往GitLab的templates的该项目文件夹下添加数字文件夹,数字文件夹的命名按正整数递增;
(3) 把数据文件夹里docker-compose.yml文件夹下的镜像改成不同版本的,把rancher-compose.yml的应用版本号也改了。

注:如果在GitLab上添加了新的版本文件夹及文件,Rancher还会自动提示“有可用更新”,告诉你有新的版本了。(这种做法是整个应用升级,包括这个应用里所有在docker-compose.yml文件里修改了镜像的服务)

3. 怎么部署前端

这里用到nginx,把前端打包好的dist静态资源文件放在nginx的一个目录下,然后在nginx的配置文件nginx.conf或者default.conf里配置dist文件的地址和一些端口之类的信息。

步骤
(1) 将前端工程打包出一个存放着静态文件的dist的文件夹(Java工程用jar包做镜像,前端用的是dist文件夹);

(2) 将dist拷贝到nginx容器的某个目录下,然后在nginx.conf配置;

(3) 通过配置好的nginx容器制作镜像。

具体做法:
1.生成dist文件夹
dist其实是distribution的意思,文件夹里是用于发行的文件。
(1) 安装node环境(MacOS系统)

1brew install node

(2) 安装webpack

1// 4以上的版本可能会遇到各种问题,我这里用的是3.5.1版本的
2npm install webpack@3.5.1 -g

(3) 生成依赖

1npm install

执行完这条命令后,工程目录下会多一个node_modules的文件夹,里面是各种依赖。
(4) 打开生成dist文件夹

1webpack

成功执行完后,工程目录下就会多了一个dist文件夹。
2.将dist文件夹拷到容器里

1sudo docker cp 主机目录  容器ID:容器里的某个目录

3.修改nginx.conf文件
nginx.conf文件在容器里的/etc/nginx目录下。
下面的配置信息只是默认配置里的一部分。因为主要是配置server里的内容,其它的按默认的就行。

1#user  nobody;
2worker_processes  1;
3#error_log  logs/error.log;
4#error_log  logs/error.log  notice;
5#error_log  logs/error.log  info;
6#pid        logs/nginx.pid;
7events {
8    worker_connections  1024;
9}
10http {
11    include       mime.types;
12    default_type  application/octet-stream;
13    sendfile        on;
14    server {
15        # 设置端口
16        listen       80;
17        # 设置域名
18        server_name  localhost;
19        #charset koi8-r;
20        #access_log  logs/host.access.log  main;
21        location / {
22            # root后面是容器里dist文件夹的绝对路径
23            root   /var/tmp/lamppole/dist;
24            index  /page/index.html;;
25        }
26        error_page   500 502 503 504  /50x.html;
27        location = /50x.html {
28            root   html;
29        }
30    }
31}

也可以在/etc/nginx/conf.d下的default.conf文件中配置,因为nginx.conf文件include了default.conf文件的内容,因为defualt.conf里只写server的内容,这些内容会成为nginx.conf的一部分。
4.重载nginx配置文件

1// 在容器里执行
2nginx -s reload

这时用浏览器打开就可以看到前端的页面了,不需要退出容器(当然退出也没问题),也不需要重启容器。
5.通过这个容器制作新的镜像

1sudo docker commit 容器ID 镜像名:版本号

接下来用这个镜像就可以启动前端的服务了,无需再重复上面的步骤。

附加:

关于数据库的一些问题:

  1. 要给数据库增加新的表,我需要给MySQL制作新的镜像吗?
    答:不用。通过Docker启动的数据库仍然可以像非容器启动的一样通过Navicat等工具去操作数据库,只要连接上了。

  2. 现在只是在启动MySQL容器的时候通过启动命令创建了数据库和用户,但是为什么MySQL能自动创建表?

    答:因为后端关联了MySQL,运行后端代码后会自动建表,但自动建表功能一般是开发的时候用,真正部署的时候,代码自动建表会关掉。到时通过Docker启动命令创建的数据库就是一个没有表的数据库!但是我们仍然有方法可以把原来的数据给拿过来使用。
    步骤:
    (1) 先通过Navicat或者其它方式导入原数据库的“表结构+数据”,以sql为后缀命名该文件;
    (2)然后拷贝到容器里
    格式:
    sudo docker cp host_path containerID:container_path
    例如:

1sudo docker cp /xxx/xxx/xxx.sql a41ba44af0bd:/opt

(3) 进入容器里,登录MySQL(MYSQL_USER、MYSQL_DATABASE和MYSQL_PASSWORD是在docker-compose.yml文件里设置的用户名、密码和创建的数据库名称)

1sudo docker exec -it 容器ID /bin/bash
2mysql -u MYSQL_USER -p
3// 输入在启动命令里设置的密码MYSQL_PASSWORD
4use MYSQL_DATABASE
5source /opt/xxx.sql

这是数据已经放到容器里了。其实也可以通过把这个放了数据的容器反制作成镜像,这样今后用这个镜像启动的容器就直接带有这个sql文件了。
容器制作成镜像也很简单:

  • 安装 Lua 语言环境(安装过就直接跳过这步):

1$ sudo yum update -y && apt-get install -y luajit luarocks

  • 生成镜像:

1$ sudo docker commit 容器ID lamppole_mysql:5.7

  1. 原来用的是非容器启动的数据库,上面已经有数据了,而且该数据库部署在别的机器上,现在通过容器启动的是一个新的数据库,它没有数据,但是我还想用回原来的数据库和数据怎么办?
    答:可以不使用通过Docker启动MySQL,直接用原来的数据库,其它的服务仍使用Docker启动。只是后端代码配置数据库的时候要用过原来的MySQL的IP,而且启动后端容器的时候也不需要用--link参数去关联MySQL了。



推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
author-avatar
手机用户2502916591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有