一、容器端口映射:让外部访问容器服务
容器默认运行在隔离网络中,需通过 端口映射(Port Mapping) 暴露服务。
🔧 基本语法
docker run -p <宿主机端口>:<容器端口> [镜像]
📌 常见场景示例
| 场景 | 命令 |
|---|---|
| 映射 Web 服务 | docker run -d -p 8080:80 nginx |
| 映射 MySQL | docker run -d -p 3306:3306 mysql:8.0 |
| 随机映射(测试用) | docker run -d -P nginx → 自动分配高位端口 |
| 多端口映射 | docker run -p 8080:80 -p 8443:443 nginx |
✅ 验证:
curl http://localhost:8080 # 访问 Nginx telnet localhost 3306 # 测试数据库连通性
⚠️ 注意事项
- 避免端口冲突:确保宿主机端口未被占用;
- 安全限制 :生产环境建议通过 反向代理(Nginx/HAProxy) 暴露服务,而非直接映射;
- IPv6 支持 :使用
-p [::1]:8080:80绑定 IPv6。
二、存储卷管理:实现数据持久化与共享
容器删除后,内部文件系统随之消失。存储卷(Volume) 解决数据持久化问题。
🗂 三种存储方式对比
| 类型 | 命令 | 特点 | 适用场景 |
|---|---|---|---|
| Bind Mount | -v /host/path:/container/path |
直接挂载宿主机目录 | 配置文件、代码热更新 |
| Named Volume | -v myvol:/data |
Docker 管理的命名卷 | 数据库、日志等持久化数据 |
| tmpfs | --tmpfs /tmp |
内存临时文件系统 | 敏感缓存(如 session) |
💡 实战:MySQL 数据持久化
# 创建命名卷
docker volume create mysql_data
# 启动 MySQL 并挂载
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=Root123! \
-v mysql_data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
✅ 即使删除容器,
mysql_data卷中的数据依然保留,重建容器时重新挂载即可恢复。
🔍 查看与管理卷
# 列出所有卷
docker volume ls
# 查看卷详情(含挂载路径)
docker volume inspect mysql_data
# 清理未使用卷
docker volume prune
三、微服务项目管理:为什么需要编排?
一个典型 Web 应用包含:
- 前端:Nginx 静态资源
- 后端:Python/Java API 服务
- 数据库:MySQL
- 缓存:Redis
若手动启动 4 个容器并配置网络、依赖、重启策略,极易出错。Docker Compose 应运而生。
四、Compose 语法详解:声明式定义多服务应用
Compose 使用 YAML 文件 描述整个应用栈。
📄 docker-compose.yml 核心结构
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html:ro
depends_on:
- api
restart: unless-stopped
api:
build: ./myapp # 从 Dockerfile 构建
environment:
- DB_HOST=db
- REDIS_HOST=redis
ports:
- "5000"
depends_on:
- db
- redis
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: Root123!
MYSQL_DATABASE: appdb
volumes:
- db_data:/var/lib/mysql
restart: always
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
volumes:
db_data:
redis_data:
🔑 关键字段说明
| 字段 | 作用 |
|---|---|
build |
指定构建上下文(含 Dockerfile) |
image |
使用现成镜像 |
ports |
端口映射("宿主:容器") |
volumes |
挂载卷或目录 |
environment |
设置环境变量(替代 -e) |
depends_on |
启动顺序依赖(⚠️ 不等待服务就绪!) |
restart |
重启策略(always, unless-stopped) |
networks |
自定义网络(默认已创建 bridge 网络) |
💡 服务发现 :Compose 自动为服务创建 DNS 记录,如
api容器可通过http://db:3306访问数据库。
五、Compose 项目管理:开发到部署全流程
🚀 常用命令
| 命令 | 说明 |
|---|---|
docker compose up -d |
后台启动所有服务 |
docker compose down |
停止并删除容器、网络(不删卷!) |
docker compose logs -f api |
实时查看 api 服务日志 |
docker compose exec db mysql -u root -p |
进入 db 容器执行命令 |
docker compose config |
验证 YAML 语法 |
🔄 开发工作流
# 1. 修改代码
echo "New feature" >> myapp/app.py
# 2. 仅重建 api 服务
docker compose build api
# 3. 重启 api
docker compose up -d api
# 4. 验证
curl http://localhost
✅ 优势:无需重启整个应用栈,提升开发效率。
六、Harbor 仓库安装部署(生产级)
前提:已安装 Docker 和 Docker Compose
步骤 1:下载离线安装包
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
tar -zxvf harbor-offline-installer-v2.11.0.tgz
cd harbor
步骤 2:配置 harbor.yml
# 必改项
hostname: harbor.yourcompany.com
# HTTPS(生产必须)
https:
port: 443
certificate: /data/cert/harbor.yourcompany.com.crt
private_key: /data/cert/harbor.yourcompany.com.key
# 数据库密码
database:
password: StrongDBPass123!
# 管理员密码
harbor_admin_password: Admin@2025!
步骤 3:安装
sudo ./install.sh --with-trivy --with-chartmuseum
参数说明:
--with-trivy:启用漏洞扫描--with-chartmuseum:支持 Helm Chart 存储(K8s 场景)
步骤 4:访问 Web UI
浏览器打开 https://harbor.yourcompany.com,登录账号:admin / Admin@2025!
七、Harbor 仓库配置管理:企业级治理
1. 项目(Project)管理
- 创建私有项目 :如
prod/web,dev/ai - 设置公开/私有:基础镜像可设为公开,业务镜像设为私有
2. 成员与角色
| 角色 | 权限 |
|---|---|
| 项目管理员 | 全权限 |
| 开发者 | 推送/拉取 |
| 访客 | 仅拉取 |
| 维护者 | 管理成员+查看日志 |
3. 镜像安全策略
- 漏洞扫描:自动扫描推送的镜像,阻断高危 CVE 镜像部署;
- 内容信任:启用 Notary,确保只拉取签名镜像;
- 不可变标签 :防止覆盖
v1.0.0等正式版本。
4. 镜像生命周期
- 保留规则:自动清理旧镜像(如保留最近 20 个版本);
- Webhook:镜像推送后触发 CI/CD 流水线。
5. 与 Compose 集成
# docker-compose.yml 中使用私有镜像
services:
api:
image: harbor.yourcompany.com/prod/web-api:v1.2.0
pull_policy: always
✅ 前提 :所有部署节点需先
docker login harbor.yourcompany.com
八、完整工作流示例:从开发到上线
graph LR
A[开发者写代码] --> B[本地 docker compose up 测试]
B --> C[Git 提交]
C --> D[CI 流水线:构建镜像 + 推送 Harbor]
D --> E[CD 流水线:拉取镜像 + docker compose up 生产]
E --> F[Harbor 扫描漏洞 + 审计日志]