从Docker 到Jenkins 到Ansible的部署经验

工作中,除了开发功能,还负责系统的部署工作。我从频繁的部署工作中,逐渐找到了一些偷懒的方法。从传统的Java -jar命令启动服务,到通过Docker 容器构建部署服务,再后来通过自动化部署工具Jenkins来完成部署,最后再结合Ansible完成远程部署。一步步的进步极大的减少部署工作,提高了工作效率(增加了许多划水时间)。

Docker

简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker给我的印象很深,没有什么环境是docker pull 解决不了的,

常用命令

docker ps           , docker ps 默认显示运行中的容器,-a 显示所有,-l显示近期创建的容器docker start xxx    , 启动xxx容器docker restart xxx  , 重启xxx容器docker run xxx      , 创建并运行xxx容器docker build -t xxx .   ,使用 Dockerfile 创建镜像docker stop xxx     , 关闭容器docker rm xxx       , 删除容器docker images       , 查看所有镜像docker rmi xxx      , 删除xxx镜像docker exec -it xxx sh          , 进入xxx容器中,用quit退出docker logs -f xxx --tail 500   , 查看xxx容器的日志,显示最后500行,常用命令docker inspect xxxx             , 查看容器配置信息docker-compose -f app.yml up -d , 按照app.yml文件配置以debug形式启动docker-compose -f app.yml down  , 按照app.yml文件配置形式关闭

使用场景

第一步:在gradle项目加入docker插件,即在gradle.build 文件中加入以下代码。需要注意的有插件的版本,项目打包后的名称,Dockerfile文件目录

dependencies {classpath("se.transmode.gradle:gradle-docker:1.2")
}apply plugin: 'docker'task buildDocker(type: Docker, dependsOn: build) {push = falseapplicationName = "项目名"dockerfile = file('src/main/docker/Dockerfile文件目录')doFirst {copy {from jarinto stageDir}}
}

第二步:创建Dockerfile文件,文件目录要和第一步中设置的保持一致。需要配置jdk镜像和基本的启动参数

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD 项目jar名称.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENV PORT="6666"
ENV DB_CONNECTION="jdbc:mysql://ip:port/database"
ENV DB_USER="user"
ENV DB_PASSWORD="password"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar --spring.datasource.url=$DB_CONNECTION --spring.datasource.usernam=$DB_USER --spring.datasource.password=$DB_PASSWORD --port=$PORT"]

第三步:将jar拷贝到服务器上,然后执行编译,运行的docker命令

一)、通过gradle的bootJar,将项目打包。同时需要把引入的第三方jar也要一起打入到项目jar中。

二)、Windows系统中可以通过Xftp将jar和Dockerfile文件拷贝同一个目录下。Linux系统可以通过scp命令上传文件。

三)、执行docker ps,查看当前运行的容器,执行docker stop和docker rm 关闭和删除之前旧版本的容器

四)、找到jar的目录,并在当前目录下,执行 docker build -t 镜像名称 . 的命令编译项目,注意后面的点不要漏了。

五)、编译成功后执行 docker run --name 容器名 -v /tmp:/tmp -p 对外开发的端口:项目启动的端口 镜像名:latest 。启动容器

六)、执行docker ps,查看容器启动是否正常启动。同时执行docker logs -f 容器名 --tail 500,查看容器启动日志,检查是否有异常

七)、最后浏览器访问一下,已确保部署成功。

全称大概需要几分钟的时间,虽然不算麻烦。可次数多了,就很麻烦了。有没有什么好的工具帮助我们完成这一系列操作呢?答案是肯定的。

Jenkins

简介

The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.

Jenkins 的logo是一个管家的形象,很贴切。对它的理解比较肤浅。他通过管理Git上的项目,来确保每次打包的jar都是最新的。同时在构建成功后执行我们输入的shell命令,来达到自动化部署的工作。

使用场景

第一步:创建一个负责编译的Jenkins项目,

在Jenkins控制台页面,点击页面左上角的“新建”按钮。再输入项目名后,可以选择创建一个空项目,也可以在页面最下面选择copy from 其他项目。不管如何创建,我们需要Jenkins管理项目的源码,构建和构建后的操作。


第二步:创建一个负责运行的Jenkins项目

以同样的方式创建项目,在构建触发器上,选择第一步创建的项目,构建的Shell命令是先删除之前的容器,然后在重新运行容器。若之前的容器不存在,则会构建失败。所以第一次构建的时候把第一行命令删掉。解决方案傻乎乎的,只是因为没有花时间去处理。


第三步:选择编译项目,点击立即构建,当第一个项目构成成功后,会自动触发运行项目。等待两个项目都成功后,就可以访问浏览器,检查功能。

有了Jenkins,一切变得轻松很多。但他也有一个较大的弊端,就是使用前必须要先安装。特别是在客户的服务器上,也许别人就只跑这一个服务,你给别人整了一个Jenkins,似乎有点大材小用了。有没有好的解决方法?答案是肯定的。

Ansible

简介

Ansible is an IT automation tool. It can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates.

从接触到使用Ansible大概有一天的时间,对它的理解也是比较肤浅。我单纯的认为,他可以帮助我们在服务器之间传输文件,同时还可以执行一些shell命令。抱着这样的想法,我们可以通过Jenkins完成自动化编译,再通过Ansible传输资源文件到部署的环境中,同时执行启动Shell命令。

安装Ansible

官网地址

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

使用场景

第一步:修改Jenkins运行项目的构建Shell,将之前的docker run改成

ansible-playbook ansible命令文件路径/app.yaml

第二步:创建Ansible脚本文件app.yaml,目录和第一步中设置的保存一致,模版大致如下

- hosts: '需要部署的远程服务ip'tasks:- name: "关闭旧版本的容器"shell: docker stop xxxignore_errors: true- name: "删除旧版本的容器"shell: docker rm xxxignore_errors: true- name: "删除之前的旧文件"shell: rm -rf /旧文件路径/*- name: "传输Dockerfile文件"copy:src=/文件目录/Dockerfiledest=/远程服务指定目录- name: "传输Jar文件"copy:src=/jar目录/xxx.jardest=/远程服务指定目录- name: "构建docker 镜像"shell: chdir=/jar所在目录 nohup docker build -t 镜像名 .- name: "启动容器"shell: nohup docker run --name 容器名 -v /挂载路径/:/挂载路径/ -p 对外端口:服务端口 -d 镜像名:latest

第三步:调试是否能通过ansible连同远程服务器

sudo vim /etc/ansible/ansible.cfg
# 打开注释
inventory = /etc/ansible/hosts
host_key_checking = Falsesudo vim /etc/ansible/hosts
# 添加内容
ip ansible_ssh_user=xxx ansible_ssh_pass=xxx# 检查是否连同
$ ansible -m ping all
ip | SUCCESS => {"changed": false, "ping": "pong"
}

第四步:在Jenkins上构建编译项目。

前后端项目的部署

到这里,三种部署的流程就完成了。如果你熟悉Docker的方式构建,再用Jenkins和Ansible的时候,就会简单很多。我在实际开发中,项目是前后端分离的。公司做了两个方案,

第一种:前后端分开部署,即Jenkins上有四个项目。前端和后端各两个项目。这样的好处就是前后端互不影响。不会因为对方的错误而从新编译。缺点也是有的,很难保证对方部署的环境是最新的。

第二种:把前后端放在一个项目中,一次构建完成两个项目的打包部署。缺点是构建慢,优点就是保证两端的代码都是最新的,适合发布到预发布环境和正式环境。

那么,针对前后端一起部署的需求,Jenkins和Ansible同样也需要简单的修改。其思路就是Jenkins负责编译项目,将资源文件压缩,再通过Ansible上传到其他服务器上。执行解压,构建,启动的命令。

看起来视乎很简单,但有一个坑希望你们跨过去。前端打包需要npm或者其他工具,但是你的服务器上没有安装。此时请务必通过Jenkins控制台,或者用Jenkins帐号登录服务器安装这些工具。笔者就是通过root帐号登录服务器安装的npm,通过Jenkins编译时提示没有权限。

转载于:https://www.cnblogs.com/itdragon/p/10011816.html

从Docker 到Jenkins 到Ansible的部署经验 1相关推荐

  1. 从Docker 到Jenkins 到Ansible的部署经验

    从Docker 到Jenkins 到Ansible的部署经验 工作中,除了开发功能,还负责系统的部署工作.我从频繁的部署工作中,逐渐找到了一些偷懒的方法.从传统的Java -jar命令启动服务,到通过 ...

  2. Jenkins+Gitlab+Ansible自动化部署(四)

    Jenkins+Gitlab+Ansible自动化部署(2021-08-11) 一.Jenkins Linux Shell 集成 登录Jenkins web管理页,点击新建任务 添加描述信息 添加构建 ...

  3. Docker、Jenkins、Rancher自动化部署项目

    技术前提 在阿里云服务器centOS7.3版本虚拟机安装开发环境,也可以自己本机装虚拟机尝试.也有一定技术基 础前提,需要了解linux基础命令.Docker的运用,如:编写Dockerfile文件. ...

  4. Docker安装Jenkins实现自动化构建部署到Tomcat

    安装Docker 直接装一个docker-toolbox就好了,下载最下面的最新版 http://mirrors.aliyun.com/docker-toolbox/windows/docker-to ...

  5. win10使用docker搭建jenkins,实现自动化部署

    环境准备: win10 docker gitee 一台服务器 安装jenkins配置环境 首先你自己的需要在电脑上搭建docker的环境,这边就不介绍docker了. 接下来就是搜索镜像,安装jenk ...

  6. Docker系列之Jenkins+Git实现流水线部署SpringBoot项目

    1. 概述 本文使用Docker.Jenkins和Gitee持续部署SpringBoot项目,小伙伴们需要提前准备好Docker和Jenkins开发环境,有不清楚如何安装Docker和Jenkins的 ...

  7. Docker系列 七. Docker 安装Jenkins

    Docker系列 七. Docker 安装Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集 ...

  8. Docker的Jenkins Pipeline工作流

    原文地址:http://www.youruncloud.com/blog/127.html 分享主题 一个软件产品的开发周期中,尤其是敏捷开发,持续集成和持续部署是必不可少的环节,而随着产品的丰富,模 ...

  9. Docker、Jenkins 结合 SonarQube 和 Sonar scanner 进行代码质量扫描

    SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误.目前支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groov ...

最新文章

  1. linux里与Ctrl组合使用的键
  2. mybaits三:全局配置文件(全面)
  3. 通过JDBC连接取得数据库相关的元数据
  4. html+cs入门实例,CS50 HTML和CSS基础(介绍最简单的HTML和CSS)
  5. iphone--使用NSUserDefaults存储数据
  6. 识别中文_关于开展中文语音识别和语音合成基础服务可信评估的通知
  7. 每股收益具体怎么来的
  8. QT学习教程(全面)
  9. linux字体不识别不了怎么办,Docker容器不识别宋体等字体的解决方案
  10. cocos2dx 3.9.1 mac模拟器log输出bug修正
  11. 329、微信账户体系科普:什么是UnionId、OpenId与wxopenid?
  12. 阿里云服务器储存空间不足解决方案
  13. python医院自动化抢号脚本
  14. 用程序编写计算公式的高次方程数字计算机
  15. C#中ManualResetEvent用法
  16. latex怎样让题号顶格_latex proof顶格
  17. html导航栏页面切换的js,js实现页面滚动切换导航栏/点击导航栏跳转到指定位置...
  18. 成功的设计是什么?商业成功+工艺成功
  19. LeetCode 342. 4的幂 附带《Effective C++》pdf版下载
  20. JavaScript之留言板制作

热门文章

  1. CSDN活跃榜 2019-5-22
  2. SAP C4C计价(Pricing)中折扣(Discount)的使用
  3. linux添加cmd命令行参数,Windows 终端命令行参数 | Microsoft Docs
  4. 可持久化-可持久化字典树
  5. 2017年上半年全国高等学校安徽考区计算机水平考试,教务处关于2017年上半年全国高等学校(安徽考区)计算机水平考试报名的通知-教务处...
  6. 编译c语言程序时 程序中的注释部分将,C语言程序编译时,程序中的注释部分将 答案:不参加编译,也不会出现在目标程序中...
  7. java 安卓界面 可视化_Monkey可视化工具开发(android篇)
  8. arch linux 安装xfce_树莓派安装ArchLinux+桌面环境
  9. Hadoop端口介绍及各种启动命令列表
  10. win7锁定计算机要输入密码登陆,在win7中,怎么解决开机要输入用户密码