Deploy Docker Image with AWS ECS (Part 1)

One of the things I have been working on is to help our developers to containerize their applications and deploy them to AWS ECS. 
In this post, I will walk through the steps to upload a Docker image to AWS ECR (Elastic Container Repository).
As the first step, we need to provision the ECR with CloudFormation template.
Below is a simple CFN template written in YAML.

AWSTemplateFormatVersion: "2010-09-09"

Description: >
  Play stack

    Default: tomrepo
    Description: ECR Repoistory Name     
    Type: String     # required
    ConstraintDescription: must be a name

    Type: AWS::ECR::Repository
      RepositoryName: !Ref RepoName     
    Type: AWS::ECS::Cluster
      ClusterName: tomecscluster     
    Description: Tempalte version
    Value: "1.0"
Deploy the CFN template with AWS CLI command below.

aws cloudformation create-stack --stack-name createecs --template-body file://mytemplate.yaml --parameters ParameterKey=RepoName,ParameterValue=webfront
After the template is successfully deployed, go to ECS in AWS Console and confirm the repository and cluster is created.

Next we need to build the Docker image locally to be used for this deployment. In this example I use my local Docker engine installed on my Win 10 workstation. You can learn more about Docker for Windows here.
Once Docker is installed and running, you should see a little docker icon in the task tray. Make sure it is switched to Linux Containers.
Open CMD and create a folder to host the docker image.
Create a file named as “Dockfile” in the folder. Yes, it does not have an extension in the file name.
Copy the code below to the file. The Dockerfile basically uses a Ubuntu image and installed Apache web service on it along with a simple webpage named index.html.

FROM ubuntu:12.04

# Install dependencies
RUN apt-get update -y
RUN apt-get install -y apache2

# Install apache and write hello world message
RUN echo "Hello World!" > /var/www/index.html

# Configure apache
RUN a2enmod rewrite
RUN chown -R www-data:www-data /var/www
ENV APACHE_LOG_DIR /var/log/apache2


CMD ["/usr/sbin/apache2", "-D",  "FOREGROUND"]
Save the file and we can now build the image.

docker build -t webserver .
Before we upload the image to ECR, we need to test it out locally first.
Before you run the image (create the container), make sure port 80 on your local machine is not used.

docker run -p 80:80 webserver
Now, test access to http://localhost, you should see the “Hello World” page.
The image is now ready to be pushed to AWS ECR.
First, we need to retrieve the login information to authenticate our local Docker client with ECR. Run the command below and COPY the output. Change the region parameter if your ECR is in a different region.

aws ecr get-login --no-include-email --region ap-southeast-1
The output of the command should look like something below.
Copy the whole output and paste it into command line. Press enter to execute it.
You should get output like below, indicating your Docker client is now authenticated with AWS ECR.
Tag the image you got and make it ready for the push. If you run docker images, you should see a new image with aws tag
You can now push the image.

docker push
It may take sometime for the image to be uploaded. But eventually you should see something like below.
In AW Console, under the ECR “webfront” repository, you should now see the image tagged as latest.


Popular posts from this blog

Install AWS CLI on WSL Ubuntu

On Premise Mailbox user missing in Exchange Online GAL

Receive error: Target mailbox doesn't have an SMTP proxy matching '' when move mailbox to Office 365