# Deploy an app from the CLI
In this quickstart, you learn how to deploy multi-container applications onto UCP.
While UCP is intended for deploying multi-container applications, the workflow
for developing them begins outside of the UCP installation. This page explains
the recommended workflow for developing applications. Then, it shows you
step-by-step how to deploy the fully developed application.
The sample is written for a novice network administrator. You should have a
basic skills on Linux systems and `ssh` experience. Some knowledge of Git is
also useful but not strictly required.
>**Note**: The command examples in this page were tested for a Mac OSX environment.
If you are in another, you may need to adjust the commands to use analogous
commands for you environment.
## Understand the development workflow
UCP is at the end of the application development workflow. You should only
deploy, or allowed to be deployed, individual containers or multi-container
applications that have been systematically developed and tested.
Your development team should develop in a local environment using the Docker
open source software (OSS) components. These components include:
* Docker Engine
* Docker Machine (if development is on Mac or Windows)
* Docker Swarm
* Docker Compose
* Docker Hub (for publicly available images)
Developing an application can include using public images from Docker Hub and
developing new custom images. If there are multiple containers involved, the
team should configure and test container port configurations. For applications
that require them, the team may need to create Docker container volumes and
ensure they are of sufficient size.
Once the team has developed a microservice application, they should test it
locally at scale on a Swarm cluster.
The output of application development should be a Docker Compose file and a set
of images ready for deployment. These images can be stored in Docker Hub. If
your company is using Docker Trusted Registry, the team may want to or be
required to store their application images in the company registry. The team
must ensure store the images in an accessible registry account.
## Step 1. Before you begin
This example requires that you have an installed UCP deployment and that you
have [enabled container networking](../configuration/multi-host-networking.md).
Take a moment to check this requirement.
When deploying an application to UCP, you work from a local environment using
the UCP client bundle for your UCP user. You should never deploy from the
command-line while directly logged into a UCP node. The deploy on this page,
requires that your local environment includes the following software:
* [Git](https://git-scm.com/)
* Docker Engine
* Docker Compose
While not always the case, the expectation is your local environment is a
Windows or Mac machine. If your personal machine is a Linux machine that Docker
Engine supports, such a configuration works too.
### Windows or Mac prerequisites
Because Docker Engine and UCP both rely on Linux-specific features, you can't
run natively in Mac or Windows. Instead, you must install the Docker Toolbox
application. Docker Toolbox installs:
* Docker Machine for running `docker-machine` commands
* Docker Engine for running the `docker` commands
* Docker Compose for running the `docker-compose` commands
* Kitematic, the Docker GUI
* a Quickstart shell preconfigured for a Engine command-line environment
* Oracle VirtualBox
These tools enable you to run Engine CLI commands from your Mac OS X or Windows
shell.
Your Mac must be running OS X 10.8 "Mountain Lion" or higher to install Toolbox.
To check your Mac OS X version, see the Docker Engine
getting started on Mac.
On Windows, your machine must have a 64-bit operating system running Windows 7 or
higher. Additionally, you must make sure that virtualization is enabled on your
machine. For information on how to check for virtualization, see the Docker
Engine getting started on Windows.
If you haven't already done so, make you have installed Docker Toolbox on your
local Mac OS X or Windows machine. After a successful installation, continue
to the next step.
### About a Linux environment
If your local environment is Linux, make sure you have installed the correct
Docker Engine for your Linux OS. Also, make sure you have installed Docker
Compose.
## Step 2. Get the client bundle and configure a shell
In this step, you download the *client bundle*. To issue commands to a UCP node,
your local shell environment must be configured with the same security
certificates as the UCP application itself. The client bundle contains the
certificates and a script to configure a shell environment.
Download the bundle and configure your environment.
1. If you haven't already done so, log into UCP.
2. Choose **admin > Profile** from the right-hand menu.
Any user can download their certificates. So, if you were logged in under a
user name such as `davey` the path to download bundle is **davey >
Profile**. Since you are logged in as `admin`, the path is `admin`.
3. Click **Create Client Bundle**.
The browser downloads the `ucp-bundle-admin.zip` file.
4. Open a shell on your local terminal.
5. If you are on Mac or Windows, ensure your shell does not have an active Docker Machine VM.
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
moxie - virtualbox Stopped Unknown
test - virtualbox Running tcp://192.168.99.100:2376 v1.10.1
While Machine has a stopped and running host, neither is active in the
shell. You know this because neither host shows an * (asterisk) indicating
the shell is configured.
6. Create a directory to hold the deploy information.
$ mkdir deploy-app
7. Inside of a `deploy-app` create a directory to hold your UCP bundle files.
$ mkdir deploy-app/bundle
8. Change into the `deploy-app/bundle` directory and move the downloaded bundle into it.
$ cd deploy-app/bundle
$ mv ~/Downloads/ucp-bundle-admin.zip .
9. Unzip the client bundle.
$ unzip bundle.zip
Archive: bundle.zip
extracting: ca.pem
extracting: cert.pem
extracting: key.pem
extracting: cert.pub
extracting: env.sh
10. Change into the directory that was created when the bundle was unzipped
11. Execute the `env.sh` script to set the appropriate environment variables for your UCP deployment
$ source env.sh
12. Verify that you are connected to UCP by using the `docker info` command.
$ docker info
Containers: 11
Running: 11
Paused: 0
Stopped: 0
Images: 22
...