openstack与docker

openstack概述

是一套自动化配置,调度,管理服务器/虚拟机资源的系统,通过各种组件形成的 Infrastructure as a Service(IaaS),
OpenStack = 自己搭建 AWS(或阿里云、腾讯云)的软件。
1 | OpenStack |
本身不负责虚拟化技术相关,not Vmware
1 | OpenStack |
layer 1 - compute
Nova
云主机管理中心。负责创建删除VM,开关机,调度,分配计算资源
Zun
启动和管理基于不同容器技术的容器
layer 2 - storage
Swift
对象存储
Cinder
块存储
Manila
共享文件系统
layer 3 - networking
Neutron
负责虚拟交换机,VLAN,DHCP,Router
Octavia
负载均衡。
Designate
DNS
layer 4 - shared services
Keystone
身份认证,OAuth服务组件
Glance
发现、注册和检索虚拟机镜像
1 | xxx/kolla/glance-api:bc-2024.1-ubuntu #使用kolla部署情况下的相关镜像 |
Placement
资源调度。跟踪云资源库存和使用情况,以帮助其他服务有效管理和分配其资源。
Barbican
密钥管理
layer 5 - web
Horizon
浏览器控制台
others
- 项目与角色
1 | OpenStack Cloud |
- 数据盘的选择
如果只是测试、临时开发环境:直接选择合适的 ...disk Flavor,例如 1c1g30gdisk 或 2c2g50gdisk,不创建 Volume,操作简单。
如果是需要长期保留数据、数据库、重要业务环境:优先选择 Disk=0 的 Flavor(如 1c1g、1c2g),然后勾选 Create New Volume,创建足够大的系统卷。这种方式更符合现代 OpenStack 的存储设计,也便于后续快照、备份、迁移和扩容。
1 | Kolla-Ansible |
- 在使用 openstack 的CLI工具前,因为 nova 节点的通信方式基于 http 请求,因此要配置相关环境变量
1 | export OS_PROJECT_ID=06923e90488045daa74a41919c6e6501 \ |
- 初始化实例时,可以通过自定义实例数据,借助 cloud-init 初始化密码、扩容根分区、设置主机名、注入公钥、执行自定义脚本等等
- metadata:一系列字典格式的元数据,用作模板渲染、模块运行等等。
- userdata:启动实例时用户能够指定的数据(单实例数据)
- vendordata:云基座传入的数据(全局数据)
常见 userdata 设置
1 | #cloud-config |
Docker
基础概念
Docker 是一种基于 Linux 内核能力实现的操作系统级虚拟化(OS-level Virtualization)技术,它将应用及其运行环境封装成一个标准化的容器(Container),实现”一次构建,到处运行”。
没有虚拟硬件,没有虚拟BIOS,没有Guest OS,没有Kernel,而是多个进程共享宿主机Linux内核。
只有程序 + 依赖
docker实现原理
- 进程隔离
一个容器进程本质上是一个运行在沙盒中的隔离进程,由Linux系统本身负责隔离(基于 Namespace 和 Cgroup 机制实现),Docker只是提供了一系列工具,帮助我们设置好隔离环境后,启动这个进程。
- 文件系统隔离
利用Linux的 mount 机制,给每个隔离进程挂载了一个虚拟的文件系统,再从 Dockerfile 构建
- 网络协议栈隔离
因为默认情况下隔离网络,所以要将进程端口号映射到宿主机后,才能通过宿主机访问隔离进程
不同的容器间需要通信时,直接指定IP并不是一个好的方式,要使用 docker compose 将服务运行在同一网络命名空间里
docker文件系统(重点
- 整个目录树,就是一个文件系统
1 | / |
- docker 通过一组 layer 的引用构建 image
1 | Image1 |
layer 不是一个压缩包或完整文件系统,而是一个文件系统增量(Filesystem Diff),记录相对于上一层:增加,删除,修改了什么
layer 全是只读属性,只有 Writable Layer 可对最上面一层layer可写
1 | Container |
- Docker 在 Linux 上通常使用 OverlayFS 作为存储驱动,通过不断 mount,merge layers

修改文件时: Copy-on-Write(写时复制)机制, copy layer 并在上层创建 writable layer
删除文件时:在上层创建 whiteout file (一般做法:
.wh.<filename>),以指示该文件不应再显示在合并层中dockerfile
1 | FROM ubuntu:24.04 // 指定基础镜像 |
- docker commit
容器创建时
1 | Container |
执行 commit 后,docker 会进行 Filesystem Diff,新增 layer 并更新 history,并创建一个新 image
- 假设有一个b镜像(基础镜像a),c镜像(基础镜像也是a),使用go,把c,a的差异文件提取出来,并支持docker load直接导入差异文件 zn-chen/dockerdiff
1 | DiffExport |