千家信息网

如何搭建私有镜像仓库

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"如何搭建私有镜像仓库",在日常操作中,相信很多人在如何搭建私有镜像仓库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何搭建私有镜像仓库"的疑惑有所帮
千家信息网最后更新 2026年11月02日如何搭建私有镜像仓库

这篇文章主要介绍"如何搭建私有镜像仓库",在日常操作中,相信很多人在如何搭建私有镜像仓库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何搭建私有镜像仓库"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Docker容器

什么是docker

docker是一个的容器实现,包括三个基本概念:

  • 镜像(Image): Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

  • 容器(Container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • 仓库(Repository): 仓库可看成一个代码控制中心,用来保存镜像。

开启远程访问

docker开启远程访问有两种方式:

Configuring remote access with systemd unit file

编辑docker.service,添加-H fd:// -H tcp://127.0.0.1:2375启动参数,然后重新加载配置并重启

 $ sudo systemctl daemon-reload $ sudo systemctl restart docker.service
Configuring remote access with daemon.json

修改docker进程配置文件,添加hosts。(本文采用的方式)

  1. Set the hosts array in the /etc/docker/daemon.json to connect to the UNIX socket and an IP address, as follows:

{  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]}
  1. Restart Docker.

  2. Check to see whether the change was honored by reviewing the output of netstat to confirm dockerd is listening on the configured port.

$ sudo netstat -lntp | grep dockerdtcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

systemd vs daemon.json Configuring Docker to listen for connections using both the systemd unit file and the daemon.json file causes a conflict that prevents Docker from starting.

客户端访问远程docker进程需要配置环境变量:
DOCKER_HOST=tcp://172.31.0.250:2375

搭建私有镜像仓库

镜像仓库是集中存放docker镜像的地方,Docker Hub就是一个公共的镜像仓库。而在公司内使用,我们需要一个私有的仓库。 可以参照https://github.com/Quiq/docker-registry-ui中的example方案进行部署。该部署方案使用docker-compose,共包含三部分:

  1. register 最重要的镜像仓库服务

  2. register-ui 仓库的web ui

  3. httpd 前置http服务

docker-compose.yml文件如下:

version: "2.3"services:  httpd:    image: httpd:2.4    ports:      - "80:80"    volumes:      - "./config/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro"  registry:    image: registry:2    ports:      - "5000"    volumes:      - "./data/registry:/var/lib/registry"    healthcheck:      test: ["CMD", "wget", "-S", "localhost:5000/v2/"]      interval: 5s      timeout: 10s  registry-ui:    image: quiq/docker-registry-ui:latest    ports:      - "8000"    volumes:      - "./data/registry-ui:/opt/data"      - "./config/registry-ui.yml:/opt/config.yml:ro"    depends_on:      registry:        condition: service_healthy

从配置文件可以看到,该方案使用volumes把需要保存的数据映射到宿主机,配置文件放在./config下,数据文件放到./data下。

如果没有特殊要求,可以直接使用示例中的registry-ui.yml和httpd.conf配置文件,无需任何修改。使用docker-compose命令启动。

$ docker-compose up -d

启动后可以访问80端口的/ui进入web界面(本例中因为服务运行在本地,所以使用localhost)。

80端口的/v2请求,将被转发到镜像服务(http://registry:5000/v2)上。通过打上tag,就可以push到私服仓库了。

docker tag getting-started localhost/getting-started

如果是远程服务器,需要在客户端修改docker配置文件,增加私服的insecure配置:

$ cat /etc/docker/daemon.json{     "insecure-registries":["docker-hub.jc.com"] }

否则会遇到x509异常:

x509: certificate is valid for ingress.local, not docker-hub.jc.com

踩坑记

因为我使用rancher的ingress进行转发,结果在push的时候遇到

error parsing HTTP 413 response body: invalid character '<' looking for beginning of value: "\r\n413 Request Entity Too Large\r\n\r\n

413 Request Entity Too Large

\r\n
nginx/1.19.2
\r\n\r\n\r\n"

解决办法是在ingress的annotations中设置大小,我这里设置了1g:

annotations:    nginx.ingress.kubernetes.io/proxy-body-size: "1g"

制作docker镜像文件

制作docker镜像文件有两种方式:

  1. 使用dockerfile进行构建

$ docker build -f /path/to/a/Dockerfile .

dockerfile示例:

FROM tomcat:8-jdk8COPY target/pop-seller.war /usr/local/tomcat/webapps/ROOT.war
  1. 使用docker commit命令进行构建

$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS              NAMESc3f279d17e0a        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours                            desperate_dubinsky197387f1b436        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours                            focused_hamilton$ docker commit c3f279d17e0a  svendowideit/testimage:version3f5283438590d$ docker imagesREPOSITORY                        TAG                 ID                  CREATED             SIZEsvendowideit/testimage            version3            f5283438590d        16 seconds ago      335.7 MB

Generally, it is better to use Dockerfiles to manage your images in a documented and maintainable way.

实践

POP项目中的实践:

docker run -p 8080:3001 --add-host=pop-seller:172.31.98.102 -v /host/path/logs:/data/logs --name pop-seller-web -d docker-hub.jc.com/pop-web:v2.2
  • -d: 让容器在后台运行。

  • -p: 将容器内部使用的网络端口随机映射到我们使用的主机上。

  • -v: 主机的目录 /host/path/logs 映射到容器的 /data/logs。 以日志为例,我们是不希望容器重启后日志丢失的,对于这样的场景,就可以将日志目录挂到主机上。

  • -e: 配置环境变量。比如接了apollo配置中心的的工程需要配置env和key,那么就需要添加环境变量:"JAVA_OPTS=-Denv=fat -Dapollo.key=12345678"

  • --add-host: 增加hosts配置,容器的hosts文件中会增加一条配置,在没有配置dns的开发环境就经常需要这样配置。

到此,关于"如何搭建私有镜像仓库"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

镜像 配置 仓库 文件 容器 私有 服务 环境 学习 主机 变量 方式 方案 日志 端口 系统 实践 运行 命令 客户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 广东万易互联网科技有限公司惠州分公司 新华互联网科技学院 智能科技公司是互联网公司吗 互联网最新的科技有限公司 上游互联网科技 广州紫鲸互联网科技 一五八零互联网科技 互联网养老 桔豆科技 科技大学互联网专业好不好 小米互联网科技园设置 赶超互联网科技 微信多开 华夏恒生互联网科技013171 企晟互联网信息科技有限公司 中和天地互联网科技有限公司 银行科技岗属于互联网吗 上海互联网科技公司ppt 有人说阿里系是互联网科技企业 版纳互联网科技选哪家 宁波允成互联网科技有限公司 互联网科技工作委员会副主任毛军 狮子座互联网科技 天津摩尔互联网科技 海南科技产业互联网平台 上海电发互联网科技有限公司 互联网教育科技公司vipkid 互联网金融中的现代科技 互联网科技公司实习生 迪庆互联网科技招生 如何强化互联网金融科技
0