|
| 1 | +# Docker Runtime Support |
| 2 | + |
| 3 | +This document describes how to use overlaybd-snapshotter with Docker runtime. |
| 4 | + |
| 5 | +## Overview |
| 6 | + |
| 7 | +Overlaybd-snapshotter now supports Docker runtime through containerd integration. Docker differs from containerd in that it creates an extra **init layer** (identified by `-init` suffix in the key) between image layers and the container layer. |
| 8 | + |
| 9 | +When `runtimeType` is set to `"docker"`, the snapshotter handles this init layer properly: |
| 10 | +- **Init layer**: Attaches the overlaybd device and returns a bind mount |
| 11 | +- **Container layer**: Returns an overlay mount combining the init layer and overlaybd mountpoint |
| 12 | + |
| 13 | +## Prerequisites |
| 14 | + |
| 15 | +- Docker 20.10+ with containerd image store integration |
| 16 | +- overlaybd-snapshotter v0.6.0+ |
| 17 | +- overlaybd-tcmu service running |
| 18 | + |
| 19 | +## Configuration |
| 20 | + |
| 21 | +### 1. Configure overlaybd-snapshotter |
| 22 | + |
| 23 | +Edit `/etc/overlaybd-snapshotter/config.json`: |
| 24 | + |
| 25 | +```json |
| 26 | +{ |
| 27 | + "root": "/var/lib/containerd/io.containerd.snapshotter.v1.overlaybd", |
| 28 | + "address": "/run/overlaybd-snapshotter/overlaybd.sock", |
| 29 | + "runtimeType": "docker", |
| 30 | + "rwMode": "overlayfs", |
| 31 | + "verbose": "info", |
| 32 | + "logReportCaller": false, |
| 33 | + "autoRemoveDev": true, |
| 34 | + "mirrorRegistry": [] |
| 35 | +} |
| 36 | +``` |
| 37 | + |
| 38 | +**Important:** |
| 39 | +- `runtimeType` must be set to `"docker"` (default is `"containerd"`) |
| 40 | +- `rwMode` must be `"overlayfs"` for Docker support |
| 41 | + |
| 42 | +### 2. Configure Docker Daemon |
| 43 | + |
| 44 | +Enable containerd snapshotter support in Docker: |
| 45 | + |
| 46 | +Edit `/etc/docker/daemon.json`: |
| 47 | + |
| 48 | +```json |
| 49 | +{ |
| 50 | + "features": { |
| 51 | + "containerd-snapshotter": true |
| 52 | + } |
| 53 | +} |
| 54 | +``` |
| 55 | + |
| 56 | +Then restart Docker: |
| 57 | + |
| 58 | +```bash |
| 59 | +sudo systemctl restart docker |
| 60 | +``` |
| 61 | + |
| 62 | +### 3. Configure containerd |
| 63 | + |
| 64 | +Ensure containerd is configured to use the overlaybd snapshotter as a proxy plugin: |
| 65 | + |
| 66 | +Edit `/etc/containerd/config.toml`: |
| 67 | + |
| 68 | +```toml |
| 69 | +[proxy_plugins.overlaybd] |
| 70 | + type = "snapshot" |
| 71 | + address = "/run/overlaybd-snapshotter/overlaybd.sock" |
| 72 | +``` |
| 73 | + |
| 74 | +Restart containerd: |
| 75 | + |
| 76 | +```bash |
| 77 | +sudo systemctl restart containerd |
| 78 | +``` |
| 79 | + |
| 80 | +## Usage |
| 81 | + |
| 82 | +### Running Containers |
| 83 | + |
| 84 | +Once configured, you can run overlaybd images with Docker: |
| 85 | + |
| 86 | +```bash |
| 87 | +# Pull an overlaybd image |
| 88 | +docker pull registry.hub.docker.com/overlaybd/redis:7.2.3_obd |
| 89 | + |
| 90 | +# Run with overlaybd snapshotter |
| 91 | +docker run --rm -it --snapshotter=overlaybd registry.hub.docker.com/overlaybd/redis:7.2.3_obd |
| 92 | +``` |
| 93 | + |
| 94 | +Or set overlaybd as the default snapshotter: |
| 95 | + |
| 96 | +```bash |
| 97 | +# In daemon.json |
| 98 | +{ |
| 99 | + "features": { |
| 100 | + "containerd-snapshotter": true |
| 101 | + }, |
| 102 | + "snapshotter": "overlaybd" |
| 103 | +} |
| 104 | +``` |
| 105 | + |
| 106 | +### Verifying Device Creation |
| 107 | + |
| 108 | +After starting a container, verify the overlaybd device: |
| 109 | + |
| 110 | +```bash |
| 111 | +# Check block devices |
| 112 | +lsblk |
| 113 | + |
| 114 | +# Expected output: |
| 115 | +# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT |
| 116 | +# sda 8:0 0 256G 1 disk /var/lib/containerd/io.containerd.snapshotter.v1.overlaybd/snapshots/xx/block/mountpoint |
| 117 | + |
| 118 | +# Check mounts |
| 119 | +mount | grep overlaybd |
| 120 | +``` |
| 121 | + |
| 122 | +## How It Works |
| 123 | + |
| 124 | +### Container Startup Flow |
| 125 | + |
| 126 | +1. **Image Pull**: Docker pulls overlaybd format layers through containerd |
| 127 | +2. **Init Layer Preparation**: |
| 128 | + - Docker creates an init layer (key ends with `-init`) |
| 129 | + - Snapshotter attaches overlaybd device at parent's mountpoint |
| 130 | + - Returns bind mount to init layer's `fs` directory |
| 131 | +3. **Container Layer Preparation**: |
| 132 | + - Parent is the init layer |
| 133 | + - Returns overlay mount with `lowerdir=init/fs:overlaybd_mountpoint` |
| 134 | +4. **Container Startup**: Docker starts container with the prepared rootfs |
| 135 | + |
| 136 | +### Device Lifecycle |
| 137 | + |
| 138 | +- **Creation**: Device is created during init layer preparation |
| 139 | +- **Sharing**: Multiple containers from the same image share the same overlaybd device |
| 140 | +- **Cleanup**: Device is destroyed when the init layer is removed (after all containers exit) |
| 141 | + |
| 142 | +## Limitations |
| 143 | + |
| 144 | +### 1. Read-Write Mode Restrictions |
| 145 | + |
| 146 | +Docker support **only works with `rwMode: "overlayfs"`**. Other modes (`dir`, `dev`) are not supported because: |
| 147 | +- Docker requires overlayfs for its layer management |
| 148 | +- Init layer mechanism is designed for overlayfs-based storage |
| 149 | + |
| 150 | +### 2. Init Layer Overhead |
| 151 | + |
| 152 | +Docker creates an extra init layer that: |
| 153 | +- Adds one additional layer to the overlay stack |
| 154 | +- Consumes minimal storage (usually contains only Docker metadata) |
| 155 | +- May add slight latency during container preparation |
| 156 | + |
| 157 | +### 3. Device Cleanup Timing |
| 158 | + |
| 159 | +Unlike containerd where devices are cleaned up immediately after container exit: |
| 160 | +- Docker may delay init layer removal |
| 161 | +- Device remains attached until init layer is garbage collected |
| 162 | +- This is normal Docker behavior and doesn't affect functionality |
| 163 | + |
| 164 | +### 4. Storage Compatibility |
| 165 | + |
| 166 | +- Works with **overlaybd format images** (converted or turboOCI) |
| 167 | +- Works with **OCI images** (converted on-the-fly, slower startup) |
| 168 | +- Does not support: |
| 169 | + - Native OCI images with ZFile (use turboOCI instead) |
| 170 | + - Direct block device mode (`rwMode: "dev"`) |
| 171 | + |
| 172 | +### 5. Performance Considerations |
| 173 | + |
| 174 | +- First container startup from an image: Full overlaybd device initialization |
| 175 | +- Subsequent containers from same image: Reuses existing device (fast) |
| 176 | +- Image pull performance: Same as containerd mode |
| 177 | + |
| 178 | +### 6. Known Issues |
| 179 | + |
| 180 | +- **Device busy errors**: May occur if trying to remove an image while containers are still using it. This is handled gracefully by the snapshotter. |
| 181 | +- **Init layer identification**: Relies on `-init` suffix in snapshot keys. Unusual Docker configurations may not be detected correctly. |
| 182 | + |
| 183 | +## Troubleshooting |
| 184 | + |
| 185 | +### Container fails to start |
| 186 | + |
| 187 | +1. Check snapshotter logs: |
| 188 | +```bash |
| 189 | +sudo journalctl -u overlaybd-snapshotter -f |
| 190 | +``` |
| 191 | + |
| 192 | +2. Verify runtimeType configuration: |
| 193 | +```bash |
| 194 | +cat /etc/overlaybd-snapshotter/config.json | grep runtimeType |
| 195 | +``` |
| 196 | + |
| 197 | +3. Ensure overlaybd-tcmu is running: |
| 198 | +```bash |
| 199 | +sudo systemctl status overlaybd-tcmu |
| 200 | +``` |
| 201 | + |
| 202 | +### Device not cleaned up |
| 203 | + |
| 204 | +Check if containers/init layers are still holding references: |
| 205 | +```bash |
| 206 | +# List active snapshots |
| 207 | +sudo ctr snapshot --snapshotter=overlaybd ls |
| 208 | + |
| 209 | +# Check mounts |
| 210 | +mount | grep overlaybd |
| 211 | +``` |
| 212 | + |
| 213 | +### Performance issues |
| 214 | + |
| 215 | +1. Enable trace recording for frequently used images |
| 216 | +2. Check network connectivity to registry |
| 217 | +3. Verify overlaybd cache settings |
| 218 | + |
| 219 | +## Migration from Containerd |
| 220 | + |
| 221 | +If migrating existing setups from containerd to Docker: |
| 222 | + |
| 223 | +1. Images remain compatible (same overlaybd format) |
| 224 | +2. Existing pulled images can be reused |
| 225 | +3. Configuration changes required: |
| 226 | + - Add `runtimeType: "docker"` to snapshotter config |
| 227 | + - Enable containerd snapshotter in Docker daemon |
| 228 | +4. Restart services in order: |
| 229 | + - overlaybd-tcmu |
| 230 | + - overlaybd-snapshotter |
| 231 | + - containerd |
| 232 | + - Docker |
| 233 | + |
| 234 | +## References |
| 235 | + |
| 236 | +- [QUICKSTART](QUICKSTART.md) - General overlaybd setup |
| 237 | +- [EXAMPLES](EXAMPLES.md) - Running overlaybd containers |
| 238 | +- [TurboOCI](TURBO_OCI.md) - On-the-fly OCI image acceleration |
| 239 | +- [Configuration](../script/config.json) - Full configuration options |
0 commit comments