一、容器端口映射:让外部访问容器服务

容器默认运行在隔离网络中,需通过 端口映射(Port Mapping) 暴露服务。

🔧 基本语法

docker run -p <宿主机端口>:<容器端口> [镜像]

📌 常见场景示例

场景命令
映射 Web 服务docker run -d -p 8080:80 nginx
映射 MySQLdocker 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:/dataDocker 管理的命名卷数据库、日志等持久化数据
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 扫描漏洞 + 审计日志]

更多推荐