# Deploy a container

You point a web service at an image reference, set the port, and Koo rolls it out as a new [deployment](/docs/apps/deployments-and-rollback). Prefer not to build the image yourself? Deploy [from Git](/docs/apps/deploy-from-git) instead; deploys [with AI](/docs/apps/deploy-with-ai) (Coming soon) will follow.

## What you need

- 
- 
-

Image deploys skip the build step entirely: Koo's hosting layer pulls your image as-is and rolls it out.

## Deploy from the console

1. 
2. 
3. 
4. 
5.

The deployment moves through `deploying` and reaches `ready` once the rollout is applied. The previous version keeps running until the new one is ready, and the live state of the service is always visible on its [status](/docs/observability/status). You can also trigger image deploys programmatically through the [Deployments API](/api/deployments).

## Public and private images

Public image references work as-is — no credentials needed.

> **Warning:**
>
> Private registries aren't supported yet. Private-image pull credentials will be managed like sensitive [variables](/docs/configuration/env-and-secrets) (Coming soon) — until then, the image must be publicly pullable.

## Redeploying a new tag

To ship a new release, push the new tag to your registry, update the service's image reference, and deploy again. Every deploy creates a new immutable version — nothing is mutated in place, and you can [roll back](/docs/apps/deployments-and-rollback) to any earlier version.

Prefer a unique tag per release (a version number or commit SHA) over reusing a mutable tag like `latest`, so each deployment maps to a known image.

## Troubleshooting

**Image not found.** Check the reference for typos, confirm the tag exists in the registry, and confirm the image is public — private images fail to pull until private-registry support ships.

**Wrong architecture.** Koo runs `linux/amd64` containers. An image built only for `arm64` (the default on an Apple Silicon machine) will fail to start — rebuild with `docker build --platform linux/amd64 .` or publish a multi-arch image.

**Crash loop.** If the deployment reaches `ready` but the service isn't running, the container is likely exiting on boot. Check the service's [logs](/docs/observability/logs) for the startup error, confirm the port you set matches what the server actually binds, and confirm any required environment variables are set.

Still stuck? Reach out via [support](https://koo.io/support).
