Building and pushing container images to Azure Container Registry

When you want to develop and implement the container application in Azure. The first and foremost step you would execute is to build the images and push them into the Azure Container registry. In this article, I will explain how to achieve this objective.

There can be two options when you want to push the container images into ACR.

  • Option 1: Import the pre-existing Docker image from the docker hub (docker.io) registry and deploy it to AKS.
  • Option 2: Create a new custom image, push it to ACR, and then deploy it to AKS.
https://youtu.be/cNq8yryHUSU

Building the environment

First, we will build ACR and AKS instances so we can run the rest of the Azure CLI commands.

#login to Azure
az login

# Set variables
acrname=myacr07
rgname=aksdemo
location=eastus
aksclustername=aksdemo

# Create Resource Group
az group create -l $location -n $rgname

# Create ACR instance
az acr create -n $acrname -g $rgname --sku basic

#Create AKS instance
az aks create -n $aksclustername -g $rgname --generate-ssh-keys --attach-acr $acrname

Pushing pre-existing image to ACR

In this example, we will take the pre-existing docker NGINX image from the Docker hub and import it into ACR.

az acr import  -n $acrname --source docker.io/library/nginx:latest --image nginx:v1

Build a new custom image and push it to ACR

In this example, we will build a new custom image with a Docker file and push it into ACR, and test it. In this example, we have built a custom NGINX image.

docker build -t nginxwithcustomwebpage . -f Dockerfile.txt
docker run -it --rm -d -p 8080:80 --name nginxmywebpage nginxwithcustomwebpage

Here is the explanation of the docker file. It takes the base image of NGINX and copies the index.html kept in the local directory into NGINX. This HTML file contains the custom HTML markup.

FROM nginx
COPY /index.html /usr/share/nginx/html/index.html

Here is the HTML page. It is a very simple HTML page (index.html) that will be copied into NGINX:

<!DOCTYPE html>
<html>
   <body style="background-color:rgb(220, 240, 234);">
      <h1>Welcome to https://livenetwork.in</h1>
      <h2>Azure DevOps Demo for ACR and AKS</h2>
      <h2>Application Demo V1</h2>
   </body>
</html>

Now let’s push this image to ACR. For this first we need to login to ACR and push the image to ACR:

az acr login --name myacr07.azurecr.io

#Tag the image first
docker tag nginxwithcustomwebpage myacr07.azurecr.io/mycustomimage/nginxwithcustomwebpage

# Now push this image
docker push  myacr07.azurecr.io/mycustomimage/nginxwithcustomwebpage

Test if we can pull from ACR and run locally

In this step, we will test if we can pull the custom image from ACR and run it locally. So first we will delete the existing image and then pull the image from ACR.

#Testing if Image works

#First remove the local image and delete the runing container from UI of Docker desktop
docker image rm myacr07.azurecr.io/mycustomimage/nginxwithcustomwebpage

#Now try to pull the image and run it locally
docker pull myacr07.azurecr.io/mycustomimage/nginxwithcustomwebpage

docker run -it --rm -d -p 8080:80 --name nginxwithcustomwebpage7 myacr07.azurecr.io/mycustomimage/nginxwithcustomwebpage 

Now we can see that we are able to run the same image on localhost. See carefully we have exposed container local port to machine port 8080.

What if I want to deploy this image to AKS?

Now for the purpose of deploying this file to AKS, we need to prepare the deployment YAML file.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx0-deployment
  labels:
    app: nginx0-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx0
  template:
    metadata:
      labels:
        app: nginx0
    spec:
      containers:
      - name: nginx
        image: myacr07.azurecr.io/mycustomimage/nginxwithcustomwebpage
        ports:
        - containerPort: 80

Now we will use kubectl command to create the deployment.

kubectl apply -f deployment.yaml

Now let’s test if it is deployed to AKS or not.

Hope you found it to be useful.

Leave a Reply

Your email address will not be published. Required fields are marked *