云原生架构下的开发,要求可以自动化测试、构建、部署。这就要求网络带宽必须足够快,否则每次构建时需要等待较长时间,甚至于出现因为下载超时而失败的情况。因此,在一个完善的DevOps环境下,必须对常用的Yum、Maven、Nuget、NPM和Docker实施本地Registry Mirror。
(到底应该用Repository还是Registry,我也没搞清楚。NPM、Docker应该使用Registry,而Yum、Maven、Nuget应该是Repository)
在分析了众多缓存软件后,我们还是建议使用SonaType的Nexus3来作为本地Repository缓存。
服务器准备
我们建议安装一台虚机,在之上以Docker形式提供各类服务,而不是分散安装很多虚拟机。
以最小化形式安装CentOS 7,并做好相应的准备,譬如SELinux、NTPDate以及系统限制等,然后安装Docker CE最新版。
由于作为本地镜像缓存,所以需要较大空间的存储空间,本例中单独挂载 /data 文件夹。
初始化为Docker Swarm,以便于我们后续使用Stack部署。
docker swarm init
部署nginx和sonatype/nexus3
docker pull nginx
docker pul sonatype/nexus3
准备文件夹
注意:由于Nexus以ID为200的用户来运行,因此需要设置文件夹Owner为200
mkdir -p /data/nexus-data /data/nginx
chown -R 200 /data/nexus-data
撰写 nexus-stack.yml
version: "3"
services:
nexus:
image: sonatype/nexus3:latest
deploy:
restart_policy:
condition: on-failure
ports:
- "8081:8081"
- "8082:8082"
volumes:
- /data/nexus-data:/nexus-data
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- /data/nginx/nginx.conf:/etc/nginx/nginx.conf
- /data/nginx/shmtu.crt:/etc/nginx/shmtu.crt
- /data/nginx/shmtu.key:/etc/nginx/shmtu.key
准备nginx.conf文件
events {
worker_connections 4096; ## Default: 1024
}
http{
tcp_nodelay on;
client_max_body_size 1G;
ssl_certificate /etc/nginx/shmtu.crt;
ssl_certificate_key /etc/nginx/shmtu.key;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
#ssl_prefer_server_ciphers on;
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name repo.shmtu.edu.cn;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass http://nexus:8083;
#proxy_read_timeout 90;
proxy_redirect off;
}
}
}
其中的SSL证书需要根据实际情况提供。
部署Docker服务
docker stack up -f nexus-stack.yml nexus
这需要等待一点时间。具体可以通过docker logs -f
来查看启动进程。
待启动完毕后,我们就可以对nexus进行配置。
配置Nexus
修改密码
访问 http://repo.shmtu.edu.cn:8081/,用admin进行登录,初始密码为admin123,登录后修改密码。
创建Blob Store
默认的blob store为default
,我们可以针对不同的Repository设置不同的存储位置。因此我们需要根据实际情况进行创建。
名称 | 作用 |
---|---|
npm-private | 本地NPM Registry |
npm-proxy | 远端NPM Registry Proxy |
npm-group | 统一访问的Registry URL |
docker-private | 本地Docker Registry |
docker-proxy | 远端 Docker Registry Proxy |
docker-group | 统一访问的Docker Registry URL |
创建并使用NPM Registry
创建本地 NPM Registry
按照如图所示的配置创建本地NPM Registry。
相应的配置为:
选项 | 值 |
---|---|
Name | npm-private |
Online | checked |
Blob store | 选择 npm-private |
Deployment policy | 选择 Allow redploy |
其他不用做出改变。
创建远端 NPM Registry Proxy
选项 | 值 |
---|---|
Name | npm-proxy |
Online | checked |
Blob store | 选择 npm-proxy |
Remote storage | https://registry.npmjs.org |
创建NPM Registry Group
选项 | 值 |
---|---|
Name | npm-group |
Online | checked |
Blob store | 选择 npm-group |
Group | 添加刚刚创建的 npm-private, npm-proxy |
以上操作完成,则npm registry mirror已经部署好,对外提供只需要知道 npm-group的url即可:http://repo.shmtu.edu.cn:8081/repository/npm-group/
。
客户端使用Registry Mirror
客户端使用方法有两种:
- 在项目根目录下创建
.npmrc
文件:
registry=http://repo.shmtu.edu.cn:8081/repository/npm-group/
- 直接在命令行里使用
--registry
参数
npm --registry=http://repo.shmtu.edu.cn:8081/repository/npm-group/ install
创建并使用 Docker Registry
Docker Registry的创建方法与NPM Registry类似,只是Docker建议使用HTTPS访问,因此我们使用nginx作为反向代理,并配置了SSL证书。
创建 Local Registry
选项 | 值 |
---|---|
Name | docker-private |
Online | 选中 |
Respository Connectors - HTTP | 选中,并输入8082 |
Allow anonymous docker pull | 选中 |
Blob store | 选择 docker-private |
Deployment policy | 选择 Allow redeploy |
创建 Registry Proxy
选项 | 值 |
---|---|
Name | docker-proxy |
Online | 选中 |
Allow anonymous docker pull | 选中 |
Remote stroage | https://registry-1.docker.io |
Docker index | Use Docker Hub |
创建 Registry Group
选项 | 值 |
---|---|
Name | docker-group |
Online | 选中 |
Respository Connectors - HTTP | 选中,并输入8083 |
Allow anonymous docker pull | 选中 |
Blob store | 选择 docker-group |
Group - Member repositories | 选择 docker-private 和 docker-proxy |
客户端使用方法
在这儿只讲述在CentOS下配置Registry Mirror:
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://repo.shmtu.edu.cn"
]
}
EOF
systemctl restart docker
输入docker pull mysql
进行测试,回到nexus中,可以看到已经有mysql了。
总结
sonatype/nexus的部署和配置还有很多选项,譬如LDAP集成、访问代理等配置请参考产品帮助。
通过以上配置,我们基本上可以快速部署拉Docker镜像,也可以快速npm install模块了。节约了大量时间,提高了自动化CI/CD的效率。