在从事Java开发的这一年来,因为多提供REST服务,因此使用了Spring Boot框架来开发,随着动态语言的流行(Ruby, Groovy, Scala, Node.js),Java的开发格外的笨重,繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度较大。在上述环境下,Spring Boot应运而生。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置一个习惯性的配置,让你无须手动进行配置)的理念让你的项目快速运行起来。而多使用的是使用Spring Boot开发REST服务。
Maven作为跨平台的项目管理工具,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理,了解Maven需要了解构建的过程。
构建(build)几乎是每一位程序员每天都在做的工作。早上来到公司,我们做的第一件事情就是从源码库签出最新的源码,然后进行单元测试,如果发现失败的测试,会找相关的同事一起调试,修复错误代码。接着回到自己的工作上,编写自己的单元测试及产品代码,生成项目测试文档,诸如像模像样的测试覆盖率报告,然后使用IDE生成一个war包,部署到web容器下,启动容器,等这个过程即为构建的过程。
Maven是优秀的构建工具,具有如下优点:
上图使用了XMind对Maven的强大之处进行了总结。
有三种专门的Maven仓库管理软件可以用来帮助大家建立私服:Apache基金会的Archiva、JFrog的Artifactory和Sonatype的Nexus。而Nexus是当前最流行的Maven仓库管理工具。
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库。供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从远程仓库下载,缓存在私服上以后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家服务。
私服的工作原理容如下图所示:
Docker是一个轻量级容器技术,类似于虚拟机技术(xen,kvm,vmware,virtualbox).Docker是直接运行在当前操作系统(Linux)智商,而不是运行在虚拟机中国,但也实现了虚拟机技术的资源隔离,性能远远高于虚拟机技术。
Docker支持将软件编译成一个镜像(image),在这个镜像里做好对软件的各种配置,然后发布这个镜像,使用者可以运行这个镜像,运行中的镜像称之为容器(container),容器的启动非常快,一般都是秒级的。
目前各大主流云计算平台都支持Docker容器技术,包括阿里云、百度云、Cloud Foundry、HeroKu、OpenShhift、Deis,连微软下一个版本的Windows Server及其云平台Azure上也支持Docker。
这里云计算平台一般指Paas(平台即服务),它是这样的一个云计算:平台提供了存储、数据库、网络、负载均衡、自动扩展等功能。目前主流的软件以及非主流的软件大部分都有人将其封装成Docker镜像,只需要下载好Docker镜像,然后运行镜像就可以快速获得已做好配置可运行的软件。
3 材料
可以连接外网的centos
内外网相同的centos
两个centos均安装了相同版本的docker、sonatype/nexus
一台与外网同局域网的部署了IDEA的电脑
使用yum命令下载相应的包。
[root@localhost docker]# yum install --downloadonly --downloaddir=. docker
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.zju.edu.cn
* extras: mirrors.zju.edu.cn
* updates: mirrors.huaweicloud.com
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=====================================================================================================================================
Package Arch Version Repository Size
=====================================================================================================================================
Installing:
docker x86_64 2:1.13.1-74.git6e3bb8e.el7.centos extras 16 M
Transaction Summary
=====================================================================================================================================
Install 1 Package
Total download size: 16 M
Installed size: 57 M
Background downloading packages, then exiting:
docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64.rpm | 16 MB 00:00:35
exiting because "Download Only" specified
在外网安装docker。
[root@localhost docker]# yum -y install docker
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.zju.edu.cn
* extras: mirrors.zju.edu.cn
* updates: mirrors.huaweicloud.com
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=====================================================================================================================================
Package Arch Version Repository Size
=====================================================================================================================================
Installing:
docker x86_64 2:1.13.1-74.git6e3bb8e.el7.centos extras 16 M
Transaction Summary
=====================================================================================================================================
Install 1 Package
Total download size: 16 M
Installed size: 57 M
Downloading packages:
docker-1.13.1-74.git6e3bb8e.el FAILED
http://mirrors.zju.edu.cn/centos/7.5.1804/extras/x86_64/Packages/docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64.rpm: [Errno 12] Timeout on http://mirrors.zju.edu.cn/centos/7.5.1804/extras/x86_64/Packages/docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64.rpm: (28, 'Resolving timed out after 30568 milliseconds')
Trying other mirror.
docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64.rpm | 16 MB 00:00:39
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 2:docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64 1/1
Verifying : 2:docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64 1/1
Installed:
docker.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos
Complete!
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
[root@localhost docker]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@localhost docker]# reboot
通过reboot命令重启电脑即可。
外网配置docker国内源,默认国外的下载太慢。
[root@localhost docker]# vim /etc/docker/daemon.json
配置内容如下:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
注意:此处可使用阿里源,具体配置方式参见docker通过修改配置文件使用阿里云镜像
[root@localhost /]# systemctl restart docker 重启docker服务
[root@localhost /]# docker pull sonatype/nexus3 拉取nexus3
Using default tag: latest
Trying to pull repository docker.io/sonatype/nexus3 ...
latest: Pulling from docker.io/sonatype/nexus3
Digest: sha256:19d186d5bc8be1ea4f7bae72756baa830e79bf20aae0e9e7b1a0c7d3ce7ac136
Status: Image is up to date for docker.io/sonatype/nexus3:latest
# 由于之前已经下载过,因此Status为Imaeg is up to date for docker.io/sonatype/nexus3:latest。表示已经下载过该镜像
首先查看一下本地的镜像,使用docker images命令。
对于没有私有仓库来说,将本地镜像放到其它服务器上执行时,我们可以使用save和load方法,前者用来把镜像保存一个tar文件,后台从一个tar文件恢复成一个镜像,这个功能对于我们开发者来说还是很方便的!
[root@localhost tmp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/sonatype/nexus3 latest 777b20c20405 2 weeks ago 505 MB
[root@localhost tmp]# docker save -o nexus_iso.tar sonatype/nexus3
[root@localhost tmp]# ls
abrt
docker
nexus_iso.tar
可以看到nexus_iso.tar压缩包已经生成了。之后则可以在内网使用docker load命令把压缩包转换成镜像。
首先创建数据目录
[root@localhost nexus-data]mkdir –p /usr/nexus-data
[root@localhost nexus-data]# pwd
/usr/nexus-data
[root@localhost nexus-data] chown –R 200 /usr/nexus-data
注意:chown很关键,不然会报错问题总结
使用下载的镜像通过docker命令创建容器
[root@localhost tmp]# docker run -d -p 8081:8081 --name nexus -v /usr/nexus-data:/nexus-data sonatype/nexus3
/usr/bin/docker-current: Error response from daemon: Conflict. The container name "/nexus" is already in use by container b24e7dcd1aa99a3ef8c6c25860de5b0e6022a32fda31e54789161f477e08f756. You have to remove (or rename) that container to be able to reuse that name..
See '/usr/bin/docker-current run --help'.
[root@localhost tmp]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b24e7dcd1aa9 sonatype/nexus3 "sh -c ${SONATYPE_..." 17 hours ago Exited (255) 49 minutes ago 0.0.0.0:8081->8081/tcp nexus
[root@localhost tmp]# docker start b24e7dcd1aa9
b24e7dcd1aa9
[root@localhost tmp]#
此时既可以通过网页进行访问nexus,即私服网页
访问网址虚拟机IP:8081,由于本次安装的虚拟机IP为192.168.0.165,如下访问:
192.168.0.165:8081
登陆网页,用户名为admin,密码为admin123
点击
settings->Repository->Repositories
,弹出如下界面:
点击maven-central修改:
修改Remote storage:
http://maven.aliyun.com/nexus/content/groups/public
打开IDEA配置自定义的settings.xml,settings.xml内容如下:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>C:\apache-maven-3.3.9\conf\repositorylocalRepository>
<mirrors>
<mirror>
<id>my mavennid>
<name>my mavenname>
<url>http://192.168.0.165:8081/repository/maven-central/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
settings>
注意:settings.xml文件中中的url 地址为虚拟机的ip,此处url获得参见4.1.7修改中央仓库代理配置
在pom.xml文件上,右击maven->Reimport,即可看到正在私服下载相关依赖,如果私服不存在,即会从阿里云上下载到私服。
此时可以看到很多标红的,是因为自己把本地仓库删掉,IDEA找不到相应的库。使用命令Import Changes触发下载依赖
待下载完成,则会变成黑色。
在此演示使用mvn 命令下载fastjson-1.2.32.jar。
首先修改POM,在中添加fastjson-1.2.32的依赖,确保基本坐标正确。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.cetc52groupId>
<artifactId>downloadartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<name>downloadname>
<url>http://maven.apache.orgurl>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.32version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>3.8.1version>
<scope>testscope>
dependency>
dependencies>
project>
在POM所在目录执行如下的命令
mvn dependency:sources -DdownloadSources=true -DdownloadJavadocs=true
此命令会同时拉取依赖,sources和javadoc
D:\Git\test\download>mvn dependency:sources -DdownloadSources=true -DdownloadJavadocs=true
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------< com.cetc52:download >-------------------------
[INFO] Building download 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from nexus: http://172.20.10.4:8081/repository/maven-central/com/alibaba/fastjson/1.2.32/fastjson-1.2.32.pom
Downloaded from nexus: http://172.20.10.4:8081/repository/maven-central/com/alibaba/fastjson/1.2.32/fastjson-1.2.32.pom
(4.9 kB at 2.6 kB/s)
Downloading from nexus: http://172.20.10.4:8081/repository/maven-central/com/alibaba/fastjson/1.2.32/fastjson-1.2.32.jar
Downloaded from nexus: http://172.20.10.4:8081/repository/maven-central/com/alibaba/fastjson/1.2.32/fastjson-1.2.32.jar
(466 kB at 266 kB/s)
[INFO]
[INFO] --- maven-dependency-plugin:2.8:sources (default-cli) @ download ---
Downloading from nexus: http://172.20.10.4:8081/repository/maven-central/com/alibaba/fastjson/1.2.32/fastjson-1.2.32-sou
rces.jar
Downloaded from nexus: http://172.20.10.4:8081/repository/maven-central/com/alibaba/fastjson/1.2.32/fastjson-1.2.32-sour
ces.jar (303 kB at 243 kB/s)
Downloading from nexus: http://172.20.10.4:8081/repository/maven-central/junit/junit/3.8.1/junit-3.8.1-sources.jar
Downloaded from nexus: http://172.20.10.4:8081/repository/maven-central/junit/junit/3.8.1/junit-3.8.1-sources.jar (58 kB
at 77 kB/s)
[INFO]
[INFO] The following files have been resolved: # 已解决依赖
[INFO] com.alibaba:fastjson:jar:sources:1.2.32:compile
[INFO] junit:junit:jar:sources:3.8.1:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.083 s
[INFO] Finished at: 2019-06-09T20:21:29+08:00
[INFO] ------------------------------------------------------------------------
D:\Git\test\download>
D:\Git\test\download>
之前自己删除了本地仓库
C:\apache-maven-3.3.9\conf\repositorycat
点击进去,可以查看到sources和jar同时下了下来。
此时便可以把私服挪进内网了。还要进行如下的步骤:
由于目录/usr/nexus-data目录为由镜像nexus所起的容器的关联容器,因此,只要把该数据目录打包,拷贝进入内网。
首先stop容器
[root@localhost nexus-data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b24e7dcd1aa9 sonatype/nexus3 "sh -c ${SONATYPE_..." 18 hours ago Up 50 minutes 0.0.0.0:8081->8081/tcp nexus
[root@localhost nexus-data]# docker stop b24e7dcd1aa9
b24e7dcd1aa9
然后执行tar命令把数据目录备份
[root@localhost nexus-data]# pwd
/usr/nexus-data
[root@localhost nexus-data]# tar cvf nexus.tar /some
/usr/nexus-data/cache/bundle96/bundle.info
/usr/nexus-data/cache/bundle96/version0.0/
/usr/nexus-data/cache/bundle96/version0.0/bundle.jar
/usr/nexus-data/cache/bundle96/version0.0/revision.location
/usr/nexus-data/cache/bundle97/
/usr/nexus-data/cache/bundle97/bundle.info
/usr/nexus-data/cache/bundle97/version0.0/
/usr/nexus-data/cache/bundle97/version0.0/bundle.jar
/usr/nexus-data/cache/bundle97/version0.0/revision.location
/usr/nexus-data/cache/bundle98/
/usr/nexus-data/cache/bundle98/bundle.info
/usr/nexus-data/cache/bundle98/version0.0/
然后把所有的文件拷贝进入内网,拷贝的材料如下:
在相同Centos版本比如在开发机安装的Centos版本如下:
[root@localhost docker]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
确保内外网的Centos版本一致。
首先要在内网安装docker,cd到rpm所在目录
执行命令
[root@localhost tmp]# rpm -Uvh *
warning: audit-2.8.1-3.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
preparing… ############################### [100%]
Updating / installing…
1:libsepol-2.5-8.1.el7 ############################## [100%]
2:libselinux-2.5-l2.el7 ############################## [100%]
…
3:docker-2:1.13.1-63.git94f4240.el7 ################################### [100%]
使用docker load –i nexus_iso.tar,装载镜像。
[root@localhost ~]# docker load -i nexus.tar
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
该问题遇到,请重启docker服务
[root@localhost ~]# service docker restart
Redirecting to /bin/systemctl restart docker.service
[root@localhost ~]# docker load -i nexus_iso.tar
1d31b5806ba4: Loading layer [=======================>] 208.3MB/208.3 MB
147340bc3324: Loading layer [=======================>] 5.12 kB/5.12kB
147340bc3324: Loading layer [=======================>] 306.6 MB/306.6B
Loaded image: docker.io/sonatype/nexus3:latest
操作如下:
tar xvf nexus.tar
mv ./some / # 拷贝到根目录下生成目录/usr/nexus-data/
chown -R 200 /usr/nexus-data/
[root@localhost ~]# doker run –d –p 8081:8081 --name -v /usr/nexus-data/:/nexus-data sonatype/nexus3
c8ffadffad126739783ff83733rj3fhfjhajfdafh8238
使用内网虚拟机IP登陆sonatype nexus Repository,注意使用虚拟机ip
192.168.95.101:8081
登录名和密码依然为admin和admin123
这表示内部在内网已经运行成功了。
使用docker ps -a,可以看到由镜像模板装载的容器列表。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
50336317ab6f sonatype/nexus3 "sh -c ${SONATYPE_..." 2 days ago Exited (137) 20 minutes ago
可以使用docker restart/start/stop 50336317ab6f对该容器进行重启,停止,重新启动。
[root@kvm ~]# docker pull sonatype/nexus3
latest: Pulling from centos
47d44cb6f252: Already exists
6fdebd7b0eb5: Already exists
a63aae4d216f: Already exists
Digest: sha256:381f21e4c7b3724c6f420b2bcfa6e13e47ed155192869a2a04fa10f944c78476
Status: Image is up to date for centos:latest
[root@kvm ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos latest bb3d629a7cbc 3 weeks ago 196.6 MB
[root@kvm ~]# docker rmi bb3d629a7cbc
Untagged: centos:test-img2
[root@kvm ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos latest bb3d629a7cbc 3 weeks ago 196.6 MB
test-img latest bb3d629a7cbc 3 weeks ago 196.6 MB
再经过一段时间的开发之后,或许在外网又重新下载了许多依赖包。需要重新再次导入内网。操作如下:
将外网的数据拷贝重新拷贝进入内网
docker run -d -p 8081:8081 --name nexus -v /usr/nexus-data:/nexus-data sonatype/nexus3
使用
docker logs container_id
报错如下:
mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
OpenJDK 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory
Warning: Cannot open log file: ../sonatype-work/nexus3/log/jvm.log
Warning: Forcing option -XX:LogFile=/tmp/jvm.log
java.io.FileNotFoundException: ../sonatype-work/nexus3/tmp/i4j_ZTDnGON8hezynsMX2ZCYAVDtQog=.lock (No such file or directory)
at java.io.RandomAccessFile.open0(Native Method)
at java.io.RandomAccessFile.open(RandomAccessFile.java:316)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:243)
at com.install4j.runtime.launcher.util.SingleInstance.check(SingleInstance.java:72)
at com.install4j.runtime.launcher.util.SingleInstance.checkForCurrentLauncher(SingleInstance.java:31)
at com.install4j.runtime.launcher.UnixLauncher.checkSingleInstance(UnixLauncher.java:88)
at com.install4j.runtime.launcher.UnixLauncher.main(UnixLauncher.java:67)
Unable to update instance pid: Unable to create directory /nexus-data/instances
/nexus-data/log/karaf.log (No such file or directory)
Unable to update instance pid: Unable to create directory /nexus-data/instances
解决方式:
chown –R 200 /usr/nexus-data
在外网虚拟机上运行的虚拟机ip一般与内网虚拟机ip地址是不同的,因此当把下拉好的nexus-data(jar包数据)放进内网之后。
使用如下命令运行:
docker run -d -p 8081:8081 --name nexus -v /usr/nexus-data:/nexus-data sonatype/nexus3
比如说在内网,虚拟机和主机的ip地址分别为
192.168.1.102 虚拟机
此时,打开nexus网页,可以看到私服的url已经修改为
http://10.53.30.250/repository/maven-central/
应该把该私服的url写进内网的settings.xml,这样import时才会从中央仓库把jar包拉取到私服和本地仓库中,不然会出现许多的.lastUpdated文件。
关于此类lastUpdated的处理参见maven仓库中的LastUpdated文件生成原因及删除。
创建批处理文件cleanLastUpdated.bat
@echo off
rem create by NettQun
rem 这里写你的仓库路径
set REPOSITORY_PATH=D:\Java\maven-repository\maven-aliyun\repository
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
echo %%i
del /s /q "%%i"
)
rem 搜索完毕
pause
6.2.2 Linux删除.lastUpdated
创建shell脚本cleanLastUpdated.sh
# create by NettQun
# 这里写你的仓库路径
REPOSITORY_PATH=~/Documents/tools/repository
echo 正在搜索...
find $REPOSITORY_PATH -name "*lastUpdated*" | xargs rm -fr
echo 搜索完
至此,内网搭建maven私服的过程总结完毕。整个过程并不复杂。对jar包依赖的解决,maven私服的确是一个不错的方式。
花了好久的时间,总算自己也算能够使用docker辅助自己做私服了,虽然事后才发现原来nexus网站上已经提供了war包用来方便的进行私服的管理,但这是后话了。至于如何使用war包部署的博客在之后再写吧。比较简单,只要在本地安装一个Tomcat即可,把war丢入Tomcat安装目录下的webapps下即可。至于nexus网站的介绍随后再进行吧。
maven私服搭建.pdf
2019年6月9日21:15:58端午第三天于马塍路36号