赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。