文章目录
- 前言
- 如何搭建私有仓库
- 第一节 创建无认证私服
- 1. 创建私服
- 2. 测试
- 第二节 创建安全私服
- 1. 创建私服(有认证)
- 2. 测试
- 3. 退出登录
- 关于错误
- 问题1: 登录失败x509: certificate relies on legacy Common Name field
前言
Dockerhub是docker官网的仓库,国内的加载速度比较慢。搭建一个私有的镜像仓库,提高速度,保存私有的镜像文件。
docker提供了registry 镜像用于私有仓库的搭建。
如何搭建私有仓库
第一节 创建无认证私服
1. 创建私服
- 启动registry创建私有仓库 ,可以访问http://106.13.2.249:5000/v2/_catalog。此时仓库没有任何内容,。
#启动私服并挂载镜像文件
docker run -di --name myregistry -p 5000:5000 -v /home/docker_registry:/var/lib/registry registry
2. 测试
- 修改配置
vim /etc/docker/daemon.json
添加信任的私服
{ "insecure-registries": ["106.13.2.249:5000"] }
2. 重新加载配置和重启
# 重新加载某个服务的配置文件
systemctl daemon-reload
# 重新启动 docker
systemctl restart docker
- 拉取一个镜像用来测试
#拉取镜像用来测试
docker pull hello-world
2. 推送镜像到私有仓库,此时再次刷新页面,可以看到镜像里新增了刚刚push的镜像。
#标记镜像
docker tag hello-world 106.13.2.249:5000/myhello-world:1.0
#推送镜像到私有仓库
docker push 106.13.2.249:5000/myhello-world:1.0
第二节 创建安全私服
前面我们配置了一个不需要安全认证的私有仓库。但是生产环境中,肯定要保证安全,需要安全认证。
1. 创建私服(有认证)
- 创建目录 用于存放证书
mkdir -p /usr/local/registry/certs
- 生成证书,按照要求输入内容
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/registry/certs/domain.key -x509 -days 365 -out /usr/local/registry/certs/domain.crt
- 生成鉴权文件
(1) 创建目录
#创建目录
mkdir -p /usr/local/registry/auth
(2) 安装htpasswd(如果未安装htpasswd,请先安装htpasswd)
- centos安装htpasswd
yum -y install httpd
- ubuntu安装htpasswd
sudo apt-get install apache2-utils
(3) 生成用户名和密码写入到文件
# 创建用户和密码hello/123456
htpasswd -Bbn hello 123456 > /usr/local/registry/auth/htpasswd
如需要了解htpasswd相关的命令,请见:htpasswd的使用
- 创建仓库(前面章节已经创建过了的话,需要删除已经创建的容器)
#删除已经创建的容器
docker rm -f myregistry
#创建registry
docker run -di --name myregistry -p 5000:5000 \
-v /home/docker_registry:/var/lib/registry \
-v /usr/local/registry/certs:/certs \
-v /usr/local/registry/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry
2. 测试
真实场景,镜像服务器和docker客户端肯定不在同一台服务器,所以下面的操作在另一台服务器(docker客户端)执行。(当然也可以在同一台机测试)
- 添加信任的私服
- 修改配置
vim /etc/docker/daemon.json
添加信任的私服
{ "insecure-registries": ["106.13.2.249:5000"] }
- 重新加载配置和重启
# 重新加载某个服务的配置文件
systemctl daemon-reload
# 重新启动 docker
systemctl restart docker
- 拉取一个镜像用来测试
#拉取镜像用来测试
docker pull hello-world
4. 推送镜像到私有仓库,此时发现push失败,提示需要认证,表示我们的镜像服务器需要登录。
#标记镜像
docker tag hello-world 106.13.2.249:5000/myhello-world:1.0
#推送镜像到私有仓库
docker push 106.13.2.249:5000/myhello-world:1.0
- 登录服务器,输入创建的用户名和密码
docker login 106.13.2.249:5000
- 再次执行push操作,可以push成功
#推送镜像到私有仓库
docker push 106.13.2.249:5000/myhello-world:1.0
- 拉取刚刚创建的镜像
#拉取镜像前,可以先删除这个镜像,避免使用本地镜像
docker rmi hello-world
#拉取刚刚推送到服务器的镜像
docker run 106.13.2.249:5000/myhello-world:1.0
3. 退出登录
docker logout 106.13.2.249:5000
关于错误
问题1: 登录失败x509: certificate relies on legacy Common Name field
Error response from daemon: Get "https://106.13.2.249:5000/v2/": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
解决方案:
请检查是否添加私服信任,并重启docker。按照文中测试demo流程重新执行一遍。