目录
[一、Docker Registry:搭建自己的镜像仓库](#一、Docker Registry:搭建自己的镜像仓库)
[1️⃣先搞懂:Registry 是什么?](#1️⃣先搞懂:Registry 是什么?)
[2️⃣实战:3 步搭建私有 Registry](#2️⃣实战:3 步搭建私有 Registry)
[步骤 1:配置 Docker daemon(关键!)](#步骤 1:配置 Docker daemon(关键!))
[步骤 2:启动 Registry 容器](#步骤 2:启动 Registry 容器)
[步骤 3:上传 / 下载镜像到私有仓库](#步骤 3:上传 / 下载镜像到私有仓库)
[上传镜像示例(以 centos:new 为例)](#上传镜像示例(以 centos:new 为例))
[3️⃣实用技巧:用 API 管理私有仓库](#3️⃣实用技巧:用 API 管理私有仓库)
[二、Docker Compose:轻松搞定多容器编排](#二、Docker Compose:轻松搞定多容器编排)
[1️⃣核心概念:Compose 能做什么?](#1️⃣核心概念:Compose 能做什么?)
[2️⃣基础:学会写 docker-compose.yml 文件](#2️⃣基础:学会写 docker-compose.yml 文件)
[第一步:YAML 语法规则(必看!避免格式错误)](#第一步:YAML 语法规则(必看!避免格式错误))
[示例:一个简单的 Web+MySQL 配置](#示例:一个简单的 Web+MySQL 配置)
[3️⃣实战:用 Compose 部署 WordPress](#3️⃣实战:用 Compose 部署 WordPress)
[步骤 1:安装 Docker Compose](#步骤 1:安装 Docker Compose)
[步骤 2:创建工作目录与配置文件](#步骤 2:创建工作目录与配置文件)
[步骤 3:启动服务并验证](#步骤 3:启动服务并验证)
[4. 常用 Compose 命令(收藏!)](#4. 常用 Compose 命令(收藏!))
[三、企业级实战:用 Harbor 搭建私有镜像仓库](#三、企业级实战:用 Harbor 搭建私有镜像仓库)
[1️⃣Harbor 核心优势:为什么选它?](#1️⃣Harbor 核心优势:为什么选它?)
[2️⃣实战:5 步安装 Harbor](#2️⃣实战:5 步安装 Harbor)
[步骤 1:下载 Harbor 安装包](#步骤 1:下载 Harbor 安装包)
[步骤 2:修改 Harbor 配置文件](#步骤 2:修改 Harbor 配置文件)
[步骤 3:生成 Harbor 配置](#步骤 3:生成 Harbor 配置)
[步骤 4:启动 Harbor 服务](#步骤 4:启动 Harbor 服务)
[步骤 5:验证 Harbor 状态](#步骤 5:验证 Harbor 状态)
[3️⃣Harbor 使用实战:上传镜像到仓库](#3️⃣Harbor 使用实战:上传镜像到仓库)
[步骤 1:Web 端配置(创建项目)](#步骤 1:Web 端配置(创建项目))
[步骤 2:客户端配置(信任 Harbor)](#步骤 2:客户端配置(信任 Harbor))
[步骤 3:客户端上传镜像到 Harbor](#步骤 3:客户端上传镜像到 Harbor)
[4️⃣常见问题:Harbor 服务异常怎么办?](#4️⃣常见问题:Harbor 服务异常怎么办?)
作为一名 Docker 初学者,在掌握了基础的镜像与容器操作后,难免会遇到 "如何高效管理团队内部镜像""怎样批量部署多容器应用" 这类问题。今天就结合实战,从 Docker Registry 私有仓库、Docker Compose 容器编排到企业级镜像仓库 Harbor,带大家一步步打通 Docker 进阶之路,所有操作均附详细步骤,新手也能轻松上手。
一、Docker Registry:搭建自己的镜像仓库
在团队协作或企业环境中,直接使用 Docker 官方公共仓库(Docker Hub)存在网速慢、隐私泄露风险,此时搭建私有 Registry就成了刚需。下面从概念到实战,教你快速搭建并使用私有仓库。
1️⃣先搞懂:Registry 是什么?
Docker Registry 本质是一个 "镜像存储与分发服务",可以理解为 "Docker 镜像的专属仓库",核心作用包括:
- 集中存储镜像,支持版本控制(通过 Tag 区分);
- 方便团队共享镜像,避免重复构建;
- 私有部署时,保障内部镜像不泄露到公网。
Registry 分为两种:
- 官方公共 Registry:即 Docker Hub,无需搭建但受网络和隐私限制;
- 私有 Registry:企业 / 个人在自己服务器上部署,完全可控,也是我们重点学习的内容。
2️⃣实战:3 步搭建私有 Registry
步骤 1:配置 Docker daemon(关键!)
首先需要修改 Docker 的配置文件daemon.json,告诉 Docker "信任我们即将搭建的私有仓库",避免后续上传 / 下载镜像时出现 "不安全链接" 错误。
- 编辑配置文件(若文件不存在则直接创建):
bash
[root@docker-lucky-cloud docker]# vi /etc/docker/daemon.json
- 写入以下内容(重点关注
insecure-registries,填写你的服务器 IP + 端口,这里用192.168.110.160:5000为例):
json
{
"log-level": "error", // 日志级别:只记录错误
"storage-driver": "overlay2", // Docker推荐的存储驱动
"log-driver": "json-file", // 日志格式
"log-opts": { // 日志滚动策略:单个日志最大50M,保留3个
"max-size": "50m",
"max-file": "3"
},
"registry-mirrors": ["https://0f8a3388042b4b0ab6611ccc6e866ab3.mirror.swr.myhuaweicloud.com"], // 国内镜像加速(可选)
"insecure-registries": ["http://192.168.110.160:5000"] // 信任私有仓库地址
}
- 重启 Docker 服务,让配置生效:
bash
[root@docker-lucky-cloud docker]# systemctl daemon-reload # 重载配置
[root@docker-lucky-cloud docker]# systemctl restart docker # 重启Docker
步骤 2:启动 Registry 容器
Registry 本身也是一个 Docker 镜像,我们直接通过docker run启动容器即可,无需复杂安装:
bash
[root@docker-lucky-cloud ~]# docker run -d \
-p 5000:5000 \ # 端口映射:主机5000端口→容器5000端口(Registry默认端口)
-v /var/lib/local_registry:/var/lib/registry \ # 数据挂载:把镜像数据存到主机/var/lib/local_registry(避免容器删除后数据丢失)
--name local_registry \ # 给容器起个名字:local_registry
registry:latest # 使用最新版Registry镜像
启动后,用docker ps查看容器状态,若STATUS为Up则表示成功。
步骤 3:上传 / 下载镜像到私有仓库
搭建好仓库后,如何把本地镜像传上去?又如何从仓库拉取镜像?核心是 "给镜像打标签"------ 必须让镜像标签包含私有仓库的 IP 和端口,Docker 才知道要操作哪个仓库。
上传镜像示例(以 centos:new 为例)
- 查看本地镜像,确认要上传的镜像存在:
bash
[root@docker-lucky-cloud ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos new 5d0da3dc9764 3 years ago 231MB # 要上传的镜像
- 给镜像打 "私有仓库标签":格式为
仓库IP:端口/镜像名:标签
bash
[root@docker-lucky-cloud ~]# docker tag centos:new 192.168.110.160:5000/centos:new
- 上传镜像到私有仓库:
bash
[root@docker-lucky-cloud ~]# docker push 192.168.110.160:5000/centos:new
看到Pushed和digest信息,就表示上传成功了。
下载镜像示例(另一台机器或本地测试)
如果需要从私有仓库拉取镜像,直接用docker pull+"仓库标签" 即可:
bash
# 拉取刚才上传的centos:new镜像
[root@docker-lucky-cloud ~]# docker pull 192.168.110.160:5000/centos:new
3️⃣实用技巧:用 API 管理私有仓库
除了通过docker命令,还可以用curl调用 Registry 的 API 查看仓库信息,方便自动化管理:
- 查看仓库中的所有镜像(repository 列表):
bash
[root@docker-lucky-cloud ~]# curl 127.0.0.1:5000/v2/_catalog
# 成功返回:{"repositories":["centos"]}(表示有一个叫centos的镜像)
- 查看某个镜像的所有标签(比如 centos):
bash
[root@docker-lucky-cloud ~]# curl -X GET 127.0.0.1:5000/v2/centos/tags/list
# 成功返回:{"name":"centos","tags":["new"]}(表示centos镜像有一个new标签)
- 查看某个标签对应的镜像摘要(用于精准定位镜像):
bash
[root@docker-lucky-cloud ~]# curl -s 127.0.0.1:5000/v2/centos/manifests/new -I -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' | grep Docker-Content-Digest | awk '{print $NF}' | tr -d '\r'
# 成功返回:sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
二、Docker Compose:轻松搞定多容器编排
当我们需要部署 "Web 服务 + 数据库""前端 + 后端 + 缓存" 这类多容器应用时,手动逐个启动容器、配置网络和依赖会非常繁琐。Docker Compose 就是为解决这个问题而生的工具 ------ 用一个 YAML 文件定义所有服务,一条命令完成部署。
1️⃣核心概念:Compose 能做什么?
Docker Compose 是 Docker 官方推出的多容器编排工具,核心价值在于:
- 用
docker-compose.yml文件统一配置所有服务(比如 Web、DB); - 一键启动 / 停止 / 重启所有服务,无需逐个操作容器;
- 自动管理容器间的网络和依赖(比如确保 DB 启动后再启动 Web);
- 支持服务扩展(比如一键增加 Web 服务的实例数量)。
适用场景:开发环境测试、小型生产环境部署(大型环境推荐 Kubernetes)。
2️⃣基础:学会写 docker-compose.yml 文件
Compose 的核心是docker-compose.yml文件,采用 YAML 语法,结构清晰但有严格的格式要求(新手容易踩坑)。先掌握基础规则和核心配置项。
第一步:YAML 语法规则(必看!避免格式错误)
YAML 语法对格式要求极严,写错会导致 Compose 无法识别,重点记住以下几点:
- 大小写敏感;
- 用空格缩进表示层级(不能用 Tab 键!);
- 缩进空格数不固定,同一层级左对齐即可(推荐 2 个空格);
- 注释用
#开头; - 键值对用
:分隔,:后必须加 1 个空格(比如image: nginx:latest); - 列表项用
-开头,-后必须加 1 个空格(比如ports: - "8080:80")。
第二步:核心配置项解析
一个标准的docker-compose.yml文件包含 3 个核心层级:version(Compose 版本)、services(服务定义)、networks/volumes(网络 / 数据卷)。常用配置项如下:
| 配置项 | 作用 | 示例 |
|---|---|---|
version |
指定 Compose 文件版本(需与 Docker 版本匹配,推荐 3.8) | version: '3.8' |
services |
定义所有服务(每个服务对应一个 / 多个容器) | services: webapp: ... |
image |
指定服务使用的镜像 | image: nginx:latest |
build |
本地构建镜像(代替 image,需指定 Dockerfile 路径) | build: context: ./app dockerfile: Dockerfile.prod |
ports |
端口映射(主机端口:容器端口) | ports: - "8080:80" |
volumes |
数据卷挂载(主机目录:容器目录) | volumes: - /opt/data:/var/www/html |
environment |
设置环境变量(数组或字典格式) | environment: - MYSQL_ROOT_PASSWORD=123456 |
depends_on |
定义服务依赖(确保依赖服务先启动) | depends_on: - database |
restart |
重启策略(always = 总是重启,on-failure = 失败时重启) | restart: always |
networks |
指定服务加入的网络 | networks: - my-network |
示例:一个简单的 Web+MySQL 配置
下面是一个完整的docker-compose.yml示例,定义了 "Web 服务(nginx)" 和 "数据库服务(mysql)":
yaml
version: '3.8' # Compose版本
services:
# 定义Web服务
web:
image: nginx:latest # 使用官方nginx镜像
ports:
- "8080:80" # 主机8080端口映射到容器80端口
volumes:
- ./nginx/html:/usr/share/nginx/html # 本地目录挂载到容器(存放静态页面)
depends_on:
- db # 依赖db服务,db启动后再启动web
restart: always # 容器退出时总是重启
# 定义数据库服务
db:
image: mysql:5.7 # 使用mysql 5.7镜像
environment:
- MYSQL_ROOT_PASSWORD=123456 # root密码
- MYSQL_DATABASE=testdb # 自动创建testdb数据库
volumes:
- mysql-data:/var/lib/mysql # 数据卷挂载(持久化MySQL数据)
restart: always
# 定义数据卷(用于持久化MySQL数据)
volumes:
mysql-data:
3️⃣实战:用 Compose 部署 WordPress
WordPress 需要 "Web 服务(PHP)+ MySQL 数据库",用 Compose 部署只需 3 步,非常适合新手练手。
步骤 1:安装 Docker Compose
CentOS 系统下直接用 yum 安装(其他系统可参考官方文档):
bash
# 安装epel源(yum需要)
[root@docker-lucky-cloud ~]# yum install epel-release.noarch -y
# 安装docker-compose
[root@docker-lucky-cloud ~]# yum -y install docker-compose
# 验证安装:查看版本
[root@docker-lucky-cloud ~]# docker-compose --version
# 输出类似:docker-compose version 1.18.0, build 8dd22a9
步骤 2:创建工作目录与配置文件
- 创建专门的工作目录(避免文件混乱):
bash
[root@docker-lucky-cloud ~]# mkdir /opt/wordpress-compose
[root@docker-lucky-cloud ~]# cd /opt/wordpress-compose
- 创建
docker-compose.yml文件并写入以下内容:
yaml
version: '3.1'
services:
# WordPress服务
wordpress:
image: wordpress # 官方WordPress镜像(自带PHP环境)
restart: always
ports:
- "8080:80" # 主机8080端口映射到容器80端口
environment:
# 连接MySQL的配置(需与db服务的环境变量对应)
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- /opt/wordpress:/var/www/html # 本地目录挂载(持久化WordPress数据)
depends_on:
- db # 依赖db服务
# MySQL数据库服务
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpress # 数据库名
MYSQL_USER: wordpress # 数据库用户
MYSQL_PASSWORD: wordpress # 数据库密码
MYSQL_RANDOM_ROOT_PASSWORD: '1' # 自动生成root随机密码(安全)
volumes:
- /opt/mysql:/var/lib/mysql # 持久化MySQL数据
步骤 3:启动服务并验证
- 启动所有服务(
-d表示后台运行):
bash
[root@docker-lucky-cloud wordpress-compose]# docker-compose up -d
# 首次启动会自动拉取镜像,耐心等待...
- 查看服务状态:
bash
[root@docker-lucky-cloud wordpress-compose]# docker-compose ps
# 成功会看到两个服务的State都是Up:
# dockercompose_db_1 Up 3306/tcp, 33060/tcp
# dockercompose_wordpress_1 Up 0.0.0.0:8080->80/tcp
- 访问 WordPress:打开浏览器,输入
服务器IP:8080(比如192.168.110.160:8080),按照引导完成安装即可。
4. 常用 Compose 命令(收藏!)
掌握以下命令,就能应对日常的服务管理:
| 命令 | 作用 |
|---|---|
docker-compose up -d |
后台启动所有服务(首次启动会创建容器) |
docker-compose down |
停止并删除所有服务的容器、网络(数据卷保留) |
docker-compose start |
启动已停止的服务 |
docker-compose stop |
停止运行中的服务(容器不删除) |
docker-compose restart |
重启所有服务 |
docker-compose ps |
查看所有服务的容器状态 |
docker-compose logs |
查看所有服务的日志(加-f实时跟踪) |
docker-compose scale 服务名=数量 |
扩展服务实例(比如docker-compose scale web=3) |
三、企业级实战:用 Harbor 搭建私有镜像仓库
虽然 Docker Registry 能满足基础的私有仓库需求,但缺乏 "用户权限管理""镜像扫描""多租户隔离" 等企业级功能。Harbor 是 VMware 开源的企业级 Docker 镜像仓库,完美解决了这些问题,也是企业中最常用的私有仓库方案。
1️⃣Harbor 核心优势:为什么选它?
相比基础的 Registry,Harbor 增加了大量企业级特性:
- 多租户与权限控制:支持按项目隔离镜像,不同用户有不同权限(读 / 写 / 管理员);
- 安全防护:内置镜像漏洞扫描、用户认证(支持 LDAP/OAuth)、访问控制;
- 高效管理:支持镜像复制(多仓库同步)、标签管理、存储优化(去重压缩);
- 易用性:提供 Web 管理界面,操作直观,无需记复杂命令;
- 可扩展性:支持集群部署,可与 Kubernetes、Jenkins 等工具集成。
2️⃣实战:5 步安装 Harbor
Harbor 基于 Docker Compose 部署,安装前需确保服务器已安装 Docker 和 Docker Compose(前面已讲过安装方法)。
步骤 1:下载 Harbor 安装包
Harbor 提供在线和离线两种安装包,离线包包含所有依赖镜像,适合无外网环境。这里以离线包为例:
- 下载地址:Harbor GitHub Releases(选择
harbor-offline-installer-版本.tgz,比如harbor-offline-installer-v1.9.2.tgz); - 上传安装包到服务器的
/opt目录,然后解压:
bash
[root@docker-lucky-cloud ~]# cd /opt
[root@docker-lucky-cloud opt]# tar zxvf harbor-offline-installer-v1.9.2.tgz
# 解压后会生成harbor目录
步骤 2:修改 Harbor 配置文件
进入 harbor 目录,修改核心配置文件harbor.cfg:
bash
[root@docker-lucky-cloud opt]# cd harbor
[root@docker-lucky-cloud harbor]# vi harbor.cfg
重点修改以下两个参数(其他参数默认即可,后续可在 Web 界面调整):
hostname = 192.168.110.160:Harbor 服务器的 IP 或域名(必须填写,否则无法访问);harbor_admin_password = 123456:Harbor 管理员(admin)的初始密码(自定义,建议复杂些)。
步骤 3:生成 Harbor 配置
运行prepare脚本,根据harbor.cfg生成 Docker Compose 配置文件:
bash
[root@docker-lucky-cloud harbor]# ./prepare
# 脚本会自动拉取依赖镜像,输出类似"prepare base dir is set to /opt/harbor"表示成功
步骤 4:启动 Harbor 服务
运行install.sh脚本,自动用 Docker Compose 启动所有服务:
bash
[root@docker-lucky-cloud harbor]# ./install.sh
# 等待执行完成,看到"✔ ----Harbor has been installed and started successfully.----"表示安装成功
步骤 5:验证 Harbor 状态
查看 Harbor 的所有服务容器状态:
bash
[root@docker-lucky-cloud harbor]# docker-compose ps
# 成功会看到所有服务(如harbor-core、harbor-db、nginx等)的State都是Up
3️⃣Harbor 使用实战:上传镜像到仓库
Harbor 的使用流程分为 "Web 端配置项目" 和 "客户端上传镜像" 两步,下面详细说明。
步骤 1:Web 端配置(创建项目)
- 访问 Harbor Web 界面:打开浏览器,输入
http://服务器IP(比如http://192.168.110.160); - 登录:用户名
admin,密码是harbor.cfg中设置的harbor_admin_password(比如 123456); - 创建项目:
- 点击左侧 "项目"→"新建项目";
- 项目名称:自定义(比如
test); - 访问级别:选择 "公开"(测试用,生产环境建议 "私有");
- 点击 "确定",项目创建完成。
步骤 2:客户端配置(信任 Harbor)
和 Docker Registry 一样,客户端(需要上传 / 下载镜像的机器)必须信任 Harbor,否则会报错。修改 Docker 配置:
- 编辑
docker.service文件:
bash
[root@docker-lucky-cloud ~]# vi /usr/lib/systemd/system/docker.service
- 找到
ExecStart行,添加--insecure-registry 服务器IP(比如192.168.110.160):
bash
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.110.160 --containerd=/run/containerd/containerd.sock
- 重启 Docker 服务:
bash
[root@docker-lucky-cloud ~]# systemctl daemon-reload
[root@docker-lucky-cloud ~]# systemctl restart docker
步骤 3:客户端上传镜像到 Harbor
以nginx:latest镜像为例,上传到 Harbor 的test项目:
- 登录 Harbor(客户端执行):
bash
[root@docker-lucky-cloud ~]# docker login -u admin -p 123456 192.168.110.160
# 看到"Login Succeeded"表示登录成功
- 给镜像打 Harbor 标签:格式为
HarborIP/项目名/镜像名:标签
bash
[root@docker-lucky-cloud ~]# docker tag nginx:latest 192.168.110.160/test/nginx:harbor-test
- 上传镜像:
bash
[root@docker-lucky-cloud ~]# docker push 192.168.110.160/test/nginx:harbor-test
- Web 端验证:登录 Harbor→进入
test项目→点击nginx,就能看到上传的harbor-test标签镜像。
4️⃣常见问题:Harbor 服务异常怎么办?
如果通过docker-compose ps看到部分服务状态为Exit,可按以下步骤排查:
- 重启所有 Harbor 服务:
bash
[root@docker-lucky-cloud harbor]# docker-compose restart
- 查看异常服务的日志(比如 harbor-core):
bash
[root@docker-lucky-cloud harbor]# docker-compose logs harbor-core
# 根据日志中的错误信息排查(常见错误:配置文件错误、端口占用)
- 若重启无效,可先停止服务,再重新启动:
bash
[root@docker-lucky-cloud harbor]# docker-compose down
[root@docker-lucky-cloud harbor]# docker-compose up -d
四、总结
通过本文的学习,我们从基础到实战掌握了 Docker 进阶的三个核心技能:
- Docker Registry:搭建基础私有仓库,满足个人或小团队的镜像存储需求;
- Docker Compose:用 YAML 文件管理多容器应用,一键部署 Web+DB 等复杂服务;
- Harbor:搭建企业级私有仓库,支持权限控制、镜像扫描等高级功能,满足生产环境需求。
对于初学者,建议先从 "Registry 搭建" 和 "Compose 部署 WordPress" 练手,熟悉后再尝试 Harbor 的企业级特性。后续还可以探索 Harbor 与 Jenkins 的集成(实现自动化构建 + 镜像推送),进一步提升 Docker 的使用效率。