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)。