搭建Docker私有镜像服务器

news2024/11/17 14:34:36

一、前言

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1分钟速通Webservice服务端和客户端

服务端实现: 我们随便实现一个简单服务,客户请求我们的服务,我们给客户返回响应的信息 WebService public class HelloServiceImpl implements HelloService {Overridepublic String getString(String name) {return "hello," n…

使用numpy处理图片——基础操作

大纲 准备工作图片像素大小修改透明度 numpy是一款非常优秀的处理多维数组的Python基础包。在现实中,我们最经常接触的多维数组相关的场景就是图像处理。本系列将通过若干篇对图像处理相关的探讨,来介绍numpy的使用方法,以获得直观的体验。 本…

主食冻干哪款好?十大放心主食冻干名单推荐

作为养猫的人,我们都知道每天最担心的事情就是如何为心爱的猫咪选择一款高品质的猫粮。我们都希望为猫咪提供最好的营养,让它们健康快乐地成长。然而,近期的一些事件,如百利猫粮生虫和VE主食冻干掰开有虫,让我们不得不…

【开源商城推荐-LGPL-3.0】ts-mall 聚惠星商城

dts-shop: 聚惠星商城 DTS-SHOP,基于 微信小程序 springboot vue 技术构建 ,支持单店铺,多店铺入驻的商城平台。项目包含 微信小程序,管理后台。基于java后台语言,已功能闭环,且达到商用标准的一套项目体…

AI文本朗读应用(二)

调用api实现TTS 注:如对api的使用有任何疑问,可以查阅文本转语音 REST API。 选择右侧“解决方案资源管理器”中的“TTS_Demo”,右键选择“添加”->“新建项”。 选择“类”,名称为“Authentication.cs”,点击“添…

【漏洞复现】锐捷EG易网关cli.php后台命令执行漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关,由锐捷网络完全自主研发。它集成了先进的软硬件体系架构,配备了DPI深入分析引擎、行为分析/管理引擎,可以在保证网络出口高效转发的条件下,提供专业的流控功能、出色的URL过滤以及本地化…

14:00面试,14:07就出来了,问的问题有点变态。。。

前言 刚从小厂出来,没想到在另一家公司我又寄了。 在这家公司上班,每天都要加班,但看在钱给的比较多的份上,也就不太计较了。但万万没想到一纸通知,所有人不准加班了,不仅加班费没有了,薪资还…

Zustand 状态管理

Zustand 状态管理 安装创建 Store给 Store 添加TS类型约束在页面使用 Store返回 Store 中所有状态在 Store 中使用 async 异步方法使用 Immer Middleware (中间件) 更新深层嵌套的 State使用 get 方法,在 set 方法外访问 State 中的数据使用 selector什么是 selecto…

炫技作品!极好!独家原创!一种新型改进的蜣螂优化算法(CCCDBO)

炫技作品!,独家原创! 蜣螂优化算法DBO的含金量不用我多介绍了吧,这是和麻雀优化算法SSA同一个课题组出的算法,业内公认的比较好的算法,这个算法认可度很高! 一种新型改进蜣螂优化算法&#xf…

【web缓存】nginx和CDN应用

目录 一、代理的工作机制 二、代理服务器的概念 三、代理服务器的作用 四、常用的代理服务器 五、nginx缓存代理部署 步骤一:首先脚本完成三台nginx的部署 步骤二:在两个后端原始服务器上分别创建测试页面 步骤三:完成nginx缓存服务器…

中央处理器CPU(2)---流水CPU与RISC

1.流水CPU (一看到这个就想起老家的流水席了,不知道各位吃过没。) 🌈1.1并行处理技术 对于计算机来说不论如何发展,最重要的一个追求目标就是很高的运算速度,冯诺依曼机是,现代计算机依然是&…

高效实用的电商数据分析产品之店铺分析如何入手?

在电商行业,如何做好店铺分析?应该从哪几个方面进行? 1、寻找竞品店铺 在众多店铺中找到与自己风格(定位/用户群体等)相仿的相关竞争对手的标签。研究竞品店铺中爆款产品作为一个店铺运营(新品开发等&…

HubSpot CRM:卓越客户服务的关键引擎

在数字化时代,提供卓越的客户服务是企业成功的关键之一。HubSpot CRM以其强大的功能和灵活性,成为实现卓越客户服务的关键引擎,以下是强调HubSpot CRM在客户服务中的应用的关键方面: 1. 全面的客户视图 HubSpot CRM集成了全面的…

解决:接口中返回的文本不能保持原本格式也无法换行

一、问题&#xff1a; 原本传入的文本是有换行的&#xff0c;但是用div展示接口返回的文本&#xff0c;所示内容没有保持原有格式没达到换行效果 以下是传入到接口的文本格式 使用div标签展示接口返回的文本&#xff0c;但并没有保持原有格式&#xff0c;文本也没换行 <di…

docker 容器添加指定网络地址

docker 容器添加指定网络地址 在搭建halo博客时&#xff0c;准备让 halo、mysql8.1、nginx 三个容器在同一个网段中&#xff0c;并指定IP。 实现docker内部容器之间网络互通。 查看容器网络信息命令 docker inspect 容器名各容器部署成功后网络效果如下&#xff1a; nginx …

城堡世界源码

随着数字技术的飞速发展和人们对于娱乐需求的不断提升&#xff0c;城堡世界源码开发逐渐成为了新的热门话题。城堡世界是一个集潮流、艺术、科技于一体的数字娱乐新领域&#xff0c;通过将虚拟现实、增强现实等技术融入传统玩具设计中&#xff0c;为玩家们带来了全新的互动体验…

如何高效阅读Linux的man page

有时候需要在man page中查某个命令的用法&#xff0c;我们一般会使用man command的方式来查询&#xff0c;例如man vmstat.但是对于一些bash内置的命令&#xff0c;如alias,如果使用man alias会打开General Commands Manual ,如下图 可以看到&#xff0c;内置命令很多&#xff…

计算机毕业设计---ssm实验室设备管理系统

项目介绍 ssm实验室设备管理系统。前台jsplayuieasyui等框架渲染数据、后台java语言搭配ssm(spring、springmvc、mybatis、maven) 数据库mysql8.0。该系统主要分三种角色&#xff1a;管理员、教师、学生。主要功能学校实验设备的借、还、修以及实验课程的发布等等&#xff1b;…

使用kennycason.kumo.WordCloud For JAVA 制作词云图

官网&#xff1a;https://kennycason.com/posts/2014-07-03-kumo-wordcloud.html 一&#xff1a;添加POM文件 <!-- 词云 --><dependency><groupId>com.kennycason</groupId><artifactId>kumo-core</artifactId><version>1.27<…

【Verilog】期末复习——分别画出下面两个程序综合后的电路图/reg型数据和wire型数据的区别

系列文章 数值&#xff08;整数&#xff0c;实数&#xff0c;字符串&#xff09;与数据类型&#xff08;wire、reg、mem、parameter&#xff09; 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…