[Docker] Docker applications developer reference
Change-Id: I90e9f5ab67829fd4c9dd6256ed835a458da692eb
This commit is contained in:
parent
095dece649
commit
931fd4406e
205
DockerInterfacesLibrary/README.rst
Normal file
205
DockerInterfacesLibrary/README.rst
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
Docker Interface Library
|
||||||
|
========================
|
||||||
|
|
||||||
|
This library provides 3 major things:
|
||||||
|
|
||||||
|
* DockerApplication: base class that all Docker applications must inherit.
|
||||||
|
Provides a way to define image name and docker container parameters.
|
||||||
|
|
||||||
|
* DockerContainerHost: interface for applications that provide Docker
|
||||||
|
application hosting capabilities. Docker applications use this interface
|
||||||
|
to deploy themselves on the Docker host.
|
||||||
|
|
||||||
|
* Data structures that are pass between DockerApplications and
|
||||||
|
DockerContainerHosts. They define things like volumes, ports etc.
|
||||||
|
Most important data structure is DockerContainer which describes the
|
||||||
|
container itself.
|
||||||
|
|
||||||
|
|
||||||
|
DockerApplication
|
||||||
|
=================
|
||||||
|
|
||||||
|
This is the base class for all Docker applications. At minimum all inheritors
|
||||||
|
must provide an implementation of `getContainer` method. Everything else is
|
||||||
|
either optional or implemented in the base class.
|
||||||
|
|
||||||
|
It has the following properties:
|
||||||
|
|
||||||
|
* `host`: an instance of `DockerContainerHost`. This is the hosting provider
|
||||||
|
(`DockerStandaloneHost`, `KubernetesPod`, etc.) that applications should
|
||||||
|
be deployed to.
|
||||||
|
|
||||||
|
* `applicationEndpoints`: output property that is filled with application
|
||||||
|
endpoints after deployment. See below for exact format details.
|
||||||
|
|
||||||
|
Class also has the following methods:
|
||||||
|
|
||||||
|
* `getContainer`: returns an instance of `DockerContainer` class that describes
|
||||||
|
container information. Alternatively method can return a properties
|
||||||
|
dictionary that would automatically be converted to `DockerContainer` by
|
||||||
|
MuranoPL. This method must be implemented by inheritors!
|
||||||
|
|
||||||
|
* `deploy`: used to deploy Docker application on given `DockerContainerHost`.
|
||||||
|
This method is already implemented in this class and should not be overridden
|
||||||
|
by inheritors. It relies on the information returned by `getContainer`.
|
||||||
|
|
||||||
|
* `getConnectionTo`: used to get full endpoint for another Docker application's
|
||||||
|
port when there is a need to connect two Docker applications.
|
||||||
|
Requires three parameters:
|
||||||
|
|
||||||
|
* `application`: an instance of `DockerApplication` that we want to
|
||||||
|
talk to.
|
||||||
|
* `port`: port number of the target application.
|
||||||
|
* `protocol`: `TCP` or `UDP`.
|
||||||
|
|
||||||
|
Returns a dictionary with two keys - `host` and `port` that represent the
|
||||||
|
endpoint. Note that target application must be deployed before calling this
|
||||||
|
method so it is advised to call `deploy()` first.
|
||||||
|
|
||||||
|
See `DockerGrafana/DockerInfluxDB` as an example or connected Docker
|
||||||
|
applications.
|
||||||
|
|
||||||
|
* `onInstallationStart`: a method that get get called when installation starts.
|
||||||
|
May be overridden by inheritor class to provide extra logging or reporting.
|
||||||
|
|
||||||
|
* `onInstallationFinish`: a method that get get called when installation ends.
|
||||||
|
May be overridden by inheritor class to provide extra logging or reporting.
|
||||||
|
|
||||||
|
|
||||||
|
DockerContainer
|
||||||
|
===============
|
||||||
|
|
||||||
|
This is a data structure defining a Docker container.
|
||||||
|
|
||||||
|
It has the following properties:
|
||||||
|
|
||||||
|
* `name`: container name. Must be unique within single `DockerContainerHost`.
|
||||||
|
This is the same as application name for regular
|
||||||
|
applications.
|
||||||
|
|
||||||
|
* `image`: Docker image name.
|
||||||
|
|
||||||
|
* `commands`: optional list of shell commands to execute upon container start.
|
||||||
|
|
||||||
|
* `env`: a dictionary of environment key-values (inputs for Docker containers)
|
||||||
|
|
||||||
|
* `ports`: a list of `ApplicationPort` instances. This is a list of ports that
|
||||||
|
need to be opened/exposed by the container.
|
||||||
|
|
||||||
|
* `volumes`: an optional mapping that defines volumes that need to be mounted
|
||||||
|
into Docker container. Keys are the paths within container and values are
|
||||||
|
instances of DockerVolume.
|
||||||
|
|
||||||
|
|
||||||
|
ApplicationPort
|
||||||
|
===============
|
||||||
|
|
||||||
|
Defines a network port that need to be exposed by the application.
|
||||||
|
This is a structure with three properties:
|
||||||
|
|
||||||
|
* `port`: port number
|
||||||
|
|
||||||
|
* `protocol`: `TCP` or `UDP`
|
||||||
|
|
||||||
|
* `scope`: one of `public`, `cloud`, `host` or `internal`.
|
||||||
|
This property specifies the scope of port visibility: within the single
|
||||||
|
docker instance (on single server) - `host`, within single
|
||||||
|
`DockerContainerHost` - `internal`, single OpenStack cloud - `cloud`
|
||||||
|
or `public` for ports that are bind to public floating IP.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DockerVolume
|
||||||
|
============
|
||||||
|
|
||||||
|
Represents base class for Docker volumes. One of the two inheritors must be
|
||||||
|
used:
|
||||||
|
|
||||||
|
* `DockerTempVolume`: temporary storage space
|
||||||
|
|
||||||
|
* `DockerHostVolume`: a directory on the host machine that is mounted inside
|
||||||
|
container. The path on host server is specified by the `path` property
|
||||||
|
of `DockerHostVolume`.
|
||||||
|
|
||||||
|
|
||||||
|
DockerContainerHost
|
||||||
|
===================
|
||||||
|
|
||||||
|
Defines an interface that all applications capable of hosting Docker
|
||||||
|
applications must implement. Currently there are two implementations of this
|
||||||
|
interface: `DockerStandaloneHost` and `KubernetesPod`.
|
||||||
|
|
||||||
|
It has the following property:
|
||||||
|
|
||||||
|
* `name`: name of the application instance.
|
||||||
|
|
||||||
|
It also has the following methods:
|
||||||
|
|
||||||
|
* `hostContainer`: Docker applications call this method to register Docker
|
||||||
|
containers on the Docker host during deployment. It accepts single argument -
|
||||||
|
`container` - an instance of DockerContainer class.
|
||||||
|
|
||||||
|
`deleteContainer`: deletes container from Docker host. Container is
|
||||||
|
identified by its name through `name` parameter.
|
||||||
|
|
||||||
|
`getEndpoints`: returns a list of endpoints for specified Docker container
|
||||||
|
Container is identified by its name through `applicationName` parameter.
|
||||||
|
See below on endpoint format specification.
|
||||||
|
|
||||||
|
`getInternalScopeId`: returns an common identifier for all Docker hosts
|
||||||
|
belonging to the same container manager (host aggregation used to group
|
||||||
|
together endpoints of `internal` scope.
|
||||||
|
|
||||||
|
|
||||||
|
Endpoint representation
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Docker container hosts are responsible for management of application
|
||||||
|
endpoints. Application define what ports they want to expose and what
|
||||||
|
should be the scope of visibility for those ports. It is up to the host
|
||||||
|
to map those ports to ports on hosting server and OpenStack floating IPs.
|
||||||
|
|
||||||
|
Single port on the container might be accesses in different ways.
|
||||||
|
It usually it may be accessed using 127.0.0.1 address from other containers
|
||||||
|
on the same server, using internal IP from containers on the same cluster,
|
||||||
|
using internal OpenStack server IP from other servers in the same environment
|
||||||
|
or using floating IP for external access. Scope defines maximum level of
|
||||||
|
visibility in the order `host` -> `internal` -> `cloud` -> `public`.
|
||||||
|
Each subsequent scope extends the visibility for the previous one. So if
|
||||||
|
the application wants a `public` endpoint for its port the host allocates four
|
||||||
|
endpoints for that port starting from 127.0.0.1:port to access it from the
|
||||||
|
same server and up to FIP:port to access it from the Internet. Thus
|
||||||
|
each port/protocol pair results in 1-4 entries in `applicationEndpoints` list.
|
||||||
|
|
||||||
|
Each entry of that list is a dictionary that has the following keys:
|
||||||
|
|
||||||
|
* `address`: IP or hostname.
|
||||||
|
* `port`: port number that caller must use to access the application.
|
||||||
|
* `scope`: greatest visibility scope name for the endpoint.
|
||||||
|
* `portScope`: scope name for the port endpoint was allocated for. For example
|
||||||
|
if `ApplicationPort` had a 'local` scope then two endpoints will be allocated
|
||||||
|
(`host` and `local` and each of them will have `local` in `portScope`).
|
||||||
|
* `containerPort`: port number inside the container.
|
||||||
|
* `protocol`: `TCP` or `UDP`. There can be two endpoints with the same port
|
||||||
|
number that differ only in protocol.
|
||||||
|
|
||||||
|
|
||||||
|
Tips on Docker applications development
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
* MuranoPL can automatically convert dictionaries to an instances of
|
||||||
|
appropriate class when passing it as an input to a function that has
|
||||||
|
proper class() contract on that value. Thus in most cases data structures
|
||||||
|
can be represented as a dictionaries of property name->value form rather
|
||||||
|
than as MuranoPL objects (thus no need to use new() function to construct
|
||||||
|
them)
|
||||||
|
|
||||||
|
* Use `getConnectionTo` method of DockerApplication to get endpoint to
|
||||||
|
access one docker application from another. If application A wants to talk
|
||||||
|
to application B then this method is called on A with an information about
|
||||||
|
what port of B it requires. The method is smart enough to return the nearest
|
||||||
|
endpoint. This if both A and B are located on the same server returned
|
||||||
|
endpoint will likely to have 127.0.0.1 as an address.
|
||||||
|
|
||||||
|
* Call deploy() on dependent applications before retrieving endpoints or
|
||||||
|
obtaining connections to it.
|
29
README.rst
Normal file
29
README.rst
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Docker support for Murano
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Docker is an open-source project that automates the deployment of applications
|
||||||
|
inside software containers. Docker containers could be run either by the
|
||||||
|
Docker itself or by container management platforms that built on top of the
|
||||||
|
Docker and provide extra value to schedule and manage containers on multiple
|
||||||
|
hosts.
|
||||||
|
|
||||||
|
|
||||||
|
This folder contains needed abstractions and applications to develop and
|
||||||
|
run Docker applications:
|
||||||
|
|
||||||
|
* DockerInterfaceLibrary: library that defines a framework for building Docker
|
||||||
|
applications. It provides set of common interfaces and data structures
|
||||||
|
that are used by all Docker applications and Docker hosting services.
|
||||||
|
If you want to develop your own Docker application this is a good place to
|
||||||
|
start. See DockerInterfaceLibrary/README.rst for more details.
|
||||||
|
|
||||||
|
* DockerStandaloneHost: a regular Docker host. Docker containers are run on
|
||||||
|
a dedicated VM running docker software (require pre-built image with
|
||||||
|
docker and murano-agent).
|
||||||
|
|
||||||
|
* Kubernetes: an open source container cluster manager by Google. It allows
|
||||||
|
to schedule and run Docker applications on multiple clustered nodes.
|
||||||
|
Application both installs Kubernetes and provides capabilities to run
|
||||||
|
Docker applications similar to DockerStandaloneHost.
|
||||||
|
|
||||||
|
* Applications: Examples of some of the most popular Docker applications.
|
Loading…
Reference in New Issue
Block a user