使用 Docker 构建私有镜像仓库
在局域网环境中通过官方 Docker Registry 镜像搭建私有镜像仓库。
- 获取 Docker Registry 镜像
首先,确保系统环境正常运行,并拉取最新的 Docker Registry 镜像:
# 查看系统版本
cat /etc/system-release
# 检查本机 IP 地址
ip addr show | grep "192.168"
# 拉取 registry 官方镜像
docker pull registry:latest
# 确认镜像已成功下载
docker images | grep registry
- 启动私有仓库容器
创建一个持久化目录用于存储镜像数据,然后启动 Docker 容器:
# 创建本地持久化目录
sudo mkdir /local-registry
# 启动 registry 容器
docker run -d --name local-registry \
--restart=always \
-p 5000:5000 \
-v /local-registry:/var/lib/registry \
registry:latest
# 检查容器是否运行
docker ps
# 验证服务端口监听状态
sudo netstat -anpt | grep 5000
验证私有仓库是否正常工作:
# 使用 curl 测试 API
curl -v http://localhost:5000/v2/
# 查看当前镜像列表
curl http://localhost:5000/v2/_catalog
- 推送镜像到私有仓库
以 Ubuntu 镜像为例,将其推送至本地仓库:
# 查找本地的 ubuntu 镜像
docker images | grep ubuntu
# 为镜像添加标签
docker tag ubuntu localhost:5000/ubuntu
# 再次确认镜像列表
docker images | grep ubuntu
# 将镜像推送到本地仓库
docker push localhost:5000/ubuntu
# 查看仓库中的镜像及其标签信息
curl http://localhost:5000/v2/_catalog
curl http://localhost:5000/v2/ubuntu/tags/list
检查存储的数据结构:
tree -L 3 /local-registry/docker/registry/v2/repositories/ubuntu/
- 从本地仓库拉取镜像
配置 Docker 守护进程以支持非安全连接(insecure registries),并测试拉取功能:
# 编辑 daemon.json 文件
sudo vim /etc/docker/daemon.json
# 添加 insecure-registries 配置
{
"registry-mirrors": ["https://t5t8q6wn.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.56.102:5000"]
}
# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 从本地仓库拉取镜像
docker pull 192.168.56.102:5000/ubuntu
# 验证镜像是否成功拉取
docker images | grep ubuntu
- 在其他主机上使用私有仓库
在另一台主机上重复上述步骤,确保可以访问并拉取镜像:
# 配置目标主机的 Docker 守护进程
sudo vim /etc/docker/daemon.json
# 添加 insecure-registries
{
"registry-mirrors": ["https://t5t8q6wn.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.56.102:5000"]
}
# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 测试拉取镜像
docker pull 192.168.56.102:5000/ubuntu
- 处理常见问题
如果遇到错误提示"http: server gave HTTP response to HTTPS client",需确保已在 daemon.json 中正确配置了 insecure-registries。
- 数据持久化
为了避免容器销毁后数据丢失,可以通过以下方式实现持久化存储:
# 创建 Docker 卷
docker volume create local-registry-volume
# 启动容器时挂载卷
docker run -d --name local-registry \
--restart=always \
-p 5000:5000 \
-v local-registry-volume:/var/lib/registry \
registry:latest