不知道使用docker的大家是否遇到与我一样的问题,想自己做个docker镜像私服但是:
1.官方的registry只支持命令行与api交互,做镜像管理、权限管理使用成本比较高
2.比较成熟的Harbor,个人感觉设计的太重了,得起一大堆组件,看了一眼就劝退了**
我就想要个像maven私服 nexus这种简单的玩意!!!
然后像往常一样 打开github 搜索,我相信不止我一个有这种想法,果然找到一个看着挺靠谱的开源项目
zebox/registry-admin : https://github.com/zebox/registry-admin/tree/master/app/server
github地址
首先要感谢这位作者的分享,第一眼看到ReadMe的截图,我就觉得这是我要找的东西。、
看了一下介绍,只要通过简单的配置,然后通过docker-compose启动就行了,一共就2个镜像
1.官方registry:2
2.registry-admin:master
很简单是不是,功能支持:用户管理、权限管理、镜像检索、查看、管理 足够满足我们日常使用了。
接下来就是看着官方文档一路部署,我这里再详细介绍一下我的实践过程,官方文档有些细节有遗漏,需要靠自己解决。
我所使用的模式就是基于http basic-auth的方式,做简单权限控制,这种模式下,可以支持管理到哪些账号允许访问私服,但不能细致到对于具体镜像的权限控制,因此参考:https://github.com/zebox/registry-admin/tree/master/_examples/basic_auth
ps:作者有提醒要注意把运行registry-admin需要的相关文件授权给你运行docker容器的账号
https://github.com/zebox/registry-admin/tree/master/app/server
这里,首先看到的是docker-compose.yml 这就是用于启动docker服务的docker-compose配置文件,docker-compose具体就不展开了
registry-admin一共有4个关键配置文件
1.docker-compose.yml #docker容器启动配置文件
2.basic-ra-config.yml #registry-admin运行配置文件
3.registry-config.yml #registry运行配置文件
4…htpasswd #basic-auth 加密账户文件
其中 basic-ra-config.yml 、registry-config.yml 在/config目录中,htpasswd 需要自己创建,我一个一个说
1.docker-compose.yml 容器启动配置文件
打开文件可以看到内容,这里有些地方需要调整,我进行了标注
version: '3' #这里要由2.1 改成 3
services:
registry-admin:
container_name: registry-admin #我补充的固定容器名
restart: unless-stopped
image: zebox/registry-admin:master
ports:
- 8080:80 #这里的宿主机端口8080可以根据需要修改
environment:
- RA_CONFIG_FILE=/app/config/basic-ra-config.yml #这是registry-admin 运行关键配置文件
#容器目录与素宿主机目录的映射
volumes:
- ./certs:/certs
- ./config:/app/config
- ./access:/app/access
- ./data:/app/data
- ./log:/app/log #我添加了一个日志文件存储目录
#原著没有,我补充的指定容器加入mynetwork自定网络,并且固定ip,ip可以调整,单必须跟自定义网络配置的网段适配
networks:
mynetwork:
ipv4_address: 172.20.0.3
registry:
container_name: registry #我补充的固定容器名
restart: unless-stopped
image: registry:2
ports:
- 50554:5000
volumes:
- ./data:/var/lib/registry
- ./certs:/certs
- ./config/registry-config.yml:/etc/docker/registry/config.yml #这是registry运行关键配置文件
- ./access:/etc/docker/registry/access
depends_on:
- registry-admin
#原著没有,我补充的指定容器加入mynetwork自定网络,并且固定ip,ip可以调整,单必须跟自定义网络配置的网段适配
networks:
mynetwork:
ipv4_address: 172.20.0.3
#原著没有,我补充的自定义网络配置
networks:
mynetwork: #通过 docker network create --subnet=172.20.0.0/24 mynetwork
external: true
这里我补充了创建自定义网络与设置2个容器加入网络,并固定ip(这步非常关键)
主要目的是,加入同一个自定义网络的容器,网络是相互联通的,并且更关键的是可以通过http://container_name/直接访问目标容器提供的http url,简单点说类似于配置hosts,这样就不需要在basic-ra-config.yml、registry-config.yml 的服务配置中硬编码ip地址,固定ip是因为我不想让容器ip来回跳,方便以后管理。
2.basic-ra-config.yml
hostname: 127.0.0.1
registry:
host: http://registry #按照我刚才做的自定义网络配置,在容器正好启动后,这个url才可以访问
port: 5000
auth_type: basic
htpasswd: /app/access/.htpasswd #这个文件需要用apache2-utils 生成
login: admin
password: super-secret # 这个是管理员默认密码,可以修改,但同步要修改registry-config.yml中对应的配置
#我添加的关于日志配置,还有其他配置,可以自行查看项目官网
logger:
enabled: true
filename: /app/log/access.log
max_size: 20M
max-backups: 3
store:
type: embed
admin_password: super-secret # 这个是registry-admin内嵌数据库的密码,可以修改,不一定非要跟上面保持一致
embed:
path: /app/data/store.db
3.registry-config.yml
version: 0.1
log:
accesslog:
disabled: false
level: info #我将debug 改成 info
formatter: text
fields:
service: registry
storage:
filesystem:
rootdirectory: /var/lib/registry
maxthreads: 100
delete:
enabled: true
http:
addr: ":5000"
net: tcp
auth:
htpasswd:
realm: basic-realm
path: /etc/docker/registry/access/.htpasswd #这个文件跟basic-ra-config.yml 使用同一个文件即可
notifications:
events:
includereferences: true
endpoints:
- name: ra-listener
disabled: false
url: http://registry-admin/api/v1/registry/events #按照我刚才做的自定义网络配置,在容器正好启动后,这个url才可以访问
headers:
# 'admin:super-secret' base64 encode string 如果改了basic-ra-config.yml中admin的默认密码,这里需要将"admin:${新密码}"重新生成并进行修改配置,
Authorization: [ Basic YWRtaW46c3VwZXItc2VjcmV0]
timeout: 1s
threshold: 5
backoff: 3s
ignoredmediatypes:
- application/octet-stream
ignore:
mediatypes:
- application/octet-stream
4.htpasswd
#安装Apache的htpasswd工具 生成账号配置文件
sudo apt-get install apache2-utils
#生成文件
htpasswd -Bc /path/to/htpasswd $username $password #可以随便先初始化一个账号
部署过程,创建目录结构如下
/registry-admin 该目录下存放 docker-compose.yml
/certs
/config 该目录下存放 basic-ra-config.yml 、registry-config.yml
/access 在该目录下生成 .htpasswd文件
/data
/log
按照我文中堆配置文件的修改,对配置文件进行调整
通过chown -R 将registry-admin以及子目录与文件,都授权给运行docker的用户
启动服务
**
进入到/registry-admin中,运行 docker-compose -p registry-admin -f ./docker-compose.yml. up -d
-p 是为了指定一个项目名称,个人习惯
配置里已经指定了自启动,以后只要docker主进程启动,这2服务就会启动
停止服务并卸载容器
docker-compose -p registry-admin -f ./docker-compose.yml. down
一切正常的话,通过宿主机的ip:8080(根据自己配置的端口来) 访问,可以打开私服登录页面
输入之前配置的admin 密码可以登录
登录成功后,点击“Repositories” 可以查看,管理镜像
如果显示
可以点击SYNC手动同步
一般来说 Registry是通过事件触发(push之类的)上报数据给registry-admin,同时也支持registry-admin主动同步
如果遇到什么问题,可查看日志
registry-admin的日志就在之前创建的log目录下面
registry的日志在 /var/lib/docker/${registry的 container_id}/下
更细致的使用功能,大家可以自行探索。