Nulecule: Packaging, Distributing and Deploying Multi-Container Applications the Cloud Way ContainerCon North America 2016 Charlie Drage Container Tools / Project Atomic @ Red Hat cdrage @ http://projectatomic.io Wait, what’s Project Atomic? Lightweight OS designed with the sole purpose of deploying containerized applications Container tools such as the Atomic CLI to deploy your applications GUI tools such as the Cockpit Project to help manage What’s the current problem? Multiple standards in multi-container deployment orchestrators (Kubernetes, OpenShift, Docker Compose, Mesos, Nomad, Dokku, Flynn, etc..) Even though… We’re slowly converging to a single standard in the container front (single image and runtime spec) via the OCI (Open Container Initiative) e.g. rkt + docker https://www.opencontainers.org/ Nulecule && Atomic App A simple way of deploying multi-container applications to provider-agnostic environments Nulecule = specification Atomic App = implementation "Well, it all starts when a nulecule comes out of its nest...” - Homer Issues with container distribution / orchestration As awesome as container orchestration tools are, (imo) they’ve got a high learning curve. What distribution, parameterization methods? How do I deploy a Kubernetes example as simple as `docker run -p 80:80 nginx`? Containers galore Over 941 different MariaDB containers on Docker Hub So many varieties and yet only one that people should use * Last checked August 3rd 2016 How we help Creating a multi-container application for say, ex. Ops to deploy Building a single image for deployment Deploy and undeploy from multiple providers Distributing parameterized apps Composability to multiple orchestration providers Atomic App is packaged into a single deployment container Multi-container applications Composability Import and use an official container into your application *Similar to “Docker Compose” Metadata Most environment variables require some sort of change Metadata and various orchestrators Metadata: No common way to distribute metadata from ops to devs and vice-versa. Unable to provide environment variables at deployment time (have to specify in an .env file) Orchestrators: Multiple deployment tools and file formats Creating your first Nulecule file It’s super easy! “Hello world” Includes: specification, composability, distribution, parametrization, orchestrator agnostic --specversion: 0.0.2 id: helloapache-app metadata: name: Hello Apache App appversion: 0.0.1 description: Atomic app for deploying a really basic Apache HTTP server location: docker.io/projectatomic/helloapache params: - name: provider description: The specified default provider. default: kubernetes graph: - name: helloapache-app params: - name: image description: The webserver image default: centos/httpd - name: hostport description: The host TCP port as the external endpoint default: 80 artifacts: docker: - file://artifacts/docker/hello-apache-pod_run kubernetes: - file://artifacts/kubernetes/hello-apache-pod.json marathon: - file://artifacts/marathon/helloapache.json Another spec? Let’s build an Etherpad example with MariaDB Identifier and Specification Version Give the ID that will be used for import into different applications as well as the current spec version --specversion: "0.0.2" id: etherpad-app Metadata Included metadata available for scraping metadata: name: etherpad-app appversion: 0.0.1 description: Etherpad demo location: docker.io/user/etherpad-app Params Global parameters params: - name: provider description: Default provider default: kubernetes Graph The “bread and butter” of the Nulecule file format. Define application components and dependencies. graph: - name: mariadb-centos7-atomicapp ... - name: etherpad-app ... Graph Source Import an already pre-made Nulecule application graph: - name: mariadb-centos7-atomicapp source: docker://user/mariadb-atomicapp ... Graph Params Provide the correct values at deployment time graph: ... - name: etherpad-app params: - name: image description: Container image default: centos/etherpad - name: hostport description: Host TCP Port default: 9001 - name: db_user description: Database User - name: db_pass description: Database Password - name: db_name description: Database Name - name: db_host description: Database hostname/IP default: mariadb - name: db_port description: Database service port default: 3306 Answers file Graph parameters can be pre-defined prior to deployment instead of “answered” [general] provider = kubernetes [etherpad-app] db_user = foo db_host = bar ... Graph Artifacts Metadata templates for different orchestrators graph: ... - name: etherpad-app params: ... artifacts: docker: ... kubernetes: - file://artifacts/kubernetes/etherpad-rc.yaml - file://artifacts/kubernetes/etherpad-svc.yaml openshift: - inherit: - kubernetes Graph Params in kubernetes/etherpad-rc.yaml Dollar sign variable replacement in each artifact file --apiVersion: v1 kind: ReplicationController metadata: name: etherpad labels: name: etherpad spec: replicas: 1 selector: name: etherpad template: metadata: labels: name: etherpad spec: containers: - name: etherpad image: $image ports: - name: etherpad-server containerPort: $hostport env: - name: DB_HOST value: $db_host - name: DB_DBID value: $db_name - name: DB_PASS value: $db_pass - name: DB_PORT value: $db_port - name: DB_USER value: $db_user Atomic App Reference implementation of Nulecule Installer, manager, container builder, single command deployment Create a Nulecule application in one container Build your app on top of our Atomic App base image FROM projectatomic/atomicapp:0.6.1 MAINTAINER Red Hat, Inc. <[email protected]> LABEL io.projectatomic.nulecule.providers="kubernetes" \ io.projectatomic.nulecule.specversion="0.0.2" ADD /Nulecule /Dockerfile README.md /application-entity/ ADD /artifacts /application-entity/artifacts DEMO Learn more at Project: http://projectatomic.io Github: http://github.com/projectatomic/nulecule http://github.com/projectatomic/atomicapp IRC: #nulecule @ freenode Mailing list: [email protected] Charlie Drage, @cdrage, [email protected]
© Copyright 2026 Paperzz