Docker+Jenkins+Nginx自动化构建部署

84 阅读5分钟

Docker

Docker 是一种容器技术,一方面 Docker 可以将程序本身同程序的基础架构分离,如同实例之间的关系。另一方面,容器就类似于一个封闭的环境,容器之间也是相互分离的,互不干扰的,保证了环境的统一和安全,就不会出现“测试环境没问题,到了生产环境就报错”这样尴尬的情况。
其次就是快速交付、测试以及部署,Docker 可以用来做 CI/CD,自动测试、自动部署以及自动交付代码产物等功能都集成了。

  1. 保证运行环境的统一
  2. 一次构建,到处使用

镜像

首先就是开篇提到的类与实例的关系,镜像就是类,镜像类似于系统镜像的概念,对于前端而言,镜像就是包含了代码运行所需要的一切产物、依赖、配置等。这样的话,可以保证每次程序运行的环境一致。构建镜像,一般都是通过一个文本文件来生成。这个文件就是 Dockerfile,文件内容就是一系列的指令集合。
举🌰来说,对于一个简单的前端应用来说,首先需要安装 NodeJS 作为运行环境,其次则是需要安装依赖,最后需要通过npm run build这样的命令来构建应用产物。这个过程在 Dockerfile 中就是一系列的指令集合,后面会具体分析各个指令用法。

容器

有了镜像以后,可以通过镜像产出容器,这个“容器”就是实例的概念,所以拿到容器以后可以放到任意平台去使用、比如 windows、linux、unix 等,真正做到了一处开发,到处使用的功能。需要注意的是容器并不是虚拟机、它只是一个进程,同普通程序一样,理解这点在启动容器的时候尤为重要。

镜像仓库

Docker 中的仓库其实和 github、gitee 这样的代码仓库是类似的概念,只是后者是用来存储源代码、而前者是用来存储镜像的,比如前端肯定会使用到的 NodeJS,则是在 Docker Hub 中可以找到。使用的时候,就可以在仓库中找到对应的镜像即可。同样自己写的镜像也可以上传到仓库中。

基本使用

  1. 在项目中创建Dockerfile文件
FROM node as builder
# 阶段一

LABEL maintainer=honglang03

COPY package.json ./

RUN set -x \
  && npm install \
  && npm run build

COPY ./ ./

FROM nginx
# 阶段二

COPY --from=builder /dist /usr/share/nginx/html/

COPY --from=builder /docker/nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

在 Dockerfile 中,每一行的指令都可以理解为一个单独的 layer,因此指令之间都是独立存在的。FROM指令可以理解为拉取依赖,COPY指令是用于复制文件到指定目录,RUN 指令则是执行 linux 命令,可以使用 && 连接多个命令,换行的时候需要添加转移符号\。详细的Dockerfile指令可以单独熟悉下。
2. 根据Dockerfile文件构建镜像

docker build -t docify/blog .

在项目根目录执行命令,docker build命令后面的 -t 参数表示 tag 标签的意思,就是给镜像起了一个名字叫做 docify/blog
3. 根据镜像运行容器

docker run -d -p 80:80 --name blog docify/blog

docker run命令则是根据已有的镜像来创建一个容器。-d 参数表示后台运行容器。对于前端应用来说,是启用了 nginx 作为 web 服务器,nginx 是一直需要保持后台运行。--name blog 参数表示运行容器的名字。

指令

docker  // 查看所有指令
docker images // 查看本地主机所有的镜像
docker ps  // 查看运行中的容器
docker exec -it <conatiner> bash  // 进入容器
sudo docker logs <容器 ID> -n 100 -f  // 查看容器日志
docker stop <容器 ID>  // 停止容器
docker restart <容器 ID>  // 重启容器
exit  // 退出容器

Jenkins

安装Jenkins

docker pull jenkins/jenkins

运行容器

docker run -d --name jkcontainer -p 8080:8080 -p 50000:50000 jenkins/jenkins
  • --name 定义一个容器的名字,如果没有指定,那么会自动生成一个随机数字符串当做UUID
  • -d 标识是让 docker 容器在后台运行
  • -p 9000:8080 端口映射,将宿主机9000端口映射到容器8080端口
  • -p 50000:50000 50000端口是基于JNLP的Jenkins代理(slave)通过TCP与 Jenkins master 进行通信的端口。
    启动后可以通过 docker ps 来查看服务情况,然后通过服务器ip:8080端口就可以访问我们的 jenkins 服务

image.png

配置Jenkins

通过 http://<ipaddress>:8080 访问 Jenkins 界面

image.png
由于我们是用 docker 安装的,所以密码会被存储到容器中。 管理员初始密码被放到了 /var/jenkins_home/secrets/initialAdminPassword 文件中。
进入jenkins的容器

docker exec -it jkcontainer bash

查看密码,然后再 jenkins 页面中输入密码

cat /var/jenkins_home/secrets/initialAdminPassword

安装插件

登录成功之后就可以安装插件了

image.png 安装完推荐的插件后,需要安装两个我们需要的插件

  • Nodejs
  • Publish Over SSH
    在 “首页 > 系统管理 > 插件管理 > 可选插件” 中依次搜索 Node、ssh,依次安装。
    安装完配置一下nodejs,在首页 > 系统管理 > 全局工具工具配置 > NodeJS > 新增

image.png

新建项目任务,实现构建及部署

首页 > 新建任务 > 构建一个自由风格的软件项目

image.png