 Hi everyone. Thank you so much for being here. My name is Michelle Neurely. I'm an engineer here at Microsoft. I work on Cloud Native Technologies like Helm, Draft, and Brigade, and here with me today is Patrick. Thank you, Michelle. Hi everybody. I'm Patrick Chenezon. I'm Chief Developer Advocate at Docker and I'm working on open source tools for Cloud Native Developers. Awesome. Thanks so much for being here, Patrick. Today, we're going to talk about Cloud Native application bundles. But first, I want to just take a step back. The last few years have been a whirlwind, right, Patrick? Oh, yes. It's been a lot of fun. First, we've seen developers adopting Cloud massively with more and more choices for managing your infrastructure as code. Then we've seen the adoption of containers as a standardized unit for building and packaging your distributed applications. Yeah. When I say standardized, we built real standards there with everybody in the industry in the open container initiative for image formats, container image formats, container run times, and now distribution. Yeah. We've seen the adoption of serverless, and we've seen the rise of two very important use cases around machine learning and IoT. Yeah. I just get so excited about all of these use cases, and that makes our jobs so much more exciting because we get to help make sure it's easier to build these powerful, robust, reliable distributed applications. Whether you're in the Cloud or on-premise or both, we're using primitives like containers, virtual machines, and storage to make our applications work. Low-level APIs help us actually provision these components, and then we use a lot of different tools to help stitch these components together. You yourself might be using things like arm templates, Terraform, and Ansible, or any number of other tools to help put all of the pieces of your application actually together. But the question we've been asking ourselves is, with so many well-developed tools, and templates, and scripts, how do you actually package up the components that make up your application? That's the problem we've been working on with CNAB. We've also been working on a package manager for the Cloud called Duffel, which helps you install and manage and build CNAB applications. Let's take a look at what a bundle actually looks like. In this file, we are looking at a bundle manifest. Here you'll see some top-level information about this bundle like name, version, and description. The bundle we're looking at installs an example voting application powered by SQL Server. Below that, you'll see the most important part of a bundle, which is the invocation image. An invocation image has all of the install, uninstall, and lifecycle management instructions in it. Below that, you'll see a list of images. These are all of the images that you need for this bundle to actually work. When you export an imported bundle, all of these images come together so that you have all of the dependencies you need for your application. Below that, you'll see a parameter section. This section is to define any configurations that you might want to override on the command line. Below that, you'll see a credential section. This section helps us specify any required credentials you need for your application. Like I mentioned before, the invocation image is the most important part of your bundle. Let's actually look at what CNAP slash example voting app SQL Server actually looks like. On the left here, you'll see a CNAP directory. If I open it up, you'll see that there is a Dockerfile in there. This is the Dockerfile that builds your invocation image. Then above that, you'll see an app directory. The app directory contains lots of different components. These are all of the different components that make up your application. There is a resulting app, there is a voting app, there is a worker, and then there is this Docker compose file, which helps stitch all of these components together. You'll also see a make file. The make file contains all of the lifecycle actions that you need to work with your application. Like install, upgrade, uninstall, and status. What's so great about the invocation image is that all of the dependencies that you need for your application live right here. So once you have that packaged up, you can make that portable and ship it off anywhere you want. Let's actually work with Duffel though, and take it for a test drive and see how this stuff works. We're in that same directory, the voting app SQL Server Bundle Directory, where there is a bundle.json file, the same one that I just showed you. If I use Duffel, I can install that file by using the dash f flag. But first, I'm going to give this application the CNAP installation a name. So we'll say this is an example app, and then we'll pass in the dash f flag and the bundle.json file. Then we'll see it go. So right now it's executing the install action, which is doing a Docker compose up, and installing all of the components that you need. Down at the bottom here, we'll see that our voting app entry point right here can be found at this URL. So we'll open up our browser and go to localhost 5000, and then we'll see the cats and dogs voting app. I recognize this app. Yeah. Good. So cats or dogs? What's your vote? Definitely cats. Okay. All right. One for cats and one for dogs. All right. So just to recap, Duffel is a package manager that helps you install CNAP bundles. The bundle that we saw is, it follows the CNAP specification, which is available and online. This is all open source. You can check it out. All of the resources are there at the end. Duffel is a reference implementation of the CNAP specification, but it's not the only one actually. Turns out Docker has also been doing some work with us on this stuff, and Patrick, tell us what you have. Thank you, Michel. It has been a wonderful collaboration with Microsoft over the past few months. As many of you know, we've been talking about Docker applications at DockerCon last June. So we were working on a similar problem, which is how to package multi-container applications inside a single image. So when we discussed with the Microsoft team about CNAP, we recognized that we are solving the same kind of problem. We actually love the spec so much that we contributed to the CNAP specification. We contributed to Duffel, the reference implementation, and we decided to implement the CNAP specification in our Docker application experimental tool that provides a workflow for developers to package compose-based applications into a CNAP bundle. One of the advantage of implementing it in the Docker toolset is that we also implemented that on Hub and on Docker trusted registry, which means that you can package all your CNAP applications into a single container image and manage them with the same life cycle and tools that you're using for container-based applications. So I'm just going to show you that in action right now if you want. Yeah, show us what you got. All right. Let's take a look at what it looks like in practice. So here, what you see is the hello.dockerapp file. So that specifies my Docker application. As in a CNAP bundle, I have one section with metadata. So here, the name of the application, its version, description, the maintainer. Hey, Gareth, you're the maintainer. If there's a problem with a simple app, I'm going to send you email. Then you have the compose file for the application. So compose is used by millions of developers to specify multi-container application. So here, you can paste your compose file directly in that application bundle, and you can parameterize it. So here, I have version and text and port as parameters. Then in the last section, I have parameters pretty much like in a CNAP bundle that Michel presented before. So once I have that, let's take a look at how I can leverage this. So I can do a Docker app inspect, and that will show me all the details about my Docker application package. So what I showed you before, the service that's going to be exposed as well as the parameter values. So imagine this huge compose file with a bunch of parameters. Here, you just expose the one that the operator will want to override, and then you can default all the rest to something else. Then I can do a Docker app install, and it's just going to install that on my local Kubernetes cluster. So here, I had Docker app target my local Kubernetes cluster running in Docker desktop. And once my stack is up and is ready to run, I can do a status on it, Docker app status, and it tells me that it's exposing port 87.69. So I should be able to curl a local host with that port, and it should give me the right result. Yeah. Hello, DockerCon. So that works. Once I've done that the beauty of having Docker apps is that now I can update some of the parameters directly on the running application. So here, I want to update the port to 98.79. And I'm going to set a different text. Hello, Microsoft Connect. So once I've done that, it's updating my application live. And if I call on the new port 98.79, yeah, I can see that the new message has been put in action. So that's what Docker app lets you do. But behind the scenes, Docker applications are actually seen at bundles. So we implemented the spec in Docker app. So if I do a Docker app bundle, it's going to create an invocation image like Michelle presented before. And when I go there, I see there's a new file called bundle.json. And that's my bundle, my CNAP bundle in json format that corresponds to everything that was in the hello.dockerapp.yaml file. So some of you may argue, we're just going from yaml to json. To me, that's progress. Okay, so we can see all the parameters and the credentials that Michelle was talking about. Okay, so that's fine. So now I have deployed my application, I create a CNAP bundle. The beauty of leveraging CNAP bundles for us is that now all these tools that will implement the CNAP spec. So our tool is just the first non-Microsoft one to do that. But all these tools are interoperable because it's a specification. And so now I have installed duffel on my local machine and I have targeted it at my local Kubernetes cluster. So I needed to set some credentials for it. Once I've done that, I can do a duffel list. And duffel is actually going to talk to my Kubernetes cluster and see that the hello.dockerapp that I just deployed, it's actually a CNAP bundle. And so I can do duffel status on hello. And there I can see all the details of the application that I just deployed with another tool that's using the same specification. So that's the beauty of it. The last thing I wanted to show you is all this is integrated with the Docker tool set. So that means Docker Hub, Docker Trusted Registry. We let you package Docker apps into Docker images. So multi-container application, we let you package them into a single container that you can store on Docker Hub. And that means you can use the same tools and tool chain that you're using to manage container-based applications, things like Docker Trusted Registry, Docker Enterprise Edition, or the Azure Container Registry. So that's the last thing I wanted to show. So once I have created a bundle, once I have created a bundle, I can say Docker app push into a namespace. So here I'm going to push my app into my Shanazone One user and it's just going to do a build and push it to Docker Hub in Shanazone One. So it's pushing the layers and pushing that to there. And once it's over there, I can start sharing it with other people. And so as a user, so here it's successfully pushed and if you're going there, you can see that it's been pushed like right now a few seconds ago. So that's the Shanazone Hello image. That's my invocation image. The last thing I wanted to show you is that once you've done all that, you can in practice start to leverage images that have been pushed on Hub. So Docker app images by other people and you can install them on your machine without having the source code for them. So here I'm just going to inspect another app for monitoring that I just pushed yesterday evening. And so that's in essence what Docker application lets you do. So to summarize Docker application implements the CNAP specification and lets you push and pull CNAP bundles in Docker Hub and Docker trusted registry. Awesome, thank you so much. This looks really exciting and it's been awesome working together as well. So if you like what you've seen here today and want to learn more, all of this work is open source and you can find it at the links that have been posted here. Duffel is open source. It's the package manager for the cloud. It installs CNAP packages. If you're interested in learning more about the CNAP specification, check that resource out. There is a bunch of example bundles that we've posted. Several great examples to help you get started in the bundles repository. So check that link out. There's some that help you spin up specific AKS clusters with certificate managers and stuff installed. There's one that helps you install WordPress with a managed MySQL database service of Azure. And the last link that you see there is one to Docker app. That's all of the great work that Patrick showed you and talked about today. So thanks so much for being here with us, talking about CNAP and Duffel and Docker app and we hope to see you soon.