>> 虚拟机服务器说明
- 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 -version
、mvn -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)
文章参考博客视频教程