Application Containerization to Azure
Application Containerization to Azure packages an application you already run — on a virtual machine, a developer's server, or an aging host — into container images and deploys it to Azure without rewriting it. The engagement covers a containerization assessment, Dockerfiles and a local run configuration, an image build pipeline into Azure Container Registry, configuration and secrets moved out of the code into Azure Key Vault with managed identity, and deployment to the Azure target that fits the application — Azure Container Apps, Azure App Service, or an existing Azure Kubernetes Service cluster — with health checks, logging, and a handover. Work is billed time and materials at $175 per hour against a written estimate produced by the assessment; a typical single-application engagement runs about 4 weeks, managed by Alex Nikulin.
What this engagement is
The application works. That is the whole problem: it works on one server that somebody built by hand years ago, with settings in a web.config or a .env file, a connection string nobody has rotated, and a deployment procedure that is a person rather than a document. Containerization is the smallest change that fixes this. The code stays the same; what changes is that the application, its runtime, and its dependencies are described in a Dockerfile, built into an image by a pipeline, and run identically on a developer's laptop and in Azure. We start with an assessment because not every application containerizes cleanly: we look at the runtime (a .NET 8-or-later, Java, Node.js, or Python application goes into a Linux image; a .NET Framework application needs a Windows Server Core image, which narrows the Azure targets), local file writes and session state, Windows services and scheduled tasks that need to become separate containers or jobs, GAC and COM dependencies, and licensed components tied to a machine. The assessment produces a per-application plan and a written estimate. Then we build: multi-stage Dockerfiles on Microsoft's official base images — or, for modern .NET, the SDK's own container publish where a Dockerfile adds nothing — a build pipeline in GitHub Actions or Azure Pipelines that tags and pushes to Azure Container Registry, and configuration pulled from environment variables and Azure Key Vault through managed identity so the image carries no secrets. Deployment goes to the target the assessment recommends. Azure Container Apps is the default for Linux workloads that want scaling, ingress, and revisions without a cluster; Azure App Service runs custom containers, and is the practical home for Windows containers; an existing AKS cluster is the target when you already run one or need the Kubernetes API. Two boundaries hold throughout. This is not modernization: if the driver is an end-of-support framework or a database that needs to become Azure SQL, Legacy Application Modernization to Azure re-platforms the code and this service is a step inside it. And this is not a Kubernetes platform build: if AKS is the right target and no cluster exists, Azure Kubernetes Service (AKS) Design and Deployment designs and deploys it first.
Success criteria
What you receive
How the work unfolds
Inventory the application, its runtime and dependencies, how it is configured and deployed today, and what it connects to. Output: the per-component plan, the Linux-or-Windows and target-platform decisions, the required-changes list, and a written estimate you approve before build.
Write and iterate the Dockerfiles until the application builds and runs in a container on a developer machine, with the compose file covering local dependencies such as a database. This is where hidden assumptions — file paths, machine-specific settings, missing native libraries — surface and get fixed.
Azure Container Registry provisioned or connected, the build pipeline authoring images on every merge with version and commit tags, and OIDC federation to Azure so the pipeline holds no secrets.
Environment-specific settings and secrets moved out of the code and the image into environment variables and Azure Key Vault, read through managed identity, and the minimal code changes to support that.
Non-production and production environments stood up on the agreed target, health checks, logging, and TLS in place, and the acceptance cases run against the containerized application in Azure.
DNS or traffic switched to the containerized application in the agreed window with the old host kept available for rollback, the runbook delivered, and the recorded handover held for your team.
Prerequisites
Who does what
IT Partner
- Run the assessment and deliver the per-component plan, target recommendation, cost estimate, and written time-and-materials estimate.
- Write the Dockerfiles, compose file, and build pipeline, and make the minimal code changes required for configuration and secrets.
- Provision the registry, Key Vault, managed identities, and the hosting environments as infrastructure as code where the target supports it.
- Deploy, test against the agreed acceptance cases, and execute the cutover with a rollback path.
- Deliver the runbook and recorded handover, and price every scope change in writing before doing the work.
Your team
- Provide source code, host access, and the people who know how the application runs.
- Approve the assessment estimate before build, and each scope change before it is started.
- Run acceptance tests with realistic scenarios and sign off on the results.
- Approve and communicate the cutover window, and decommission the old host after the agreed soak period.
- Own Azure consumption and any Microsoft or third-party licensing, and operate the application after handover.
What's not included
Limitations & technical notes
Frequently asked questions
What is included in Application Containerization to Azure?
A containerization assessment with a written estimate, Dockerfiles and a local compose setup for each in-scope component, an Azure Container Registry with a build pipeline that tags and pushes images on every merge, configuration and secrets moved into environment variables and Azure Key Vault through managed identity, deployment to Azure Container Apps, App Service, or your existing AKS cluster with health checks and logging, acceptance testing, cutover with rollback, and a runbook with a recorded handover. The code itself stays as it is, apart from the small changes containers require.
How much does it cost?
Work is billed time and materials at $175 per hour. The assessment produces a written estimate for the whole engagement before build begins, and any scope change is priced in writing before we do the work — out-of-scope work never starts without your approval. Nobody at IT Partner earns a sales commission, so nobody is paid more when the invoice grows. Azure consumption is separate and billed by Microsoft; the assessment estimates it.
How long does it take?
About 4 weeks for a typical single application: assessment in week one, Dockerfiles and the build pipeline in weeks one and two, configuration and secrets in weeks two and three, Azure deployment and testing in week three, cutover and handover in week four. Applications with several components, Windows containers, or an undocumented deployment take longer, and the assessment says how much.
Will you change our code?
As little as possible, and only where a container requires it: reading configuration from environment variables instead of a hard-coded file, writing files to a mounted path instead of a local folder, logging to standard output, and handling a graceful shutdown signal. Those changes are listed in the assessment before you approve the estimate. Framework upgrades, refactoring, and new features are not part of this service — that is modernization, which we sell separately.
Our application is .NET Framework on Windows — can it be containerized?
Usually, yes — as a Windows container on a Windows Server Core base image with the .NET Framework runtime. That decision narrows where it can run: Azure Container Apps supports Linux images only, so the practical targets are App Service for Windows containers, which needs its own Premium v3 plan, or a Windows node pool on AKS. The assessment gives you both the containerized-as-is cost and the cost after moving to modern .NET on Linux, because for some applications the modernization pays for itself in hosting alone.
Container Apps, App Service, or AKS — how do you choose?
By what the application needs, not by fashion. Azure Container Apps is the default for Linux workloads: it runs your image on a Kubernetes-based platform Microsoft operates, with scaling, ingress, revisions, and a consumption billing model, and no cluster to upgrade. App Service runs custom containers with familiar slots and plans, and is the home for Windows containers. AKS is the target when you already operate a cluster or genuinely need the Kubernetes API — operators, DaemonSets, a service mesh, node-level control. The assessment recommends one and explains why; the images are the same whichever you pick, so changing your mind later is a deployment change, not a rebuild.
Where do configuration and secrets go?
Out of the image and out of the repository. Non-secret settings become environment variables set per environment on the hosting platform. Secrets — connection strings, API keys, certificates — go into Azure Key Vault and are read through a managed identity, so the container never holds a credential and nothing needs rotating inside an image. The build pipeline authenticates to Azure the same way, through OIDC workload identity federation, so there is no service-principal secret in the pipeline either.
What happens to the database?
It stays outside the container. If it is already on Azure SQL or a managed service, the containerized application connects to it through a connection string in Key Vault. If it is on the same server as the application, the assessment recommends where it should live — usually Azure SQL Database or SQL Managed Instance — and that migration is scoped as a separate engagement rather than hidden inside this one. For local development the compose file runs a database container, which is exactly where containerized databases belong.
The application has scheduled tasks and a Windows service — do those become containers?
Yes, as separate ones. A container should run one process, so a scheduled task becomes a Container Apps job or a scheduled pipeline, and a background Windows service becomes its own container image with the same code base. The assessment lists each background component and what it becomes, so the estimate covers all of them rather than just the web front end.
Can our developers run it locally?
That is half the point. The compose file starts the application and its local dependencies — a database container, a cache — with one command on Windows, macOS, or Linux, using the same image the pipeline builds. A new developer's first day stops being a two-day environment setup, and 'works on my machine' stops being an argument, because everyone's machine runs the same image.
Do we need a Dockerfile, or can the .NET SDK build the image?
For modern .NET, the SDK can publish a container image directly with the PublishContainer target — no Dockerfile — and where that produces exactly what you need we use it, because there is less to maintain. A Dockerfile is still the right tool when the build needs native dependencies, custom base images, Windows containers, or anything beyond a standard .NET publish, and for Java, Node.js, and Python applications. The assessment chooses per component and the runbook documents whichever it is.
Who patches the base images after handover?
Your team, with the pipeline doing the work: rebuilding on a schedule or on a base-image update pulls Microsoft's latest patched runtime image, and vulnerability scanning in Azure Container Registry — where your Defender for Cloud licensing includes it — tells you when an image needs rebuilding. The runbook covers the procedure. If you would rather not own it, ongoing operations are available separately.
Is this the same as application modernization?
No, and the difference matters for the price. Containerization changes how the application is packaged and deployed; the code and framework stay the same, which is why it fits in about four weeks. Modernization changes the code — upgrading .NET Framework to modern .NET, moving data to Azure SQL, replacing components that no longer have supported runtimes — and takes longer. Containerization is often a step inside modernization, and if the assessment shows that your real problem is an end-of-support framework, we will point you at the modernization service rather than containerize an application you will still have to rewrite.
Can you containerize several applications?
Yes. The first application establishes the patterns — Dockerfile conventions, the pipeline template, the Key Vault layout, the target environment — and each additional one is estimated separately and is usually cheaper because the patterns exist. If you have a portfolio, the assessment can cover all of them at once and produce a per-application plan so you can sequence the work.
What happens after go-live?
You own it: the Dockerfiles, pipeline, and Azure resources are in your repository and your subscription, and the runbook and recorded handover cover build, deploy, rollback, and base-image updates. Enhancements, further applications, and help when something breaks are hourly work at the same $175 rate, estimated in writing first; ongoing monitoring and maintenance are available as a separate managed service. There is no proprietary framework and no dependence on us afterward.