【Docker】搭建 Docker 镜像仓库

文章目录


前言:公有仓库和私有仓库

在 Docker 生态系统中,镜像仓库(Docker Registry)扮演着关键的角色,用于存储和分享 Docker 镜像。镜像仓库有公共的和私有的两种形式,每种形式都有其特定的应用场景。

公共镜像仓库

  1. Docker Hub

Docker Hub 是 Docker 公共仓库,是最大的 Docker 镜像仓库之一。它提供了大量的公共镜像供用户使用。你可以在 Docker Hub 上找到官方的基础镜像,也可以找到其他用户分享的各种应用和工具的镜像。

  1. 国内云服务商提供的公共仓库

由于 Docker Hub 在国内访问速度较慢,一些国内的云服务商提供了类似于 Docker Hub 的公开服务。例如,网易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等,都提供了稳定、快速的公共镜像仓库。

私有镜像仓库

  1. 为什么搭建私有镜像仓库?

虽然公共仓库提供了大量的镜像供用户使用,但在一些特定的场景下,企业或个人可能希望搭建自己的私有 Docker Registry。主要原因包括:

  • 安全性: 一些敏感的应用或数据不适合存储在公共仓库中,因此需要一个受控的、私有的存储环境。

  • 带宽控制: 在一些特殊网络环境下,使用公共仓库的下载速度可能不理想,搭建私有仓库可以更好地控制镜像的拉取速度。

  • 定制需求: 企业可能有自己特殊的镜像需求,需要在内部构建和管理特定版本的镜像。

  1. Docker Registry

Docker Registry 是 Docker 提供的官方仓库服务,支持用户搭建自己的私有镜像仓库。你可以将 Docker Registry 部署在自己的服务器上,并通过简单的配置来实现私有仓库的搭建。

搭建私有 Docker Registry 的详细步骤可以参考官方文档:Docker Registry 部署

  1. 私有 Docker Registry 在企业中的应用

在企业内部,私有 Docker Registry 的应用非常广泛。它不仅为企业提供了更加安全和可控的镜像管理环境,还支持企业内部的持续集成和持续部署流程。通过搭建私有仓库,企业可以更好地管理和定制自己的镜像,确保应用的稳定和安全运行。

总的来说,选择使用公共仓库还是搭建私有仓库,取决于具体的使用场景和需求。在实际应用中,有时候也会采用公共仓库和私有仓库结合的方式,根据实际需求灵活选择。

一、搭建 Docker 镜像仓库

在 Docker 生态系统中,镜像仓库(Docker Registry)用于存储和管理 Docker 镜像。你可以选择使用公共仓库,比如 Docker Hub,也可以搭建私有的 Docker Registry,方便自己团队或组织内部使用。

官网地址:https://hub.docker.com/_/registry

1.1 搭建简化版的镜像仓库

Docker 官方提供了一个简化版的 Docker Registry 镜像,具备完整的仓库管理功能,但缺乏图形化界面。下面是一个简单的搭建命令:

bash 复制代码
docker run -d \
    --restart=always \
    --name registry \
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    registry

这个命令中的参数说明:

  • -d: 后台运行容器。
  • --restart=always: 设置容器总是在 Docker 启动时重新启动。
  • --name registry: 为容器指定一个名字,这里是 registry
  • -p 5000:5000: 将主机的 5000 端口映射到容器的 5000 端口。
  • -v registry-data:/var/lib/registry: 挂载数据卷 registry-data 到容器内的 /var/lib/registry 目录,用于持久化存储镜像数据。
  • registry: 使用的镜像名称。

通过上述命令,就成功运行了一个 Docker Registry 服务。访问 http://主机IP:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像。

1.2 搭建带有图形化界面的镜像仓库

有一些第三方工具可以为 Docker Registry 提供图形化界面,使得镜像的管理更加直观。一个常用的工具是 docker-registry-ui。通过 Docker Compose,我们可以很容易地搭建一个带有图形化界面的 Docker Registry 服务。以下是一个简单的 docker-compose.yml 文件:

yaml 复制代码
version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

这个 docker-compose.yml 文件包括两个服务:registryui。其中,registry 使用官方 Docker Registry 镜像,并挂载数据卷;ui 使用 docker-registry-ui 镜像,并配置了环境变量,包括私有仓库的标题和地址。

1.3 配置 Docker 信任地址

因为私服采用的是 HTTP 协议,默认不被 Docker 信任,所以需要进行配置。编辑 Docker 守护进程配置文件:

bash 复制代码
# 打开要修改的文件
vim /etc/docker/daemon.json

添加如下内容:

json 复制代码
"insecure-registries": ["http://主机IP:8080"]

保存并退出。重载 Docker 守护进程配置并重启 Docker:

bash 复制代码
systemctl daemon-reload
systemctl restart docker

通过以上步骤,就成功搭建了一个简化版的 Docker 镜像仓库,并且还可以使用 Docker Compose 部署一个带有图形化界面的 Docker Registry。

然后通过浏览器访问:http://主机IP:8080/,就可以看到私有镜像查看的 UI 界面了。

二、向私有镜像仓库推送和拉取镜像

2.1 推送本地镜像到私有仓库

  1. 例如,现在要把本地的镜像 nginx,重新tagnginx:1.0,注意,名称前缀为私有仓库的地址:192.168.150.101:8080/
bash 复制代码
docker tag nginx:latest 192.168.211.128:8080/nginx:1.0

其含义是给本地镜像打上一个新标签,使其适应私有仓库地址。

  1. 然后再把它推送到私有仓库:
bash 复制代码
docker push 192.168.211.128:8080/nginx:1.0

其含义是将标签过的镜像推送到私有仓库。

  1. 推送成功后,就可以在私有仓库的图形化界面中看到相应的镜像。

2.2 拉取私有仓库中的镜像

拉取镜像是将远程仓库中的镜像下载到本地使用的过程。使用 Docker 命令可以很方便地从私有仓库中拉取镜像。

推送本地镜像到私有仓库的过程已经很详细了。接下来,我们来看一下拉取镜像的步骤。

现在私有仓库中有一个镜像 nginx:1.0,我们可以通过以下命令将其拉取到本地:

bash 复制代码
docker pull 192.168.211.128:8080/nginx:1.0

这个命令的含义是从指定的私有仓库地址拉取标签为 1.0nginx 镜像。

拉取成功后,就可以在本地使用这个镜像。

例如,拉取私有仓库镜像的整个步骤:

  1. 首先删除本地的nginx镜像

  2. 从私有仓库拉取镜像

可以直接在私有仓库的 UI 界面直接复制拉取镜像的命令:

执行在终端中执行这个命令,发现拉取成功了:

相关推荐
工业3D_大熊1 小时前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc17671 小时前
docker 相关命令
java·docker·jenkins
CP-DD1 小时前
Docker 容器化开发 应用
运维·docker·容器
Stark-C1 小时前
万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统
macos·docker·策略模式
老司机张师傅2 小时前
【微服务实战之Docker容器】第七章-Dockerfile解析
容器·dockerfile·虚悬镜像·docker学习
微信-since811922 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
吴半杯3 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
今天我刷leetcode了吗3 小时前
docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
tcp/ip·docker·电脑
lwprain4 小时前
常用docker应用部署,wordpress、mysql、tomcat、nginx、redis
mysql·docker·tomcat
Code_Artist6 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器