当前位置: 首页 > 工具软件 > OpenGrok > 使用案例 >

在ubuntu 22.04 上通过 Docker部署OpenGrok

诸葛皓
2023-12-01

Linux kernel有2000多万行代码,当需要搜索的代码量很大时,使用OpenGrok可以加速搜索速度.

通过Docker部署OpenGrok能隔离部署的环境与host环境,互不干扰.

过程如下

  1. 准备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

  1. 安装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

  1. 创建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对此目录的修改都会保存到磁盘上文件系统的唯一目录里

  1. 下载并运行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

  1. 其他基础知识

参考 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

 类似资料: