# ubuntu docker 安装 jenkins

通过 nginx 转发必须是根路径!

本文是记载我通过 docker 安装 Jenkins 之后再通过 nginx 正向代理,期望这样能够通过访问我自己的域名来初始化 docker 中的 jenkins。但是实际操作中遇到了问题,感觉是 jenkins 的问题。

先简单介绍一下 docker 安装 jenkins 的步骤。

# 步骤

# 0. 查看版本

Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。通过 uname -r 命令查看你当前的内核版本。

uname -r

# 1. 获取最新版本的 Docker 安装包

wget -qO- https://get.docker.com/ | sh

# 2. 运行/停止 docker

service docker start  // 启动 docker 服务
service docker restart  // 重启docker服务
service docker stop     // 停止docker服务

# 3. 拉取最新 jenkins 镜像

docker pull jenkins:latest

# 4. 启动

运行一个镜像为 jenkins:latest 的容器,命名为 jenkins_node2,使用 root 账号覆盖容器中的账号,赋予最高权限,将容器的 /var/jenkins_home映射到宿主机的 /root/jenkins_node2目录下,映射容器中8080端口到宿主机49004端口

sudo docker run -d -u 0 --privileged  --name jenkins_node2 -p 49004:8080 -v /root/jenkins_node2:/var/jenkins_home jenkins:latest

# 坑点来了!!!

**查看 jenkins: **

执行完成后,等待几十秒,等待 jenkins 容器启动初始化。

可以查看宿主机 /root/jenkins_node2下是否多了很多文件。 由于是在服务器上启动的,所以不能直接访问 http://localhost:49003 来初始化。

也就是说,如果我的服务器防火墙开了 49004 这个端口的话,其实是可以通过 ip:49004 这样的形式去访问 jenkins 并进行初始化了的。 但是,常规的云服务器厂商出于安全考虑一般只会默认开放几个端口,例如 80, 8080, 443 等接口,用于一般的 web 需求。

我的服务器是阿里云的,默认只开了 443 和 80 端口,分别对应 https 和 http 的默认端口, 都是通过 nginx 来代理转发请求的。

一开始我想的比较简单,想直接通过 http://xxx.yyy.cn/jenkins 这样的形式来访问,所有带有 jenkins 前缀的请求我都统统转发到 49004 端口上去。 于是我的 nginx 配置是这样的:

但是当我访问 域名/jenkins 时, 一直显示

首先是 jenkins 的内容显示不正常,其次查看 network 发现有大量的静态资源都是 404。

仔细查看之后发现,原来 jenkins 的初始化页面上的静态资源加载的路径都是绝对路径,都是从根目录开始寻找静态资源的,难怪这里会显示不正常。

于是乎,我们需要想办法解决这个问题,最简单的方式就是 nginx 代理的直接通过转发到根路径。 要么开其他端口的防火墙可以对外访问,要么就是通过一个三级域名来转发请求(如果你的服务器套了域名的话)。因为开其他端口需要涉及到的更大的权限和隐患,而且阿里云服务器要对外开一个端口真的是贼麻烦,于是我给我的域名再解析了一个三级域名:

忽略最后代理到的是 49003 端口,因为演示的原因,我是重新 run 了一个镜像来写博客的,所以实际情况根据实际的运行端口配置即可。

通过这样操作以后,再访问 http://jenkins.xxx.cn 的时候你就会看到熟悉的登录界面啦~

# 写在最后

不确定会不会有人跟我一样遇到这个问题,想来想去还是记录一下,说不定对别人也有用,特别是遇到 jenkins 正在启动的页面的时候,还一直傻傻等着的人(比如一开始的我, 好歹也是前端工程师。。。。竟然一直没注意去看 network)。