当前位置: 代码迷 >> 综合 >> - PaaS - Gitlab/Nexus/Registry
  详细解决方案

- PaaS - Gitlab/Nexus/Registry

热度:88   发布时间:2023-11-18 11:55:08.0

>> 虚拟机服务器说明

在这里插入图片描述

  • Ubuntu server x64 位:基础Ubuntu系统;配置好账号密码;
  • Ubuntu server x64 Docker:安装Docker;
  • Ubuntu server x64 Docker Gitlab:Github 自托管Git项目仓库;
  • Ubuntu server x64 Docker Nexus:Maven私服;
  • Ubuntu server x64 Docker Registry:镜像私服;
  • Ubuntu server x64 Docker Deploy:拉取项目代码,制作镜像,推送到Git私服;
  • Ubuntu server x64 Docker MySQL:数据库服务器;
  • Ubuntu server x64 Docker Myforum:拉取镜像,运行容器;

>> GitLab - 代码管理平台

Git是一个第三方代码托管平台,互联网企业,代码不能放到第三方平台上,但是又想用Git进行代码托管,所以只能自己架设一个Git托管平台;

开源的第三方托管平台只有Gitlab;Gitlab既可以使用它的第三方托管,又可以本地部署;

Gitlab是利用Ruby on Rails实现的一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过web界面访问公开或私人项目,它拥有与Github类似的功能,能够浏览源代码、管理缺陷和注释,可以管理团队对仓库的访问,非常易于浏览提交过的版本并提供一个文件历史库;

~ GitLab 安装

在这里插入图片描述

1、安装gitlab的内存最低2G;

2、在docker镜像中心搜索汉化社区版;

3、复制安装链接:docker pull twang2218/gitlab-ce-zh

4、创建docker-compose.yml测试最新版本是否能正常运行:

version: '3'
services:web:image: 'twang2218/gitlab-ce-zh'restart: alwayshostname: '192.168.141.176'environment:TZ: 'Asia/Shanghai'GITLAB_OMNIBUS_CONFIG: |external_url 'http://192.168.141.176:8080'gitlab_rails['gitlab_shell_ssh_port'] = 2222unicorn['port'] = 8888nginx['listen_port'] = 8080ports:- '8080:8080'- '8443:443'- '2222:22'volumes:- /usr/local/docker/gitlab/config:/etc/gitlab- /usr/local/docker/gitlab/data:/var/opt/gitlab- /usr/local/docker/gitlab/logs:/var/log/gitlab
  • hostname:主机地址(主机名),这里应该填写域名,但是我们是本地部署,没有域名,所以就用IP;hostname就是部署这台机器的主机的IP地址;

  • GITLAB_OMNIBUS_CONFIG:GitLab初始化操作;

  • external_url:外部访问地址:web页面访问的地址;这个gitlab能够访问是因为使用了Nginx,使用了反向代理来代理了这台lab被访问;这个端口要跟Nginx监听的端口一致;

  • gitlab_rails:SSH访问:gitlab支持SSH访问,GitHub也支持,这样就做到了免密访问;改成2222是因为22已经被占用了,这台机器已经开了22端口;不改的话就会端口冲突;

  • unicorn:Gitlab的一个内部端口;

  • ports:左边是宿主机端口,右边是容器端口;

5、运行容器:root@Ubuntu:/usr/local/docker/gitlab# docker-compose up (需要等好久好久…)

6、浏览器地址栏访问:192.168.141.176:8080
用户:root,修改初始密码为12345678;
用户:zxj/12345678

~ Gitlab 基本设置

登录时是使用的root账户,但是真正使用时一般不会使用root账户,而是创建一个自己使用的root账户;

GitLab 使用 SSH 免密登录:同Github设置秘钥一模一样!
在这里插入图片描述


>> Nexus - 依赖管理平台

Nexus:是一个强大的Maven仓库管理器(Maven私服);Nexus仅仅是私服的一种;

Nexus是一种远程仓库;在远程仓库中,默认的是中央仓库,中央仓库是Maven核心自带的远程仓库;

那就使用中央仓库不就得了吗,为什么我们要安装Nexus使用私服呢?

我们从项目实际开发来看:
1,一些无法从外部仓库下载的构件,例如内部的项目还能部署到私服上,以便供其他依赖项目使用;
2, 为了节省带宽和时间,在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库,当本地Maven项目需要下载构件时,先去私服请求,如果私服没有,则再去远程仓库请求,从远程仓库下载构件后,把构件缓存在私服上;这样,及时暂时没有Internet链接,由于私服已经缓存了大量构件,整个项目还是可以正常使用的;同时,也降低了中央仓库的负荷;

~ Nexus 安装

在这里插入图片描述
注意:安装Nexus服务的服务器需要2G内存;

1、复制链接:docker pull sonatype/nexus3

2、创建目录/usr/local/docker/nexus/,创建docker-compose.yml文件:

version: '3.1'
services:nexus:restart: alwaysimage: sonatype/nexus3container_name: nexusports:- 8081:8081volumes:- /usr/local/docker/nexus/data:/nexus-data

3、运行容器:docker-compose up

4、启动会报错:nexus | Unable to update instance pid: Unable to create directory /nexus-data/instances,这是因为镜像中挂载的数据卷/data缺少操作权限;

5、删除正在进行的容器:root@Ubuntu:/usr/local/nexus# docker-compose down

6、修改/data/目录操作权限:chmod 777 data/

7、浏览器访问:192.168.141.178:8081 (Nexus暴露的端口是8081,Linux服务器的地址是178)

  • free -h:可以查看内存使用状态;
  • htop:安装htop查看内存使用详细状态;没有就安装一个;

8、登录:默认账户admin/admin123. (可以登录进去修改密码)

~ 在项目中使用Maven私服

1、配置认证信息:
在Maven的settings.xml中添加Nexus认证信息(servers节点下):
设置发行版的服务节点,和快照版的服务节点;

<server><id>nexus-releases</id><username>admin</username><password>admin123</password>
</server><server><id>nexus-snapshots</id><username>admin</username><password>admin123</password>
</server>

2、配置自动化部署 - 上传jar/war包到私服
在项目的 pom.xml 中添加如下代码:
有两个仓库地址:发行版和快照版;

<distributionManagement>  <repository>  <id>nexus-releases</id>  <name>Nexus Release Repository</name>  <url>http://Linux服务器的地址:8081/repository/maven-releases/</url>   // 这个地址可以直接从Nexus中粘贴</repository>  <snapshotRepository>  <id>nexus-snapshots</id>  <name>Nexus Snapshot Repository</name>  <url>http://Linux服务器的地址:8081/repository/maven-snapshots/</url>  </snapshotRepository>  
</distributionManagement> 

注意:

  • ID 名称必须要与 settings.xml 中 Servers 配置的 ID 名称保持一致;
  • 项目版本号中有 SNAPSHOT 标识的,会发布到 Nexus Snapshots Repository, 否则发布到 Nexus Release Repository,并根据 ID 去匹配授权账号;

3、部署到仓库:
在终端进入到项目目录下执行:$ mvn deploy -Dmaven.test.skip=true

  • mvn package:打包,在项目这儿打包;
  • mvn install:打包到本地仓库;
  • mvn deploy:推到私服;服务器是自己架设的,不是每个人都能往上面推送依赖,所以需要在settings.xml中设置账号和密码;

4、在浏览器页面刷新,可以看到上传了的文件包;
私服的步骤也是先安装到本地,再上传到服务器;

5、上传第三方Jar包:
把无法通过公网从官服下载的第三方依赖,放到私服里面;这样别人就能用了;

# 如第三方JAR包:aliyun-sdk-oss-2.2.3.jar
mvn deploy:deploy-file -DgroupId=com.aliyun.oss -DartifactId=aliyun-sdk-oss -Dversion=2.2.3 -Dpackaging=jar -Dfile=D:\aliyun-sdk-oss-2.2.3.jar    // 本地存放路径-Durl=http://127.0.0.1:8081/repository/maven-3rd/   // 要上传到的地址-DrepositoryId=nexus-releases

注意:

  • 建议在上传第三方 JAR 包时,创建单独的第三方 JAR 包管理仓库,便于管理有维护;(maven-3rd)
  • -DrepositoryId=nexus-releases对应的是 settings.xml中 Servers 配置的 ID 名称;(授权)

6、配置代理仓库: 从私服下载依赖
在项目的 pom.xml 中添加如下代码:

<repositories><repository><id>nexus</id><name>Nexus Repository</name><url>http://服务器IP地址:8081/repository/maven-public/</url>   // 公共仓库:是发行版和快照版仓库的映射;包含2个地方的所有依赖;<snapshots><enabled>true</enabled>   // 允许依赖快照版;设置false,则快照版本无法下载;</snapshots><releases><enabled>true</enabled></releases></repository>
</repositories>
<pluginRepositories><pluginRepository><id>nexus</id><name>Nexus Plugin Repository</name><url>http://服务器IP地址:8081/repository/maven-public/</url><snapshots><enabled>true</enabled></snapshots><releases><enabled>true</enabled></releases></pluginRepository>
</pluginRepositories>

>> Registry - 镜像管理平台

官方的Docker hub是一个管理公共镜像的地方,我们可以在上面找到想要的镜像,也可以把自己的镜像推送上去;但是有时候,我们的服务器无法访问互联网,或者不希望将自己的镜像放到公网上去,那就需要Docker Registry,来存储和管理自己的镜像;

~ Registry 安装

1、拉取镜像:root@Ubuntu:~# docker pull registry

2、创建工作目录/usr/local/docker/registry,创建docker-compose.yml文件;

version: '3.1'
services:registry:image: registryrestart: alwayscontainer_name: registryports:- 5000:5000volumes:- /usr/local/docker/registry/data:/var/lib/registry

3、运行容器:root@Ubuntu:/usr/local/docker/registry# docker-compose up -d

4、浏览器访问:192.168.141.179:5000/v2;(因为里面什么都没有,所以返回空的json)

~ Docker Registry 配置客户端

重新克隆一个虚拟机,作为docker registry 客户端;然后再在这个客户机上进行配置;

1、在/etc/docker/daemon.json中添加下面内容:(若文件不存在,则新建)

root@Ubuntu:/etc/docker# vi daemon.json
root@Ubuntu:/etc/docker# cat daemon.json 
{
    "registry-mirrors": ["https://registry.docker-cn.com"],"insecure-registries": ["192.168.141.179:5000"]
}

2、重启docker服务,让配置生效:root@Ubuntu:/etc/docker# systemctl restart docker

3、手动检查客户端配置是否生效:root@Ubuntu:/etc/docker# docker info
在这里插入图片描述

4、测试镜像是否能上传:

  • 先拉取一个Tomcat镜像到本地:docker pull tomcat
  • 使用tag标签标记本地的Tomcat镜像为IP(服务器IP)、端口+名称:docker tag tomcat 192.168.141.179:5000/tomcat[:版本号]
    拉取镜像的时候,要的是完整的镜像地址端口名称,没有指定地址端口,默认从中央仓库拉取;
  • 推送镜像到Registry仓库:docker push tomcat 192.168.141.179:5000[:版本号]

5、在浏览器查看Docker Registry服务器中是否有上传的镜像:

  • http://192.168.141.179:5000/v2/_catalog:查看全部镜像;
  • http://192.168.141.179:5000/v2/tomcat/tags/list:查看指定镜像;

~ 部署 Docker Registry WebUI

在Docker Registry 服务器操作:

1、先关闭开启的Registry服务:root@Ubuntu:/usr/local/docker/registry# docker-compose down

2、修改docker-compose.yml文件,添加Registry的前端 服务:

  frontend:image: konradkleine/docker-registry-frontend:v2ports:- 8080:80volumes:- ./certs/frontend.crt:/etc/apache2/server.crt:ro- ./certs/frontend.key:/etc/apache2/server.key:roenvironment:- ENV_DOCKER_REGISTRY_HOST=192.168.141.179- ENV_DOCKER_REGISTRY_PORT=5000

3、启动服务:root@Ubuntu:/usr/local/docker/registry# docker-compose up -d

4、浏览器访问:http://192.168.141.179:8080 (Registry 前端的端口映射成了8080)

>> 实现一次构建 到处运行

(1)将项目代码上传到 Docker GitLab 服务器上

1、打开http://192.168.141.176:8080,创建项目,添加readme文件直接提交,什么也不写;

2、将项目克隆到本地:
# zxj @ zhangxuejiaodeMacBook-Pro in ~/文档/Git [15:47:23] C:127
$ git clone ssh://git@192.168.141.176:2222/zxj/myforum.git

3、将项目代码复制到这个目录下:(除了.git文件夹)

4、将项目推送到仓库:

git add .
git status
git commit -m "add all file"
git push -u origin master

(2)配置数据库服务器 Docker mysql

安装MySQL,并导入数据库:https://blog.csdn.net/qq_37546891/article/details/92776939

(3)在docker deploy 服务器完成项目代码的编译打包上传

1、每台主机都需要在Git服务上添加本机的秘钥,所以需要先在本机生成秘钥对,然后在服务器上添加秘钥:

  • ssh-keygen -t rsa -C "13116052056@163.com":生成秘钥;需要三次回车;
    在这里插入图片描述

2、创建项目目录,克隆:root@Ubuntu:/usr/local/docker# git clone ssh://git@192.168.141.176:2222/zxj/myforum.git

3、安装Java:https://blog.csdn.net/qq_37546891/article/details/92077749
安装maven:从本地宿主机上传Maven安装文件:
root@Ubuntu:/usr/local# tar -zxvf apache-maven-3.6.1-bin.tar.gz:解压缩;

4、配置环境变量:在root@Ubuntu:/usr/local# vi /etc/profile添加:

export MAVEN_HOME=/usr/local/apache-maven-3.6.1
export JAVA_HOME=/usr/local/jdk1.8.0_211
export JRE_HOME=/usr/local/jdk1.8.0_211/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin:$PATH:$HOME/bin

5、使环境变量配置生效:root@Ubuntu:/usr/local# source /etc/profile
检验配置是否生效:java -versionmvn -v

6、打包项目:root@Ubuntu:/usr/local/docker/myforum# mvn clean package -Dmaven.test.skip=true

7、打包镜像:

  • root@Ubuntu:/usr/local/docker/myforum/target/myforum-0.0.1-SNAPSHOT# tar -czvf myforum.tar.gz .:将tag目录下的war包文件打成压缩包;

  • root@Ubuntu:/usr/local/docker/myforum/target/myforum-0.0.1-SNAPSHOT# mv myforum.tar.gz ../../image/:将压缩包文件移动到/usr/local/docker/myforum/image目录下;

  • /usr/local/docker/myforum/image目录下编辑Dockerfile文件:

FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *
ADD myforum.tar.gz /usr/local/tomcat/webapps/ROOT
RUN rm -fr myforum.tar.gz
WORKDIR /usr/local/tomcat
  • 制作镜像:root@Ubuntu:/usr/local/docker/myforum/image# docker build -t 192.168.141.179:5000/myforum .

  • 将镜像推送到仓库:root@Ubuntu:/usr/local/docker/myforum/image# docker push 192.168.141.179:5000/myforum

  • 到仓库中(http://192.168.141.179:8080/tag//myforum/latest/)复制镜像地址:docker pull 192.168.141.179:5000/myforum:latest

(4)克隆虚拟机Docker Myforum
原则上一台服务器启动一个服务,应该克隆一个虚拟机Docker Myforum,在这台服务器上拉取myforum镜像并运行容器; 但是由于内存不够再开一个虚拟机,所以直接在Docker Deploy这台虚拟机上操作了;

root@Ubuntu:/usr/local/docker# vi docker-compose.yml

version: '3.1'
services:myforum:restart: alwaysimage: 192.168.141.179:5000/myforumcontainer_name: myforumports:- 8080:8080

root@Ubuntu:/usr/local/docker# docker-compose up -d

注意:若是在Docker Myforum,运行容器会出错,原因是没有配置客户端:
在这里插入图片描述

myforum容器启动成功,浏览器访问:192.168.141.180:8080/ (由于使用的是docker mysql这台服务器,所以地址是180)

文章参考博客视频教程

  相关解决方案