Linux kernel有2000多万行代码,当需要搜索的代码量很大时,使用OpenGrok可以加速搜索速度.
通过Docker部署OpenGrok能隔离部署的环境与host环境,互不干扰.
过程如下
准备linux代码
mkdir /home/jenkins/opengrok/{src,data,dist,etc,log} -p
cd opengrok/src/
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
安装Docker
参考 https://www.runoob.com/docker/ubuntu-docker-install.html
Docker功能上类似于在Ubunut22.04 这个host OS上安装了一个虚拟机,虚拟机上运行的OS是docker image.
sudo su
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
创建docker-compose.yml文件
Docker将根据docker-compose.yml的配置进行image的下载和运行, 此image里已经安装好opengrok和tomcat.
参考 https://hub.docker.com/r/opengrok/docker/
cd ~
vim docker-compose.yml #填写如下内容
----------------------------------------------------------------------------------------------------
version: "3"
# More info at https://github.com/oracle/opengrok/docker/
services:
opengrok:
container_name: opengrok
image: opengrok/docker:latest
ports:
- "8080:8080/tcp"
environment:
SYNC_PERIOD_MINUTES: '1440'
# Volumes store your data between container upgrades
volumes:
- '/home/jenkins/opengrok/src/:/opengrok/src/' # source code
- '/home/jenkins/opengrok/etc/:/opengrok/etc/' # folder contains configuration.xml
- '/home/jenkins/opengrok/data/:/opengrok/data/' # index and other things for source code
image: opengrok/docker:latest
指定docker去opengrok/docker仓库里下载最新版本的image, 这个image里安装好了opengrok和tomcat.
image类似于操作系统的某个发行版,比如ubuntu 20.04或在22.10等,只是里面已经安装好了需要部署的特定软件而已. container相当于这个OS发行版在某台PC上的某次安装后 在此PC上的部署状态.
image本地缓存在 /var/lib/docker/overlay2 里, /var/lib/docker/image 里只是一些索引到overlay2的关键信息,并不是tar包
repo 可能是国外的,有几百兆,下载需要一些时间.
container_name: opengrok
为这个部署状态取名为opengrok
container本地缓存在 /var/lib/docker/containers 里, 同样是一些索引到overlay2的关键信息,并不是tar包
8080:8080/tcp
把 host的8080端口转发到docker的8080端口,这样对8080端口的网页访问将由docker虚拟机里的tomcat 来处理
SYNC_PERIOD_MINUTES: '1440'
由OpenGrok管理的代码,每天于社区仓库同步一次,并更新代码到最新状态
'/home/jenkins/opengrok/src/:/opengrok/src/'
mount host OS的/home/jenkins/opengrok/src/到docker虚拟机OS的/opengrok/src/目录,这样任何一个OS对此目录的修改都会保存到磁盘上文件系统的唯一目录里
下载并运行docker image
sudo docker compose up -d
至此,已经可以在其他主机上通过浏览器访问 http://host-ip-addr:8080/ 了,如果出现访问异常,可以查看docker启动log
sudo docker compose logs
也可以检查一下host的端口是否被防火墙禁止访问了
jenkins@ubuntu22.04:~$ sudo lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 3124 root 4u IPv4 49493 0t0 TCP *:http-alt (LISTEN)
docker-pr 3144 root 4u IPv6 38263 0t0 TCP *:http-alt (LISTEN)
# 上面是正常的情况,如果被禁用了,可以改为允许访问
sudo ufw allow 8080/tcp
其他基础知识
参考 https://docs.docker.com/engine/reference/commandline/docker/
参考 jenkins@ubuntu22.04:~$ docker --help
# Docker虚拟机关机/开机
jenkins@ubuntu22.04:~$ sudo docker stop opengrok
jenkins@ubuntu22.04:~$ sudo docker start opengrok
# 加入新的代码目录到src后, 重启docker开始同步代码ctags 索引
jenkins@ubuntu22.04:~$ sudo docker restart opengrok
# ssh 登陆 docker vm
jenkins@ubuntu22.04:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd21aed1dc33 opengrok/docker:latest "/scripts/start.py" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp opengrok
jenkins@ubuntu22.04:~$ sudo docker exec -it opengrok bash
root@dd21aed1dc33:/usr/local/tomcat#
# tomcat 的配置文件
root@dd21aed1dc33:/usr/local/tomcat# ll /opengrok/etc
-rw-r--r-- 1 root root 28027 Feb 24 02:54 configuration.xml
-rw-r--r-- 1 root root 40 Feb 24 02:44 mirror.yml
# ctags 生成的索引文件
root@dd21aed1dc33:/usr/local/tomcat# ll /opengrok/data
drwxr-xr-x 3 root root 19 Feb 24 02:44 historycache/
drwxr-xr-x 4 root root 30 Feb 24 02:44 index/
drwxr-x--- 4 root root 30 Feb 24 02:45 suggester/
-rw-r--r-- 1 root root 0 Feb 24 02:54 timestamp
drwxr-xr-x 4 root root 30 Feb 24 02:44 xref/
root@dd21aed1dc33:/usr/local/tomcat# ll /scripts/
-rwxr-xr-x 1 root root 2055 Jan 6 21:45 logging.properties*
-rwxr-xr-x 1 root root 1378 Jan 6 21:45 periodic_timer.py*
drwxr-xr-x 2 root root 44 Feb 24 02:44 __pycache__/
-rwxr-xr-x 1 root root 7467 Jan 6 21:45 README.md*
-rwxr-xr-x 1 root root 20275 Jan 6 21:45 start.py*
-rwxr-xr-x 1 root root 894 Jan 6 21:45 sync.yml*
# 备份container的初始状态, 备份container就相当于用当前container状态的快照定义成一个image
jenkins@ubuntu22.04:~$ sudo docker commit -p dd21aed1dc33 my-repo/opengrok:2013-03-13-initial-state
sha256:e0dccdd02dadd3f60d52fc711d36fd2920f6c07271301bd411ffed921d0e50e7
# 修改container
root@dd21aed1dc33:/usr/local/tomcat# apt update
root@dd21aed1dc33:/usr/local/tomcat# apt install -y git vim plocate silversearcher-ag htop iftop ifstat iotop psmisc
root@dd21aed1dc33:/usr/local/tomcat# git config --global --add safe.directory /opengrok/src/linux
root@dd21aed1dc33:/usr/local/tomcat# exit
jenkins@ubuntu22.04:~$
# 备份container安装一些tools后的状态
jenkins@ubuntu22.04:~$ sudo docker commit -p dd21aed1dc33 my-repo/opengrok:2013-03-13-installed-some-tools
sha256:c94ad1123f4e55cb319a9583f563c4af702c67e783b7f13888ecb2aa2076c2ee
# 查看docker image
jenkins@ubuntu22.04:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-repo/opengrok 2013-03-13-initial-state e0dccdd02dad 5 minutes ago 902MB
my-repo/opengrok 2013-03-13-installed-some-tools c94ad1123f4e 3 minutes ago 1.12GB
opengrok/docker latest 45fb8fb42284 2 months ago 902MB
# 注意docker commit并不是保存成差分文件, 可以看到完整的image是很大的
# image文件的位置在/var/lib/docker/image/
# 删除docker image
jenkins@ubuntu22.04:~$ sudo docker rmi my-repo/opengrok:2013-03-13-initial-state
Untagged: my-repo/opengrok:2013-03-13-initial-state
Deleted: sha256:e0dccdd02dadd3f60d52fc711d36fd2920f6c07271301bd411ffed921d0e50e7
Deleted: sha256:05ea10406083e8ffbe5a68e988166aba0ea09a0522fb4ce0c06aa29aa6a43352
# initial state和opengrok/docker:latest的image是完全一样的,没必要备份
# 删除container, 当container的内部环境被破坏时
root@dd21aed1dc33:/usr/local/tomcat# mv /etc /etc-bk #不小心把container破坏了
root@dd21aed1dc33:/usr/local/tomcat# exit
jenkins@ubuntu22.04:~$ sudo docker stop opengrok
jenkins@ubuntu22.04:~$ sudo docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd21aed1dc33 opengrok/docker:latest "/scripts/start.py" 2 weeks ago Up 7 days 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp opengrok
jenkins@ubuntu22.04:~$ sudo docker rm dd21aed1dc33
dd21aed1dc33
# 从备份的 2013-03-13-installed-some-tools image创建新的container
jenkins@ubuntu22.04:~$ sudo docker run -d \
--name opengrok-2013-03-13-installed-some-tools \
-p 8080:8080/tcp \
-e SYNC_PERIOD_MINUTES="1440" \
-v /home/jenkins/opengrok-src/:/opengrok/src/ \
-v /home/jenkins/opengrok-etc/:/opengrok/etc/ \
-v /home/jenkins/opengrok-data/:/opengrok/data/ \
my-repo/opengrok:2013-03-13-installed-some-tools
06dbce85cac958d2cee0fd73a153ebf462069c84b95618242bfb145bc9ad5872
jenkins@ubuntu22.04:~$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06dbce85cac9 my-repo/opengrok:2013-03-13-installed-some-tools "/scripts/start.py" 10 minutes ago Up 10 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp opengrok-2013-03-13-installed-some-tools
# 或者把 docker-compose.yml 里的 "image: opengrok/docker:latest" 改为 "my-repo/opengrok:2013-03-13-installed-some-tools",然后 sudo docker compose up -d 重新创建container
# export container 给别人使用, 当你想分享你对container做的成果时
jenkins@ubuntu22.04:~$ sudo docker export opengrok-2013-03-13-installed-some-tools > opengrok-v001.tar
jenkins@ubuntu22.04:~$ ll
-rw-rw-r-- 1 jenkins jenkins 992168960 Mar 13 19:16 opengrok-v001.tar
# 然后把 tar文件share给需要的人
# import别人分享的image
thomas@ubuntu22.04:~$ sudo docker import opengrok-v001.tar thomas-repo/opengrok:jenkins-v001
sha256:2ab2148cdc7afdd6001663a53a488a267c61f8070903af171717ddd22d98eb45
thomas@ubuntu22.04:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
thomas-repo/opengrok jenkins-v001 2ab2148cdc7a 14 seconds ago 977MB
thomas@ubuntu22.04:~$ sudo docker run -d \
--name opengrok-jenkins-v001 \
-p 8080:8080/tcp \
-e SYNC_PERIOD_MINUTES="1440" \
-v /home/thomas/opengrok-src/:/opengrok/src/ \
-v /home/thomas/opengrok-etc/:/opengrok/etc/ \
-v /home/thomas/opengrok-data/:/opengrok/data/ \
thomas-repo/opengrok:jenkins-v001