{"id":3985,"date":"2026-05-05T13:12:32","date_gmt":"2026-05-05T13:12:32","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/05\/05\/generate-images-locally-with-docker-model-runner-and-open-webui\/"},"modified":"2026-05-05T13:12:32","modified_gmt":"2026-05-05T13:12:32","slug":"generate-images-locally-with-docker-model-runner-and-open-webui","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/05\/05\/generate-images-locally-with-docker-model-runner-and-open-webui\/","title":{"rendered":"Generate Images Locally with Docker Model Runner and Open WebUI"},"content":{"rendered":"<p>We\u2019ve all been there: you need to generate a few images for a project, you fire up an AI image service, and suddenly you\u2019re wondering what happens to your prompts, how many credits you have left, or why that \u201csafe content\u201d filter rejected your perfectly reasonable request for a dragon wearing a business suit. What if you could skip all of that and run the whole thing on your own machine, with a slick chat UI on top?<\/p>\n<p>That\u2019s exactly what Docker Model Runner now makes possible. With a couple of commands you can pull an image-generation model, connect it to <a href=\"https:\/\/github.com\/open-webui\/open-webui\" rel=\"nofollow noopener\" target=\"_blank\">Open WebUI<\/a>, and start generating images right from a chat interface fully local, fully private, fully yours.<\/p>\n<p>Let\u2019s build it. <em>Your own private DALL-E, no cloud subscription required.<\/em><\/p>\n<h2 class=\"wp-block-heading\">What You\u2019ll Need<\/h2>\n<ul class=\"wp-block-list\">\n<li><strong>Docker Desktop<\/strong> (macOS) or <strong>Docker Engine<\/strong> (Linux)<\/li>\n<li><strong>~8 GB of free RAM<\/strong> for a small model (more is better)<\/li>\n<li><strong>GPU<\/strong>: optional but highly recommended, NVIDIA (CUDA), Apple Silicon (MPS), or CPU fallback<\/li>\n<\/ul>\n<p>If you can run docker model version without errors, you\u2019re good to go.<\/p>\n<h2 class=\"wp-block-heading\">How\u00a0 Docker Model Runner works with Open WebUI<\/h2>\n<p>Before we dive in, here\u2019s the big picture:<\/p>\n<div class=\"wp-block-ponyo-image\">\n                <img data-opt-id=1816051440  fetchpriority=\"high\" decoding=\"async\" width=\"1000\" height=\"729\" src=\"https:\/\/www.docker.com\/app\/uploads\/2026\/03\/Generate-image-with-Open-WebUI-fig-1.png\" class=\"fade-in\" alt=\"Generate image with Open WebUI fig 1\" title=\"- Generate image with Open WebUI fig 1\" \/>\n        <\/div>\n<p>Docker Model Runner acts as the control plane. It downloads the model, manages the inference backend lifecycle, and exposes a <strong>100% OpenAI-compatible API<\/strong> \u2014 including the POST \/v1\/images\/generations endpoint that Open WebUI already knows how to talk to.<\/p>\n<h2 class=\"wp-block-heading\">Step 1: Pull an Image Generation Model<\/h2>\n<p>Docker Model Runner uses a compact packaging format called <strong>DDUF<\/strong> (Diffusers Unified Format) to distribute image generation models through Docker Hub, just like any other OCI artifact.<\/p>\n<p>Pull a model to get started:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; gutter: false; title: ; notranslate\">\ndocker model pull stable-diffusion\n<\/pre>\n<\/div>\n<p>You can confirm it\u2019s ready:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; gutter: false; title: ; notranslate\">\ndocker model inspect stable-diffusion\n<\/pre>\n<\/div>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\">\n{\n    \"id\": \"sha256:5f60862074a4c585126288d08555e5ad9ef65044bf490ff3a64855fc84d06823\",\n    \"tags\": [\n        \"docker.io\/ai\/stable-diffusion:latest\"\n    ],\n    \"created\": 1768470632,\n    \"config\": {\n        \"format\": \"diffusers\",\n        \"architecture\": \"diffusers\",\n        \"size\": \"6.94GB\",\n        \"diffusers\": {\n            \"dduf_file\": \"stable-diffusion-xl-base-1.0-FP16.dduf\",\n            \"layout\": \"dduf\"\n        }\n    }\n}\n\n<\/pre>\n<\/div>\n<p><strong>What\u2019s happening under the hood?<\/strong> The model is stored locally as a DDUF file, a single-file format that bundles all the components of a diffusion model (text encoder, VAE, UNet\/DiT, scheduler config) into one portable artifact. Docker Model Runner knows how to unpack it at runtime.<\/p>\n<h2 class=\"wp-block-heading\">Step 2: Launch Open WebUI<\/h2>\n<p>This is a magic trick. Docker Model Runner has a built-in launch command that knows exactly how to wire up Open WebUI against the local inference endpoint:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; gutter: false; title: ; notranslate\">\ndocker model launch openwebui\n<\/pre>\n<\/div>\n<p>That\u2019s it. Behind the scenes this runs:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; gutter: false; title: ; notranslate\">\ndocker run --rm \n  -p 3000:8080 \n  -e OPENAI_API_BASE=http:\/\/model-runner.docker.internal\/engines\/v1 \n  -e OPENAI_BASE_URL=http:\/\/model-runner.docker.internal\/engines\/v1 \n  -e OPENAI_API_KEY=sk-docker-model-runner \n  ghcr.io\/open-webui\/open-webui:latest\n\n<\/pre>\n<\/div>\n<p>The model-runner.docker.internal hostname is a special DNS entry that Docker Desktop containers use to reach the Model Runner running on the host, no port-forwarding gymnastics required. If you use Docker CE, you\u2019ll see the docker\/model-runner container address instead of model-runner.docker.internal.<\/p>\n<p>Open your browser at <a href=\"http:\/\/localhost:3000\/\" rel=\"nofollow noopener\" target=\"_blank\"><strong>http:\/\/localhost:3000<\/strong><\/a>, create a local account (it stays offline), and you\u2019ll land on the chat interface.<\/p>\n<div class=\"style-plain wp-block-ponyo-houston\">\n<p><strong>Tip:<\/strong> Want to run it in the background? Add \u2013detach:<\/p>\n<\/div>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; gutter: false; title: ; notranslate\">\ndocker model launch openwebui --detach\n<\/pre>\n<\/div>\n<p>Prefer Docker Compose? See the full setup here: <a href=\"https:\/\/docs.docker.com\/ai\/model-runner\/openwebui-integration\/\" rel=\"nofollow noopener\" target=\"_blank\">https:\/\/docs.docker.com\/ai\/model-runner\/openwebui-integration\/<\/a><\/p>\n<h2 class=\"wp-block-heading\">Step 3: Configure Open WebUI for Image Generation<\/h2>\n<p>Open WebUI already uses Docker Model Runner for text chat automatically (it reads the OPENAI_API_BASE env var). For image generation you need to point it at the images endpoint too, a 30-second job in the settings UI.<\/p>\n<ol class=\"wp-block-list\">\n<li>Got to <a href=\"http:\/\/localhost:3000\/admin\/settings\/images\" rel=\"nofollow noopener\" target=\"_blank\">http:\/\/localhost:3000\/admin\/settings\/images<\/a><\/li>\n<li>Enable <strong>Image Generation<\/strong><\/li>\n<li>Fill in the fields:<\/li>\n<li>Click <strong>Save<\/strong>.<\/li>\n<\/ol>\n<div class=\"wp-block-ponyo-table\" data-highlighted-columns=\"null\" data-highlighted-rows=\"null\">\n<table class=\"responsive-table\">\n<tbody class=\"wp-block-ponyo-table-body\" data-highlighted-columns=\"[]\" data-highlighted-rows=\"[]\">\n<tr class=\"wp-block-ponyo-table-header\">\n<th class=\"wp-block-ponyo-cell\" data-responsive-table-heading=\"Field\">\n<p><strong>Field<\/strong><\/p>\n<\/th>\n<th class=\"wp-block-ponyo-cell\" data-responsive-table-heading=\"Value\">\n<p><strong>Value<\/strong><\/p>\n<\/th>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p><strong>Model<\/strong><\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>stable-diffusion<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p><strong>API Base URL<\/strong><\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>http:\/\/model-runner.docker.internal\/engines\/diffusers\/v1<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p><strong>API Key<\/strong><\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>whatever-you-want<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>Why the dummy API key?<\/strong> Docker Model Runner doesn\u2019t require authentication, it\u2019s a local service. The key is only there because Open WebUI\u2019s form requires one. Any non-empty string works.<\/p>\n<h2 class=\"wp-block-heading\">Step 4: Pull a Chat Model<\/h2>\n<p>Open WebUI is also a full-featured chat interface, and one of its best tricks is letting you <em>ask the LLM to generate an image<\/em> right from the conversation. For that to work, you need a language model too.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; gutter: false; title: ; notranslate\">\n# Lightweight option \u2014 runs on almost any machine\ndocker model pull smollm2\n\n# Recommended \u2014 more capable, better at understanding creative prompts\ndocker model pull gpt-oss\n<\/pre>\n<\/div>\n<p>Both will show up automatically in the Open WebUI model selector. Use smollm2 if you\u2019re tight on RAM, or gpt-oss if you want richer, more creative responses before image generation.<\/p>\n<p><strong>No extra configuration needed<\/strong>, Open WebUI picks up text models from the same OPENAI_API_BASE endpoint it was already configured with.<\/p>\n<h2 class=\"wp-block-heading\">Step 5: Generate Your First Image<\/h2>\n<p>Head back to the main chat view. You\u2019ll notice a small<strong> image icon<\/strong> in the message input bar.<\/p>\n<div class=\"wp-block-ponyo-image\">\n                <img data-opt-id=1580924828  fetchpriority=\"high\" decoding=\"async\" width=\"1000\" height=\"382\" src=\"https:\/\/www.docker.com\/app\/uploads\/2026\/03\/Generate-image-with-Open-WebUI-fig-2.png\" class=\"fade-in\" alt=\"Generate image with Open WebUI fig 2\" title=\"- Generate image with Open WebUI fig 2\" \/>\n        <\/div>\n<p>Click it to toggle image generation mode, type your prompt, and send.<\/p>\n<p>Try something like:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\">\nCreate an image of a whale.\n<\/pre>\n<\/div>\n<p>The first request takes a little longer while the backend loads the model into memory. After that, subsequent images generate much faster.<\/p>\n<div class=\"wp-block-ponyo-image\">\n                <img data-opt-id=1104067694  data-opt-src=\"https:\/\/www.docker.com\/app\/uploads\/2026\/03\/Generate-image-with-Open-WebUI-fig-3.png\"  decoding=\"async\" width=\"1000\" height=\"749\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" class=\"fade-in\" alt=\"Generate image with Open WebUI fig 3\" title=\"- Generate image with Open WebUI fig 3\" \/>\n        <\/div>\n<p>Open WebUI will automatically route image-generation requests to the diffusers backend and text requests to the language model, seamlessly, in the same conversation.<\/p>\n<h2 class=\"wp-block-heading\">Step 6: Generate Images Directly via the API<\/h2>\n<p>For developers who want to integrate image generation into their own apps, Docker Model Runner exposes the standard OpenAI Images API directly:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; gutter: false; title: ; notranslate\">\ncurl -s -X POST http:\/\/localhost:12434\/engines\/diffusers\/v1\/images\/generations \n  -H \"Content-Type: application\/json\" \n  -d '{\n    \"model\": \"stable-diffusion\",\n    \"prompt\": \"A cat sitting on a couch\",\n    \"size\": \"512x512\"\n  }'\n<\/pre>\n<\/div>\n<p>The response follows the OpenAI Images API format exactly:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\">\n{\n  \"created\": 1742990400,\n  \"data\": [\n    {\n      \"b64_json\": \"\/9j\/4AAQSkZJRgABAQAAAQABAAD\/2wBD...\"\n    }\n  ]\n}\n\n<\/pre>\n<\/div>\n<p>Decode and save the image:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\">\ncurl -s -X POST http:\/\/localhost:12434\/engines\/diffusers\/v1\/images\/generations \n  -H \"Content-Type: application\/json\" \n  -d '{\n    \"model\": \"stable-diffusion\",\n    \"prompt\": \"A cat sitting on a couch\",\n    \"size\": \"512x512\"\n  }' | jq -r '.data[0].b64_json' | base64 -d &gt; cat.png\n\n\nopen cat.png\n\n<\/pre>\n<\/div>\n<h3 class=\"wp-block-heading\">Advanced Parameters<\/h3>\n<p>The API supports all the parameters you\u2019d expect from a full diffusers pipeline:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\">\ncurl http:\/\/localhost:12434\/engines\/diffusers\/v1\/images\/generations \n  -X POST \n  -H \"Content-Type: application\/json\" \n  -d '{\n    \"model\": \"stable-diffusion\",\n    \"prompt\": \"A serene Japanese zen garden, cherry blossoms, koi pond, photorealistic\",\n    \"negative_prompt\": \"blurry, low quality, distorted, watermark\",\n    \"size\": \"768x512\",\n    \"n\": 2,\n    \"num_inference_steps\": 30,\n    \"guidance_scale\": 7.5,\n    \"seed\": 42,\n    \"response_format\": \"b64_json\"\n  }'| jq -r '.data[0].b64_json' | base64 -d &gt; garden.png\n<\/pre>\n<\/div>\n<div class=\"wp-block-ponyo-table\" data-highlighted-columns=\"null\" data-highlighted-rows=\"null\">\n<table class=\"responsive-table\">\n<tbody class=\"wp-block-ponyo-table-body\" data-highlighted-columns=\"[]\" data-highlighted-rows=\"[]\">\n<tr class=\"wp-block-ponyo-table-header\">\n<th class=\"wp-block-ponyo-cell\" data-responsive-table-heading=\"Parameter\">\n<p><strong>Parameter<\/strong><\/p>\n<\/th>\n<th class=\"wp-block-ponyo-cell\" data-responsive-table-heading=\"What it does\">\n<p><strong>What it does<\/strong><\/p>\n<\/th>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>prompt<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>What you want in the image<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>negative_prompt<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>What you want to <em>avoid<\/em><\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>size<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>Resolution as WIDTHxHEIGHT (e.g., 512\u00d7512, 768\u00d7512)<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>n<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>Number of images to generate (1\u201310)<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>num_inference_steps<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>More steps = higher quality, slower (default: 50)<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>guidance_scale<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>How closely to follow the prompt (1\u201320, default: 7.5)<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>seed<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<td class=\"wp-block-ponyo-cell\">\n                    <span class=\"responsive-table-label\"><\/span>\n<p>                    <span class=\"responsive-table-value\"><br \/>\n                                                    <span class=\"responsive-table-value-content\"><\/span><\/span><\/p>\n<p>Integer for reproducible results; omit for random<\/p>\n<p>                    <br \/>\n                                            \n            <\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"style-plain wp-block-ponyo-houston\">\n<p><strong>Pro tip:<\/strong> Set a seed while you\u2019re iterating on a prompt. Once you\u2019re happy with the composition, remove it to get unique variations.<\/p>\n<\/div>\n<h2 class=\"wp-block-heading\">Under the Hood: How the Diffusers Backend Works<\/h2>\n<p>When you first request an image, Docker Model Runner:<\/p>\n<ol class=\"wp-block-list\">\n<li><strong>Unpacks the DDUF file<\/strong>: extracts the model components and loads them via DiffusionPipeline.from_pretrained()<\/li>\n<li><strong>Starts a FastAPI server:<\/strong> this is the server that Open WebUI and your curl commands talk to through Docker Model Runner<\/li>\n<\/ol>\n<p>The server is installed on first use by downloading a self-contained Python environment from Docker Hub (version-pinned, so updates are explicit). It lives at ~\/.docker\/model-runner\/diffusers\/ \u2014 no Python version conflicts, no virtualenv setup.<\/p>\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n<p><strong>The model takes forever to load on first use.<\/strong> That\u2019s normal, the model weights are being loaded from disk and transferred to GPU memory. Subsequent requests in the same session are much faster because the backend stays warm.<\/p>\n<p><strong>I get a \u201cNo model loaded\u201d 503 error<\/strong> Make sure the model is fully downloaded (docker model list) and that you\u2019re sending the correct model name in the model field.<\/p>\n<p><strong>Image quality is poor \/ generations are too fast<\/strong> Increase num_inference_steps (try 20\u201350 steps). Higher values = slower but sharper results.<\/p>\n<p><strong>Open WebUI can\u2019t connect to the image endpoint<\/strong> Double-check the URL in Admin Panel \u2192 Settings \u2192 Images. Inside a Docker container it must be http:\/\/model-runner.docker.internal\/engines\/diffusers\/v1, not localhost.<\/p>\n<h2 class=\"wp-block-heading\">Conclusion and What\u2019s Next<\/h2>\n<p>Docker Model Runner makes local image generation simple. It packages and serves image models through an OpenAI-compatible API, while Open WebUI provides an easy chat interface on top. Together, they let you generate images privately on your own machine, either through the browser or directly through the API, without relying on a cloud service.<\/p>\n<p>This feature opens up a lot of possibilities:<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>Multimodal workflows<\/strong>: Chat with a text model about an idea, then immediately generate an image of it \u2014 in the same Open WebUI conversation<\/li>\n<li><strong>RAG + image generation<\/strong>: Build a pipeline that generates illustrations for your documents<\/li>\n<li><strong>Custom models<\/strong>: The diffusers backend supports any DDUF-packaged model, so you can package your own fine-tuned models using Docker\u2019s model packaging tools<\/li>\n<\/ul>\n<p>The Docker Model Runner team is actively expanding model support on Docker Hub. Check docker model search for the latest available models.<\/p>","protected":false},"excerpt":{"rendered":"<p>We\u2019ve all been there: you need to generate a few images for a project, you fire up an AI image [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3986,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[4],"tags":[],"class_list":["post-3985","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/3985","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=3985"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/3985\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media\/3986"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=3985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=3985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=3985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}