Showing posts with label docker. Show all posts
Showing posts with label docker. Show all posts

Reading Notes #381

Suggestion of the week


Cloud


Programming


Miscellaneous


Books

Author: Eric Barker

Nice book. There is always a good story to make a correlation with his current point. Then it could go in a different direction with another story. All the stories are complementary and are adding layer by layer to the more complex message that is delivered to us. Easy to read, enjoyable from the beginning until the last word.

Reading Notes #380

Suggestion of the week

Cloud

Programming

Miscellaneous


~

Reading Notes #379


Cloud

Programming

~

Reading Notes #378



Cloud

Programming

Miscellaneous

Reading Notes #377

Cloud


Programming


Miscellaneous


Books



Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones (James Clear) - An excellent book that is very pleasant to read. I really appreciated the way things are broken in tiny pieces. I don't think this book re-invented the molecular physic, but by cutting, dissecting our habits that way it's hard to think that you can fail. It's easier to get started right now; even starting new habits before finishing the book!






~

    Reading Notes #373

    Cloud


    Programming


    Books



    Donald Miller

    A really interesting book that helps to focus and keep in mind the most important. I didn't read it with a purpose of business really, but it did make me remember past experiences and it was easy to make the relationship between success and when the story was clear. Take the time to read it, do the exercises/ reflections required... it's worth it.










    ~

    Reading Notes #372

    Suggestion of the week

    Cloud

    Programming


    Miscellaneous

    Reading Notes #370

    Cloud


    Programming


    Databases


    Miscellaneous



    Reading Notes #369

    Cloud


    Programming


    Miscellaneous


    ~

    Reading Notes #368

    Reading Notes #368

    Cloud


    Programming


    Miscellaneous


    Books

    Tribes: We Need You to Lead Us 

    Author: Seth Godin 

    A book that will polarize you. In my case, I really enjoyed it until the last page. I felt motivated, and it and was nice.

    Reading Notes #363


    Cloud




    Programming




    Databases




    Miscellaneous


    ~


    Reading Notes #359

    DockerDesktopCloud


    Programming


    Databases


    Miscellaneous


    Books

    How to Be a Bawse_cover
    How to Be a Bawse A Guide to Conquering Life
    Lilly Singh
    Not only the message is strong, but the way she delivers it is awesome. Many times I laugh and nod of the head... Definitely a great book to read at the end of the year when resolution time is not far...









    ~

    Reading Notes #353

    aliasesSuggestion of the week



    Cloud



    Programming



    Books

    The_FIrst_20_HoursThe First 20 Hours: How to Learn Anything...Fast (Josh Kaufman) - That was a very interesting book. I devoured it much faster than I thought! As I was reading it, I was thinking... hey as a developer/programmer I already do a lot of those things... Things change so fast, technology changes... And a few pages later, the author was saying the same thing. :) It looks like we can adapt to many deferent situations. The author share with us a few journeys as he was learning new stuff. While I may not be interested to learn how to play to Go, I found all part of the book very interesting as those journeys a pact with tons of information.
    ISBN: 1591845556 (ISBN13: 9781591845553)


    Miscellaneous


    ~

    How to create an Azure Container Instance (ACI) with .Net Core

    For a project I just started, I need to create Azure resources from code. In fact, I want to create an Azure Container Instance. I already know how to create a container from Logic Apps and Azure CLI/PowerShell, but I was looking to create it inside an Azure Function. After a quick research online, I found the Azure Management Libraries for .NET (aka Fluent API) a project available on Github that do just that (and so much more)!
    In this post, I will share with you how this library work and the result of my test.

    The Goal


    For this demo, I will create a .Net Core console application that creates an Azure Containter Instance (ACI). After it should be easy to take this code and migrate to an Azure Function or anywhere else.

    hello-container

    The Console Application


    Let's create a simple console application with the following command: dotnet new console -o AzFluentDemo cd AzFluentDemo dotnet add package microsoft.azure.management.fluent The last command will use the nuget package available online an add it to our solution. Now we need a service principal so our application could access the Azure subscription. A since way to create one is the use Azure CLI az ad sp create-for-rbac --sdk-auth > my.azureauth This will create an Active Directory (AD) Service Principal (SP) and write the content into the file my.azureauth. Perfect, now open the solution, for this kind of project, I like to use Visual Studio Code so code . will do the work for me. Replace the content of the Program.cs file by the following code.

    using System;
    using Microsoft.Azure.Management.Fluent;
    using Microsoft.Azure.Management.ResourceManager.Fluent;
    using Microsoft.Azure.Management.ResourceManager.Fluent.Core;
    namespace AzFluentDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                string authFilePath = "/home/frank/Dev/AzFluentDemo/my.azureauth";
                string resourceGroupName  = "cloud5mins";
                string containerGroupName = "frank-containers";
                string containerImage  = "microsoft/aci-helloworld";
                // Set Context
                IAzure azure = Azure.Authenticate(authFilePath).WithDefaultSubscription();
                ISubscription sub;
                sub = azure.GetCurrentSubscription();
                Console.WriteLine($"Authenticated with subscription '{sub.DisplayName}' (ID: {sub.SubscriptionId})");
                // Create ResoureGroup
                azure.ResourceGroups.Define(resourceGroupName)
                    .WithRegion(Region.USEast)
                    .Create();
                // Create Container instance
                IResourceGroup resGroup = azure.ResourceGroups.GetByName(resourceGroupName);
                Region azureRegion = resGroup.Region;
                // Create the container group
                var containerGroup = azure.ContainerGroups.Define(containerGroupName)
                    .WithRegion(azureRegion)
                    .WithExistingResourceGroup(resourceGroupName)
                    .WithLinux()
                    .WithPublicImageRegistryOnly()
                    .WithoutVolume()
                    .DefineContainerInstance(containerGroupName + "-1")
                        .WithImage(containerImage)
                        .WithExternalTcpPort(80)
                        .WithCpuCoreCount(1.0)
                        .WithMemorySizeInGB(1)
                        .Attach()
                    .WithDnsPrefix(containerGroupName)
                    .Create();
                Console.WriteLine($"Soon Available at http://{containerGroup.Fqdn}");
            }
        }
    }

    In the first row, I declare a few constants. The path of the service principal created earlier, resource group name, the container group name, and the image I will use. For this demo aci-helloworld. Then we get access with the Azure.Authenticate. Once we got access, it's y easy and the intellisense is fantastic! I don't think I need to explain the rest of the code as it already self-explanatory.

    Got an Error?


    While running you main in contour an error message complaining about the namespace not being registered or something like that ( I'm sorry I did not note the error message). You only need to register it with the command:

    az provider register --namespace Microsoft.ContainerInstance

    It will take a few minutes. To see if it's done you can execute this command:

    az provider show -n Microsoft.ContainerInstance --query "registrationState" 

    Wrap it up


    And voila! If you do a dotnet run after a minute or two, you will have a new web application running inside a container available from http://frank=containers.eastus.azurecontainer.io. It's now very easy to take that code and bring it to an Azure Function or in any .Net Core Application that runs anywhere (Linux, Windows, Mac Os, web, containers, etc.)!


    In a video, please!


    I also have a video of this post if you prefer.



    References




    ~

    Reading Notes #349

    playWithDockerCloud


    Programming


    Miscellaneous


    ~ Enjoy!

    Reading Notes #347

    MVIMG_20181011_103658

    Cloud


    Programming


    Data


    Miscellaneous



    Reading Notes #346

    Cloud

    IMG_20181006_093540 (1)

    Programming


    Miscellaneous

    • Microsoft Ignite Aftermath ( Chris Pietschmann, Dan Patrick) - If you are like me and need to catch up on what append to Ignite, this post is a really good place to start as it contains a list of all the links we need.

    ~

    Reading Notes #344

    CI-CD

    Suggestion of the week


    Cloud


    Programming


    Books

    Five_cover
    The Five Dysfunctions of a Team: A Leadership Fable (Patrick Lencioni) - I really enjoyed this book. The fact the first the material was passed as a story adds a lot of perspective and to our comprehension. In the last chapter the author return to the theories and gives more details. I completely devour that book; I'm looking forward to reading more.


    Miscellaneous


    ~Enjoy


    What happens when you mix Asp.Net Core, different versions of Docker and Azure for the first time

    For a project I have, I wanted to validate if containers were easier to use compare to regular code with services in Azure. I needed to refresh myself with Docker, so I decide to do what I thought would be a simple test: Create an Asp.Net Core web site in a container and access it on my machine.

    This post is about my journey to finally achieve this goal, as you may guess it didn't work on the first attempt.

    The Goal


    One reason why I was looking at containers, it's because it's supposed to be working everywhere right? Well yes but sometimes with a little of effort. The goal here is to be able to run the same container on my main PC, my surface, a Linux VM and of course in Azure.

    The context


    I have a different setup on my main machine and on my surface. On my PC, I'm using VirtualBox for my VMs so I'm not running Docker for windows, but Docker Toolbox. This flavor (older version) of Docker will create a VM in VitualBox instead of Hyper-V. I couldn't use Docker for Windows like on my Surface, because the two virtualization softwares don't run side by side.

    I also wanted to use only tools available on each of this platform, so I decided not to use Visual Studio IDE (the big one). Moreover, I wanted to understand what was happening so I didn't want too much magic involve. Visual Studio is a fantastic tool and I love it. :)

    Installing Docker


    I needed to install Docker on my Surface. I downloaded Docker Community Edition (CE), and because Hyper-V was already installed everything ran smoothly. On Windows, you need to share the "C" drive from the Docker setting. However, I was getting a strange "bug" when trying to share mine. It was asking my to login with AzureAD and was ignoring my request by letting the share drive uncheckeddockerazureadcredentials.

    Thanks to my new friend Tom Chantler, I did search for too long. See the thing is I'm using an AzureAD account to login, and something is not working right at the moment. As explained in Tom's post: Sharing your C drive with Docker for Windows when using Azure Active Directory, to walkaround this situation, I only had to create a new user account with the exact name as my AzureAD account, but without the AzureAD prefix (ex: AzureAD\FBoucher became FBoucher). Once that was done I could share the drive without any issue.

    Let's get started with the documentation


    The HelloWord container worked like a charm, so I was ready to create my Asp.Net Core website. My reflex was to go on docs.docker.com and follow the instruction from Create a Dockerfile for an ASP.NET Core application. I was probably doing something wrong, because it didn't work. So I decided to start from scratch and do every step manually... I always learn more that way.

    Let's start by the beginning


    Before moving everything in a container, we need a web application. This can be easily done from the terminal/ command prompt, with the commands:

    dotnet new mvc -o dotnetcoredockerappservicedemo
    
    cd dotnetcoredockerappservicedemo
    
    dotnet restore
    
    dotnet publish -c release -o app/ .
    

    Here we create a new folder with a website using the mcv template. I then go in that new folder and restore the Nuget package. To test the we site locally simply use dotnet run. And finally, we build and publish the application into the subfolder app.


    Moving to Docker


    Now that we have our app it's time to containerize it. We need to add some Docker instruction in a dockerfile. Add a new file name dockerfile (no extension) to the root folder and copy/paste these commandes:
    
    # dockerfile
    
    FROM microsoft/dotnet:2.1-aspnetcore-runtime 
    WORKDIR /app COPY /app /app 
    ENTRYPOINT [ "dotnet" , "dotnetcoredockerappservicedemo.dll"]
    

    To start Docker with Docker Tool just start the Docker Quickstart Terminal
    This instruction will specify how to build our container. First, it will download the image microsoft/aspnetcore or microsoft/dotnet:2.1-aspnetcore-runtime. We specify the work directory, then copy the app folder to app folder inside the container. Finally, we specify the entry point of our application telling it to start with dotnet.
    Like Git and it's gitIgnore file docker has the same thing with .dockerignore (no extension). Add that file into your folder to ignore the bin and obj folder.

    
    # .dockerignore
    bin\ obj\
    

    Now that the instructions about how to build our container are completed, we can build our container. Execute the following command:

    docker build -t dotnetcoredockerappservicedemo .

    This will build dotnetcoredockerappservicedemo from the current folder.

    Running Docker container locally


    Everything is in place, the only thing missing is to run it. If you want to run it locally just go with this command:

    docker run -p 8181:80 dotnetcoredockerappservicedemo

    On my machine, the port 80 is always used. So I remap the port 80 to 8181, feel free to change it at your convenience. The website will be available at localhost:8181

    If you are running Docker Tool (older version of Docker), you need to get the IP of your VM. To get it do

    docker-machine ip

    Running in the cloud


    To run our container into Azure you will need to publish it to the cloud first. It could be on DockerHub or in a private registry on Azure. I decided to go with Azure. First, we need to create a registry, then publish our container.

    az group create --name dotnetcoredockerappservicedemo --location eastus
    
    az acr create --resource-group dotnetcoredockerappservicedemo --name frankContainerDemo01 --sku Basic --admin-enabled true
    
    az acr credential show -n frankContainerDemo01
    

    The last command az acr credential show will provides information to tag our container with our repository name and also gives us the credential to be able to push. Of course, you could go to the portal.azure.com and get the information from the Registry's Access Keys blade.

    docker tag dotnetcoredockerappservicedemo frankcontainerdemo01.azurecr.io/dotnetcoredockerappservicedemo:v1

    Let's connect our docker to our registry, and then push (upload) our container to Azure.

    
    # The https:// is important...
    
    docker login https://frankcontainerdemo01.azurecr.io -u frankContainerDemo01 -p <Password_Retreived>
    
    docker push frankcontainerdemo01.azurecr.io/dotnetcoredockerappservicedemo:v1
    


    Great the container is in Azure. Now let's create a quick webApp to see it. We could also use the Azure Container Instance (ACI) that would be only one command, but because the demo is a website, it won't make sense to use ACI for that.

    To get an Application service, we need a Service plan, and then we will create an "empty" webapp. To do that we will specify the runtime without providing any code/binary/container. I wasn't able to create a webapp from a private Azure registry in one command, so this is why I'm doing it in two.

    az appservice plan create --name demoplan --resource-group dotnetcoredockerappservicedemo --sku S1 --is-linux
    
    az webapp create -g dotnetcoredockerappservicedemo -p demoplan -n frankdockerdemo --runtime "DOTNETCORE|2.1"
    

    On Windows, I got the following error message: '2.1' is not recognized as an internal or external command, operable program or batch file. The PowerShell command line escape "--%" solves the problem: az --% webapp create -g dotnetcoredockerappservicedemo -p demoplan -n frankdockerdemo --runtime "DOTNETCORE|2.1"

    If you check the website right now you should have page saying that the site is up but empty. Let's update the container settings with our registry and container settings.

    az webapp config container set -n frankdockerdemo -g dotnetcoredockerappservicedemo --docker-custom-image-name frankcontainerdemo01.azurecr.io/dotnetcoredockerappservicedemo:v1 --docker-registry-server-url https://frankcontainerdemo01.azurecr.io --docker-registry-server-user frankContainerDemo01 --docker-registry-server-password <Password_Retreived> 

    It's works of course!
    final2


    Conclusion


    It's only four steps: create the .Net Core application, package it into a Docker container, publish our container into our Azure Registry, and create an application service base on that container. However, because all this tech are cross-platform, sometimes you get some little tiny differences between the platform, and those could become time-consuming. It was a great little project that turned out to be a lot more than expected, but I learn so much!

    I'm very happy with the result... expect more of Docker in the future!


    In a video, please!


    I also have a video of this post if you prefer.




    References

    Reading Notes #343

    2018-09-02_20-42-43Cloud


    Programming