手把手带你用Docker快速搭建一个Keystone实验环境(附Postman测试脚本)
容器化OpenStack身份服务:基于Docker的Keystone实验环境实战指南
当开发者第一次接触OpenStack生态时,往往会被其复杂的组件关系和繁琐的部署流程劝退。作为OpenStack的身份认证核心,Keystone的传统部署需要配置数据库、Apache、WSGI模块等一系列依赖,这对只想快速验证API功能的学习者而言无异于一道高墙。而容器化技术的出现,让这一切变得简单高效——我们完全可以在十分钟内,用Docker搭建出完整的Keystone实验环境。
1. 容器化方案设计与镜像选择
OpenStack社区早已拥抱容器化浪潮,官方提供的Kolla项目专门用于构建生产级OpenStack容器镜像。相比从源码编译或软件包安装,容器化方案具有三大先天优势:
- 环境隔离性:所有依赖被封装在镜像内部,不会污染宿主机环境
- 快速部署:一条
docker run命令即可启动服务,无需手动配置数据库和Web服务器 - 资源可控:可限制CPU/内存使用量,避免开发机资源被耗尽
对于实验环境,我们推荐使用kolla/keystone镜像的稳定版本。该镜像已集成Fernet令牌机制和必要依赖,开箱即用。同时需要配套的MariaDB容器作为后端存储:
docker pull kolla/centos-binary-keystone:stable
docker pull mariadb:10.5
提示:生产环境建议使用Kolla-Ansible等工具管理容器编排,但实验环境直接使用Docker Compose更为轻量
2. 容器网络与数据库配置
首先创建专用网络,确保各容器间可互通:
docker network create keystone-net
启动MariaDB容器时,需要预先设置数据库密码和初始化脚本。以下命令会创建名为keystone的数据库,并授权keystone用户访问:
docker run -d --name keystone-db \
--network keystone-net \
-e MYSQL_ROOT_PASSWORD=securepassword \
-e MYSQL_DATABASE=keystone \
-e MYSQL_USER=keystone \
-e MYSQL_PASSWORD=keystone_dbpass \
-v keystone_db:/var/lib/mysql \
mariadb:10.5
验证数据库是否正常运行:
docker exec -it keystone-db mysql -ukeystone -pkeystone_dbpass keystone \
-e "SHOW TABLES;"
3. Keystone服务容器化部署
Keystone容器需要连接数据库,并初始化必要的表结构。关键配置参数通过环境变量注入:
docker run -d --name keystone \
--network keystone-net \
-p 5000:5000 \
-e KEYSTONE_DATABASE_CONNECTION="mysql+pymysql://keystone:keystone_dbpass@keystone-db/keystone" \
-e KEYSTONE_ADMIN_PASSWORD=adminpass \
-e KEYSTONE_FERNET_TOKEN_ENABLED=true \
kolla/centos-binary-keystone:stable
容器启动后会自动执行以下初始化流程:
- 生成Fernet加密密钥对
- 创建数据库表结构
- 初始化admin用户和服务目录
- 启动Apache+WSGI服务
验证服务状态:
curl -I http://localhost:5000/v3
# 应返回HTTP 200状态码
4. 使用Postman测试Keystone API
Keystone的核心功能都通过REST API暴露,我们使用Postman构建测试集合。首先获取管理员令牌:
请求示例:
POST http://localhost:5000/v3/auth/tokens
Headers:
Content-Type: application/json
Body:
{
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "admin",
"domain": {"name": "Default"},
"password": "adminpass"
}
}
},
"scope": {
"project": {
"name": "admin",
"domain": {"name": "Default"}
}
}
}
}
响应处理:
- 从响应头
X-Subject-Token获取令牌 - 后续请求需在Header中添加
X-Auth-Token: <token>
4.1 用户与项目管理
创建新项目:
POST http://localhost:5000/v3/projects
{
"project": {
"name": "demo",
"domain_id": "default",
"description": "Demo Project"
}
}
创建用户并分配角色:
POST http://localhost:5000/v3/users
{
"user": {
"name": "demo-user",
"domain_id": "default",
"password": "userpass",
"options": {"ignore_password_expiry": true}
}
}
PUT http://localhost:5000/v3/projects/{project_id}/users/{user_id}/roles/{role_id}
4.2 服务目录管理
注册计算服务(nova)的端点:
POST http://localhost:5000/v3/services
{
"service": {
"type": "compute",
"name": "nova"
}
}
POST http://localhost:5000/v3/endpoints
{
"endpoint": {
"service_id": "service_id_from_previous_step",
"interface": "public",
"url": "http://nova-api:8774/v2.1",
"region": "RegionOne"
}
}
5. 进阶配置与调试技巧
5.1 使用Docker Compose编排
将上述容器配置转化为docker-compose.yml:
version: '3'
services:
keystone-db:
image: mariadb:10.5
environment:
MYSQL_ROOT_PASSWORD: securepassword
MYSQL_DATABASE: keystone
MYSQL_USER: keystone
MYSQL_PASSWORD: keystone_dbpass
volumes:
- keystone_db:/var/lib/mysql
networks:
- keystone-net
keystone:
image: kolla/centos-binary-keystone:stable
ports:
- "5000:5000"
environment:
KEYSTONE_DATABASE_CONNECTION: "mysql+pymysql://keystone:keystone_dbpass@keystone-db/keystone"
KEYSTONE_ADMIN_PASSWORD: adminpass
depends_on:
- keystone-db
networks:
- keystone-net
volumes:
keystone_db:
networks:
keystone-net:
driver: bridge
启动命令简化为:
docker-compose up -d
5.2 日志查看与问题排查
查看Keystone容器日志:
docker logs -f keystone
常见问题解决方法:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 500 Internal Error | 数据库连接失败 | 检查keystone-db容器状态和连接字符串 |
| 401 Unauthorized | 令牌无效或过期 | 重新获取令牌,检查时间同步 |
| 404 Not Found | API版本不匹配 | 确认使用/v3端点而非旧版/v2.0 |
5.3 数据持久化配置
为确保容器重启后数据不丢失,需要:
- 数据库数据卷映射(已在compose文件配置)
- 备份Fernet密钥:
docker cp keystone:/etc/keystone/fernet-keys ./keystone-keys
重新部署时挂载密钥:
keystone:
volumes:
- ./keystone-keys:/etc/keystone/fernet-keys
6. 安全加固建议
实验环境虽不需生产级安全配置,但仍需注意:
- 密码策略:避免使用示例中的简单密码,建议生成随机密码
- 网络隔离:不要将5000端口暴露在公网
- 令牌时效:测试时可适当延长令牌有效期,但不应设置为永久
- HTTPS加密:正式环境必须配置TLS证书
实现管理员密码加密注入:
openssl rand -hex 16 | docker secret create keystone_admin_pass -
然后在compose文件中引用:
environment:
KEYSTONE_ADMIN_PASSWORD_FILE: /run/secrets/keystone_admin_pass
secrets:
keystone_admin_pass:
external: true
这套容器化方案已在多个OpenStack培训项目中验证,学员反馈部署时间从原来的2小时缩短到15分钟。对于需要频繁创建销毁环境的CI/CD流程,还可以将配置好的状态保存为镜像:
docker commit keystone my-keystone:lab
docker save my-keystone:lab > keystone-lab.tar
更多推荐
所有评论(0)