搭建Docker私有镜像服务器

一、前言

1、本文主要内容

  • 基于Decker Desktop&Docker Registry构建Docker私有镜像服务器测试
  • 在CentOS 7上基于Docker Registry搭建公共Docker镜像服务器
  • 修改Docker Engine配置以HTTP协议访问Docker Registry
  • 修改Docker Engine配置通过域名访问Docker Registry
  • 配置SSL证书以HTTPS协议访问Docker Registry
  • 配置Docker Registry授权,限制通过账号密码访问

2、本文环境信息

环境说明
DockerDocker CE 24.0.x
Docker Desktop4.19
WindowsWindows 11
curl for Windows7.87
CentOS7.X

二、本地私有仓库测试

1、创建私有仓库

官方的 registry 镜像来启动私有仓库

docker run -d \
-p 5000:5000 \
-v /d:/var/lib/registry \
--restart=always \
--name my-registry \
registry

2、将公开镜像推送至私有仓库

# 拉取公开镜像
docker pull kentalk/helloworld

# 修改标签
docker tag kentalk/helloworld:latest 127.0.0.1:5000/kentalk/helloworld:latest

# 将镜像推送至私有仓库
docker push 127.0.0.1:5000/kentalk/helloworld:latest

# 输出示例
Using default tag: latest
The push refers to repository [127.0.0.1:5000/kentalk/helloweb]
a04c71d5f650: Pushed
2639d32df775: Pushed
4e7f448c183e: Pushed
7136543384e6: Pushed
a8033c5c9e07: Pushed
c5517377aec9: Pushed
f389a469af97: Pushed
737e3d34f974: Pushed
5db8071bd6c0: Pushed
67974f604d8a: Pushed
latest: digest: sha256:acf69ac0db3a2624c95087cd5f84a62bacccad2d58c252d32c20e25b31ecc179 size: 2415

3、查看私有仓库镜像

# 查看私有仓库镜像
curl 127.0.0.1:5000/v2/_catalog

# 输出示例
{"repositories":["kentalk/helloworld"]}

4、使用私有仓库镜像

# 先删除本地镜像
docker image rm 127.0.0.1:5000/kentalk/helloworld:latest

# 从私有仓库拉取镜像
docker pull 127.0.0.1:5000/kentalk/helloworld

# 输出示例
latest: Pulling from kentalk/helloworld
b04fae59f135: Already exists
24cef00b9ad9: Pull complete
1db91b65282b: Pull complete
c4272e98011d: Pull complete
0485189e9a37: Pull complete
e48eb6dc3383: Pull complete
0557d7f26b8d: Pull complete
5fc49b27813c: Pull complete
87c0efbe1434: Pull complete
40f41d1ee375: Pull complete
Digest: sha256:acf69ac0db3a2624c95087cd5f84a62bacccad2d58c252d32c20e25b31ecc179
Status: Downloaded newer image for 127.0.0.1:5000/kentalk/helloworld:latest
127.0.0.1:5000/kentalk/helloworld:latest

5、查看本地镜像

# 查看镜像并过滤
docker images | findstr "127.0.0.1"

# 输出示例
127.0.0.1:5000/kentalk/helloworld   latest b218f7867548   6 weeks ago     747MB

三、私有仓库服务器搭建

1、服务器准备

参考 http://blog.ken.io/note/hyper-v-course-setup-centos 安装CentOS虚拟机

姓名年龄工作
HostNameIP操作系统版本
Docker-RegistryServer192.168.99.111CentOS

关闭防火墙或者开放80、4443、5000端口

# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disabled firewalld

# 开放端口
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --add-port=443/tcp --permanent
sudo firewall-cmd --add-port=5000/tcp --permanent
sudo firewall-cmd --reload

2、安装Docker环境

参考 https://ken.io/note/docker-install-and-quickstart 逐步安装Docker

2.1、安装准备

# 安装依赖
sudo yum install -y yum-utils

# 设置yum源
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

2.2、安装并启动

# 安装最新版本
sudo yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 启动&开机启动
sudo systemctl start docker
sudo systemctl enable docker

# 查看Docker版本
docker --version

2.3、更换国内镜像源

# 修改Docker守护进程配置
vi /etc/docker/daemon.json

# 替换为以下内容
{
    "registry-mirrors":[
        "http://hub-mirror.c.163.com"
    ]
}

# 重启Dokcer服务
sudo systemctl daemon-reload
sudo systemctl restart docker

3、创建私有仓库

# 启动私有仓库
docker run -d \
-p 80:5000 \
-v /var:/var/lib/registry \
--restart=always \
--name my-registry \
registry

4、测试仓库

在Linux Server对Docker Registry进行基本功能测试

# 拉取公开镜像
docker pull kentalk/helloworld

# 修改标签
docker tag kentalk/helloworld:latest 127.0.0.1/kentalk/helloworld:latest

# 将镜像推送至私有仓库
docker push 127.0.0.1/kentalk/helloworld:latest

# 查询私有仓库镜像
curl 127.0.0.1/v2/_catalog

5、远程访问

Docker默认不支持以HTTP远程访问,远程访问的时候会出现类似以下报错

server gave HTTP response to HTTPS client

我们可以需要修改Docker Client配置,信任不安全的Registry,以通过HTTP协议访问

Docker Desktop修改路径:Settings -> Docker Engine

Docker Linux配置文件:/etc/docker/daemon.json

Docker Windows配置文件:C:\ProgramData\docker\config\daemon.json

5.1、增加以下配置

"insecure-registries": [
  "192.168.99.111"
]

如果配置文件是空的,需带上{},满足JSON格式要求

配置完成后需要重启服务,Docker Desktop 点击「Apply & restart」按钮即可

Linux环境下的客户端可以使用命令重启

sudo systemctl daemon-reload
sudo systemctl restart docker

5.2、远程访问测试

在自己电脑上进行访问测试

# 查询仓库镜像
curl 192.168.99.111/v2/_catalog

# 输出示例
{"repositories":["kentalk/helloworld"]}

# 获取镜像
docker pull 192.168.99.111/kentalk/helloworld

# 输出示例
Using default tag: latest
latest: Pulling from kentalk/helloworld
Digest: sha256:6646ab57d7169e9905b61b8585478a42546d384e31a785f36d4a217715cd0c0b
Status: Downloaded newer image for 192.168.99.111/kentalk/helloworld:latest
192.168.99.111/kentalk/helloworld:latest

# 查看本地镜像(macOS可用grep替代findstr)
docker images | findstr "192.168.99.111"

6、通过域名访问

使用IP配置的方式不方便记忆和输入,服务器迁移后如果IP变化也比较麻烦,这里我们可以配置使用域名:d.ken.io 访问自己的Docker仓库

6.1、增加以下配置

修改Docker Client配置,信任d.ken.io,设置完成后记得重启Docker

"insecure-registries": [
  "192.168.99.111",
  "d.ken.io"
]

6.2、修改Hosts文件

修改hosts文件,增加以下配置

192.168.99.111 d.ken.io

Windows:C:\Windows\System32\drivers\etc\hosts

macOS:/private/etc/hosts

Linux:/etc/hosts

为了方便多人使用,也可以修改域名解析的方式进行设置

6.3、访问测试

# 验证hosts配置/域名解析是否生效
ping d.ken.io

# 查询仓库镜像
curl d.ken.io/v2/_catalog

# 拉取镜像
docker pull d.ken.io/kentalk/helloworld

# 推送镜像
docker pull ubuntu
docker tag ubuntu d.ken.io/ubuntu
docker push d.ken.io/ubuntu

如果域名访问测试碰到问题,可以看一下最后一个章节,可能有你想要的答案

四、配置HTTPS访问

1、创建私有仓库

之前通过HTTP访问,把80端口直接给了registry容器,这里使用5000端口,把80端口留给Nginx

# 停用并删除原有私有仓库容器
docker stop my-registry
docker rm my-registry

# 启动私有仓库
docker run -d \
-p 5000:5000 \
-v /var:/var/lib/registry \
--restart=always \
--name my-registry \
registry

2、申请免费SSL证书

在腾讯云申请域名docker.ken.io域名免费SSL证书: https://console.cloud.tencent.com/ssl/dsc/apply


申请过程此处省略,申请完成后下载Nginx类型,因为后续要通过Nginx配置HTTPS访问


可以下载到本地,解压后通过FTP等方式把证书放在RegistryServer,或者可以抓到下载链接直接下载至服务器进行解压、配置,最终保持证书为以下路径

证书类型路径
证书文件/var/cert/docker.ken.io_bundle.crt
私钥文件/var/cert/docker.ken.io.key

或者你也可以通过 https://freessl.cn/ 等平台/方式申请免费的SSL证书

3、安装Nginx并配置SSL

3.1、安装Nginx

#添加Nginx包
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

#安装
sudo yum -y install nginx

#启动服务&开机启动
sudo systemctl start nginx
sudo systemctl enable nginx

3.2、配置证书

新建docker.ken.io访问配置文件

vi /etc/nginx/conf.d/docker_registry.conf

写入Nginx配置内容,将访问域名docker.ken.io的HTTP以及HTTPS请求都转到Registry

server {
    listen 443;          #监听443端口
    server_name  docker.ken.io;    #监听的域名
    ssl on; #开启SSL
    ssl_certificate     /var/cert/docker.ken.io_bundle.crt;    #证书文件
    ssl_certificate_key /var/cert/docker.ken.io.key;    #私钥文件
    location / {                #转发或处理
        proxy_pass http://127.0.0.1:5000;
    }
}

server {
    listen 80;        #监听80端口
    server_name  docker.ken.io; #监听的域名
    location / {                #转发或处理
        proxy_pass http://127.0.0.1:5000;
    }
}

3.3、配置传输内容大小

Nginx默认只允许客户端传出1MB的内容,这不满足镜像的提交需求,可以修改Nginx的配置放开限制

# 修改配置文件
vi /etc/nginx/nginx.conf

# 在http配置项增加以下配置
http {

        ##省略其他配置##
        client_max_body_size 4096M;
        ##省略其他配置##

}

重新加载Nginx配置

nginx -s reload

4、访问测试

在测试之前需要配置域名docker.ken.io解析到192.168.99.111,或者在测试的电脑上修改host,此处就不赘述

4.1、查询镜像

# 查询私有仓库镜像
curl docker.ken.io/v2/_catalog

# 输出示例
{"repositories":["kentalk/helloworld","ubuntu"]}

4.2、拉取镜像

docker pull docker.ken.io/kentalk/helloworld

docker pull docker.ken.io/ubuntu

4.3、推送镜像

docker pull debian
docker tag debian docker.ken.io/debian
docker push docker.ken.io/debian

五、配置账号访问

Docker Registry仓库默认是没有权限限制的,意味着任意客户端都可以访问镜像,这是不安全的

Docker Registry可以开启授权验证并支持使用htpasswd管理账号密码,接下就逐步设置下

1、安装基础依赖

sudo yum install -y httpd-tools

2、配置账号

# 创建/更新账号密码
sudo htpasswd -Bc /var/docker/registry/htpasswd ken

# 根据提示输入两次密码
New password: 
Re-type new password: 

# 设置成功
Adding password for user ken

3、自定义Registry配置
创建Registry配置

sudo vi /var/docker/registry/config.yml

写入以下配置,auth部分为新增配置,其他的均为Docker Registry默认配置

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
# 新增配置
auth:
  htpasswd:
    realm: basic-realm
    path: /etc/docker/registry/htpasswd

4、重建Registry仓库

删除之前的Registry容器,创建新的Registry容器,并映射配置及密码文件

# 停用并删除原有私有仓库容器
docker stop my-registry
docker rm my-registry

# 启动私有仓库,并映射htpasswd、config.yml
docker run -d \
-p 5000:5000 \
-v /var:/var/lib/registry \
-v /var/docker/registry/htpasswd:/etc/docker/registry/htpasswd \
-v /var/docker/registry/config.yml:/etc/docker/registry/config.yml \
--restart=always \
--name my-registry \
registry

5、访问测试

5.1、未登录情况下,拉取镜像

# 拉取镜像
docker pull docker.ken.io/kentalk/helloworld

# 输出示例:no basic auth credentials
Using default tag: latest
Error response from daemon: Head "https://docker.ken.io/v2/kentalk/helloworld/manifests/latest": no basic auth credentials

5.2、登录docker.ken.io

# 登录至docker.ken.io
docker login docker.ken.io

# 输入账号密码
Username: ken
Password:

# 登录成功
Login Succeeded

5.3、拉取镜像

docker pull docker.ken.io/kentalk/helloworld

5.4、推送镜像

docker pull nginx

docker tag nginx docker.ken.io/nginx

docker push docker.ken.io/nginx

5.5、查询镜像

curl -u ken:password docker.ken.io/v2/_catalog

六、备注

1、可能碰到的问题

1.1

问题:nginx: [warn] the “ssl” directive is deprecated, use the “listen … ssl” directive instead

解决方案:在listen 443后增加ssl参数,去掉ssl on参数

server {
    listen 443 ssl;          #监听443端口
    server_name  docker.ken.io;    #监听的域名
    #ssl on; 
    ssl_certificate     /var/cert/docker.ken.io_bundle.crt;    #证书文件
    ssl_certificate_key /var/cert/docker.ken.io.key;    #私钥文件
    location / {                #转发或处理
        proxy_pass http://127.0.0.1:5000;
    }
}

1.2

问题:Error response from daemon: received unexpected HTTP status: 502 Bad Gateway

解决方案:关闭本地代理或者其他网络管控软件

2、相关阅读

https://docs.docker.com/registry/
https://docs.docker.com/registry/deploying/
https://docs.docker.com/registry/insecure/

来源:https://ken.io/note/docker-private-image-server-deploy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/308020.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

了解不同方式导入导出的速度之快

目录 一、用工具导出导入 Navicat(速度慢) 1.1、导入: 共耗时: 1.2、导出表 共耗时: 二、用命令语句导出导入 2.1、mysqldump速度快 导出表数据和表结构 共耗时: 只导出表结构 导入 共耗时&…

C#,字符串匹配算法(模式搜索)Z算法的源代码与数据可视化

Z算法也是模式搜索(Pattern Search Algorithm)的常用算法。 本文代码的运算效果: 一、Z 算法 线性时间模式搜索算法的Z算法,在线性时间内查找文本中模式的所有出现。 假设文本长度为 n,模式长度为 m,那么…

__init__中的__getattr__方法

结论: 在 __init__.py 文件中定义的 __getattr__ 方法,如果存在的话,通常用于处理包级别的属性访问。在包级别,__getattr__ 方法在导入模块时被调用,而不是在实例化包时。当你尝试访问包中不存在的属性时,__getattr__ 方法会被调用,给你一个机会来处理这个属性访问。 …

Linux第24步_安装windows下的VisualStudioCode软件

Windows下的VSCode安装后,还需要安装gcc编译器和g编译器。 gcc:编译C语言程序的编译器; g:编译C代码的编译器; 1、在Windows下安装VSCode; 双击“VSCodeUserSetup-x64-1.50.1.exe”,直到安装完成。 2、…

ride无法使用open Browser关键字

一般是版本兼容性问题。将robotframework版本降级为:3.1.2 pip install robotframework3.1.2 2、仍然没有得到解决时,查看robotframework-selenium2library版本 pip list 将robotframework-seleniumlibrary也改成3.XX的版本就可以了 pip unstall robotfr…

Git远端删除的分支,本地依然能看到 git remote prune origin

在远端已经删除ylwang_dev_786等三四个分支,本地git branch -a 时 依然显示存在。 执行 git remote show origin 会展示被删除的那些分支 当你在Git远程仓库(如GitLab)上删除一个分支后,这个变更不会自动同步到每个开发者的本地…

2024年第九届计算机与通信系统国际会议(ICCCS2024) ,邀您相约西安!

会议官网: ICCCS2024 | Xian China 时间: 2024年4月19-22日 地点: 中国西安 会议简介: 近年来,信息通信在不断发展,为计算机网络的进步与发展提供了先进可靠的技术支持。随着计算机网络与通信技术的深入发展,计算机通信技术、数…

排队免单?买东西花了钱还能拿回来?——工会排队模式

随着互联网和电子商务的迅猛发展,消费者的购物需求和期望也在不断升级。为了满足这一需求,工会排队模式作为一种创新消费体验模式应运而生。 工会排队模式是一种颠覆传统的电商模式,它通过向消费者返还现金的方式,重新定义了购物体…

《路由与交换技术》---练习题(无答案纯享版)

注意!!!这篇blog是无答案纯享版的 选择填空的答案我会放评论区 简答题可以看这里 计算题可以发私信问我(当然WeChat也成)but回讯息很慢 一、选择题 1.以下不会在路由表里出现的是: ( ) A.下一跳地址 B.网络地址 C…

Java线程池最全详解

1. 引言 在当今高度并发的软件开发环境中,有效地管理线程是确保程序性能和稳定性的关键因素之一。Java线程池作为一种强大的并发工具,不仅能够提高任务执行的效率,还能有效地控制系统资源的使用。 本文将深入探讨Java线程池的原理、参数配置…

PHP Web应用程序中常见漏洞

一淘模板(56admin.com)发现PHP 是一种流行的服务器端脚本语言,用于开发动态 Web 应用程序。但是,与任何其他软件一样,PHP Web 应用程序也可能遭受安全攻击。 在本文中,我们将讨论 PHP Web 应用程序中一些最常见的漏洞…

linux异常情况,排查处理中

登录客户环境后,发现一个奇怪情况如下图,之前也遇到过,直接fuser -ck /backup操作的话,主机将会重启,因数据库运行中,等待停机维护时间,同时也在想办法不重启的情况下解决该问题 [rootdb ~]# f…

使用西瓜视频官网来创造一个上一集,下一集的按钮,进行视频的切换操作

需求: 仿照西瓜视频写一个视频播放和上一集下一集的按钮功能 回答: 先访问官网: 西瓜播放器 这是西瓜视频的官网, 点击官网的示例按钮,可以看到相关的视频示例以及相关的代码, 我们复制下来代码,然后添加按钮和切换视频的方法, 完整代码: <!DOCTYPE html> <ht…

Hotspot源码解析-第十七章-虚拟机万物创建(三)

17.4 Java堆空间内存分配 分配Java堆内存前&#xff0c;我们先通过两图来了解下C堆、Java堆、内核空间、native本地空间的关系。 1、从图17-1来看&#xff0c;Java堆的分配其实就是从Java进程运行时堆中选中一块内存区域来映射 2、从图17-2&#xff0c;可以看中各内存空间的…

Springboot3(一、lambda、::的应用)

文章目录 一、使用lambda简化实例创建1.语法&#xff1a;2.示例&#xff1a;3.Function包3.1 有入参&#xff0c;有返回值【多功能函数】3.2 有入参&#xff0c;无返回值【消费者】3.3 无入参&#xff0c;有返回值【提供者】3.4 无入参&#xff0c;无返回值 二、类::方法的使用…

基于ssm运动会管理系统的设计与实现 【附源码】

基于ssm运动会管理系统的设计与实现 【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuil…

C2-3.3.2 机器学习/深度学习——数据增强

C2-3.3.2 数据增强 参考链接 1、为什么要使用数据增强&#xff1f; ※总结最经典的一句话&#xff1a;希望模型学习的更稳健 当数据量不足时候&#xff1a; 人工智能三要素之一为数据&#xff0c;但获取大量数据成本高&#xff0c;但数据又是提高模型精度和泛化效果的重要因…

工业智能网关:HiWoo Box远程采集设备数据

工业智能网关&#xff1a;HiWoo Box远程采集设备数据 在工业4.0和智能制造的浪潮下&#xff0c;工业互联网已成为推动产业升级、提升生产效率的关键。而在这其中&#xff0c;工业智能网关扮演着至关重要的角色。今天&#xff0c;我们就来深入探讨一下工业智能网关。 一、什么…

Apache JMeter 5.5: 新手指南

如何获取并运行 JMeter 首先&#xff0c;要使用 JMeter&#xff0c;你需要从官网获取软件包。前往 Apache JMeter 的官方页面&#xff0c;然后下载所 需的压缩文件。 配置和启动 JMeter 获取了 JMeter 后&#xff0c;由于它是无需安装即可使用的工具&#xff0c;直接解压下载…

申请企业通配符SSL证书流程

通配符SSL证书&#xff0c;又叫泛域名SSL证书&#xff0c;可以用一张SSL证书同时保护主域名以及主域名下的所有子域名。按照验证方式可以将通配符SSL证书分为DV通配符SSL证书和OV通配符SSL证书。其中OV通配符SSL证书只支持企事业单位申请&#xff0c;又称之为OV企业型通配符SSL…