mirror of https://github.com/docker/docs.git
Add Machine docs
Signed-off-by: Nathan LeClaire <nathan.leclaire@gmail.com>
This commit is contained in:
parent
ce16cf4d7c
commit
8fbc1cf476
|
@ -0,0 +1,449 @@
|
|||
page_title: Working with Docker Machine
|
||||
page_description: Working with Docker Machine
|
||||
page_keywords: docker, machine, virtualbox, digitalocean, amazonec2
|
||||
|
||||
# Working with Docker Machine
|
||||
|
||||
## Overview
|
||||
|
||||
In order to run Docker containers, you must have a
|
||||
[Docker daemon](https://docs.docker.com/arch) running somewhere. If you’re on a
|
||||
Linux system and you want to run a container on your local machine, this is
|
||||
straightforward: you run the daemon on your local machine and communicate with
|
||||
it over the Unix socket located at `/var/run/docker.sock` (this all happens
|
||||
behind the scenes when you run `docker` on the command line). However, if you
|
||||
want to control containers from Mac OSX / Windows or manage them on a remote
|
||||
server, you’ll need to create a new machine (probably a virtual machine) with
|
||||
Docker installed and execute Docker commands for that host remotely.
|
||||
Traditionally, the way to do this was either:
|
||||
|
||||
- manual (open the web interface or virtualization application, make the machine
|
||||
yourself, manually install Docker, etc.) and therefore tedious and error-prone
|
||||
- with existing automation technologies, which usually entail a quite high skill
|
||||
threshold
|
||||
|
||||
Docker's [`machine`](https://github.com/docker/machine) is a tool for making the
|
||||
process of creating and managing those machines (and running Docker commands
|
||||
against them) much faster and easier for users. `machine` allows users to
|
||||
quickly create running instances of the Docker daemon on local virtualization
|
||||
platforms (e.g. Virtualbox) or on cloud providers (e.g. AWS EC2) that they can
|
||||
connect to and control from their local Docker client binary.
|
||||
|
||||
## Installation
|
||||
|
||||
Docker Machine is supported on Windows, OSX, and Linux. To install Docker
|
||||
Machine, download the appropriate binary for your OS and architecture to the
|
||||
correct place in your `PATH`:
|
||||
|
||||
- [Windows - x86_64]()
|
||||
- [OSX - x86_64]()
|
||||
- [Linux - x86_64]()
|
||||
- [Windows - i386]()
|
||||
- [OSX - i386]()
|
||||
- [Linux - i386]()
|
||||
|
||||
Now you should be able to check the version with `machine -v`:
|
||||
|
||||
```
|
||||
$ machine -v
|
||||
machine version 0.0.2
|
||||
```
|
||||
|
||||
## Getting started with Docker Machine using a local VM
|
||||
|
||||
Let's take a look at using `machine` to creating, using, and managing a Docker
|
||||
host inside of [VirtualBox](ihttps://www.virtualbox.org/).
|
||||
|
||||
First, ensure that
|
||||
[VirtualBox 4.3.20](https://www.virtualbox.org/wiki/Downloads) is correctly
|
||||
installed on your system.
|
||||
|
||||
If you run the `machine ls` command to show all available machines, you will see
|
||||
that none have been created so far.
|
||||
|
||||
```
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
```
|
||||
|
||||
To create one, we run the `machine create` command, passing the string
|
||||
`virtualbox` to the `--driver` flag. The final argument we pass is the name of
|
||||
the machine - in this case, we will name our machine "dev".
|
||||
|
||||
This will download a lightweight Linux distribution
|
||||
([boot2docker](https://github.com/boot2docker/boot2docker)) with the Docker
|
||||
daemon installed, and will create and start a VirtualBox VM with Docker running.
|
||||
|
||||
|
||||
```
|
||||
$ machine create --driver virtualbox dev
|
||||
INFO[0000] Creating SSH key...
|
||||
INFO[0000] Creating VirtualBox VM...
|
||||
INFO[0007] Starting VirtualBox VM...
|
||||
INFO[0007] Waiting for VM to start...
|
||||
INFO[0038] "dev" has been created and is now the active machine. To point Docker at this machine, run: export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity
|
||||
```
|
||||
|
||||
You can see the machine you have created by running the `machine ls` command
|
||||
again:
|
||||
|
||||
```
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev * virtualbox Running tcp://192.168.99.100:2375
|
||||
```
|
||||
|
||||
The `*` next to `dev` indicates that it is the active host.
|
||||
|
||||
Next, as noted in the output of the `machine create` command, we have to tell
|
||||
Docker to talk to that machine directly by setting the `DOCKER_HOST`
|
||||
and `DOCKER_AUTH` environment variables:
|
||||
|
||||
```
|
||||
$ export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity
|
||||
```
|
||||
|
||||
You can now run Docker commands on this host:
|
||||
|
||||
```
|
||||
$ docker run busybox echo hello world
|
||||
Unable to find image 'busybox' locally
|
||||
Pulling repository busybox
|
||||
e72ac664f4f0: Download complete
|
||||
511136ea3c5a: Download complete
|
||||
df7546f9f060: Download complete
|
||||
e433a6c5b276: Download complete
|
||||
hello world
|
||||
```
|
||||
|
||||
Any exposed ports are available on the Docker host’s IP address, which you can
|
||||
get using the `machine ip` command:
|
||||
|
||||
```
|
||||
$ machine ip
|
||||
192.168.99.100
|
||||
```
|
||||
|
||||
Now you can manage as many local VMs running Docker as you please- just run
|
||||
`machine create` again.
|
||||
|
||||
If you are finished using a host, you can stop it with `docker stop` and start
|
||||
it again with `docker start`:
|
||||
|
||||
```
|
||||
$ machine stop
|
||||
$ machine start
|
||||
```
|
||||
|
||||
If they aren't passed any arguments, commands such as `machine stop` will run
|
||||
against the active host (in this case, the VirtualBox VM). You can also specify
|
||||
a host to run a command against as an argument. For instance, you could also
|
||||
have written:
|
||||
|
||||
```
|
||||
$ machine stop dev
|
||||
$ machine start dev
|
||||
```
|
||||
|
||||
## Using Docker Machine with a cloud provider
|
||||
|
||||
One of the nice things about `machine` is that it provides several “drivers”
|
||||
which let you use the same interface to create hosts on many different cloud
|
||||
platforms. This is accomplished by using the `machine create` command with the
|
||||
`--driver` flag. Here we will be demonstrating the
|
||||
[Digital Ocean](https://digitalocean.com) driver (called `digitalocean`), but
|
||||
there are drivers included for several providers including Amazon Web Services,
|
||||
Google Compute Engine, and Microsoft Azure.
|
||||
|
||||
Usually it is required that you pass account verification credentials for these
|
||||
providers as flags to `machine create`. These flags are unique for each driver.
|
||||
For instance, to pass a Digital Ocean access token you use the
|
||||
`--digitalocean-access-token` flag.
|
||||
|
||||
Let's take a look at how to do this.
|
||||
|
||||
To generate your access token:
|
||||
|
||||
1. Go to the Digital Ocean administrator panel and click on "Apps and API" in
|
||||
the side panel.
|
||||
2. Click on "Generate New Token".
|
||||
3. Give the token a clever name (e.g. "machine"), make sure the "Write" checkbox
|
||||
is checked, and click on "Generate Token".
|
||||
4. Grab the big long hex string that is generated (this is your token) and store it somehwere safe.
|
||||
|
||||
Now, run `machine create` with the `digitalocean` driver and pass your key to
|
||||
the `--digitalocean-access-token` flag.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
$ machine create \
|
||||
--driver digitalocean \
|
||||
--digitalocean-access-token 0ab77166d407f479c6701652cee3a46830fef88b8199722b87821621736ab2d4 \
|
||||
staging
|
||||
INFO[0000] Creating SSH key...
|
||||
INFO[0000] Creating Digital Ocean droplet...
|
||||
INFO[0002] Waiting for SSH...
|
||||
INFO[0085] "staging" has been created and is now the active machine. To point Docker at this machine, run: export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity
|
||||
```
|
||||
|
||||
For convenience, `machine` will use sensible defaults for choosing settings such
|
||||
as the image that the VPS is based on, but they can also be overridden using
|
||||
their respective flags (e.g. `--digitalocean-image`). This is useful if, for
|
||||
instance, you want to create a nice large instance with a lot of memory and CPUs
|
||||
(by default `machine` creates a small VPS). For a full list of the
|
||||
flags/settings available and their defaults, see the output of
|
||||
`machine create -h`.
|
||||
|
||||
When the creation of a host is initiated, a unique SSH key for accessing the
|
||||
host (initially for provisioning, then directly later if the user runs the
|
||||
`machine ssh` command) will be created automatically and stored in the client's
|
||||
directory in `~/.docker/machines`. After the creation of the SSH key, Docker
|
||||
will be installed on the remote machine and the daemon will be configured to
|
||||
accept remote connections over TCP using
|
||||
[libtrust](https://github.com/docker/libtrust) for authentication. Once this
|
||||
is finished, the host is ready for connection.
|
||||
|
||||
Just like with in the last section, we must run:
|
||||
|
||||
```
|
||||
$ export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity
|
||||
```
|
||||
|
||||
And then from this point, the remote host behaves much like the local host we
|
||||
created in the last section. If we look at `machine`, we’ll see it is now the
|
||||
active host:
|
||||
|
||||
```
|
||||
$ machine active dev
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev virtualbox Running tcp://192.168.99.103:2375
|
||||
staging * digitalocean Running tcp://104.236.50.118:2375
|
||||
```
|
||||
|
||||
To select an active host, you can use the `machine active` command. You must
|
||||
re-run the `export` commands previously mentioned.
|
||||
|
||||
```
|
||||
$ machine active dev
|
||||
$ export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev * virtualbox Running tcp://192.168.99.103:2375
|
||||
staging digitalocean Running tcp://104.236.50.118:2375
|
||||
```
|
||||
|
||||
To remove a host and all of its containers and images, use `machine rm`:
|
||||
|
||||
```
|
||||
$ machine rm dev staging
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
```
|
||||
|
||||
## Adding a host without a driver
|
||||
|
||||
You can add a host to Docker which only has a URL and no driver. Therefore it
|
||||
can be used an alias for an existing host so you don’t have to type out the URL
|
||||
every time you run a Docker command.
|
||||
|
||||
```
|
||||
$ machine create --url=tcp://50.134.234.20:2376 custombox
|
||||
$ export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
custombox * none Running tcp://50.134.234.20:2376
|
||||
```
|
||||
|
||||
## Subcommands
|
||||
|
||||
#### active
|
||||
|
||||
Get or set the active machine.
|
||||
|
||||
```
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev virtualbox Running tcp://192.168.99.103:2375
|
||||
staging * digitalocean Running tcp://104.236.50.118:2375
|
||||
$ machine active dev
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev * virtualbox Running tcp://192.168.99.103:2375
|
||||
staging digitalocean Running tcp://104.236.50.118:2375
|
||||
```
|
||||
|
||||
#### create
|
||||
|
||||
Create a machine.
|
||||
|
||||
```
|
||||
$ machine create --driver virtualbox dev
|
||||
INFO[0000] Creating SSH key...
|
||||
INFO[0000] Creating VirtualBox VM...
|
||||
INFO[0007] Starting VirtualBox VM...
|
||||
INFO[0007] Waiting for VM to start...
|
||||
INFO[0038] "dev" has been created and is now the active machine. To point Docker at this machine, run: export DOCKER_HOST=$(machine url) DOCKER_AUTH=identity
|
||||
```
|
||||
|
||||
#### inspect
|
||||
|
||||
Inspect information about a machine.
|
||||
|
||||
```
|
||||
$ machine inspect dev
|
||||
{
|
||||
"DriverName": "virtualbox",
|
||||
"Driver": {
|
||||
"MachineName": "docker-host-128be8d287b2028316c0ad5714b90bcfc11f998056f2f790f7c1f43f3d1e6eda",
|
||||
"SSHPort": 55834,
|
||||
"Memory": 1024,
|
||||
"DiskSize": 20000,
|
||||
"Boot2DockerURL": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### help
|
||||
|
||||
Show help text.
|
||||
|
||||
#### ip
|
||||
|
||||
Get the IP address of a machine.
|
||||
|
||||
```
|
||||
$ machine ip
|
||||
192.168.99.104
|
||||
```
|
||||
|
||||
#### kill
|
||||
|
||||
Kill (abruptly force stop) a machine.
|
||||
|
||||
```
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev * virtualbox Running tcp://192.168.99.104:2376
|
||||
$ machine kill dev
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev * virtualbox Stopped
|
||||
```
|
||||
|
||||
#### ls
|
||||
|
||||
List machines.
|
||||
|
||||
```
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev virtualbox Stopped
|
||||
foo0 virtualbox Running tcp://192.168.99.105:2376
|
||||
foo1 virtualbox Running tcp://192.168.99.106:2376
|
||||
foo2 virtualbox Running tcp://192.168.99.107:2376
|
||||
foo3 virtualbox Running tcp://192.168.99.108:2376
|
||||
foo4 * virtualbox Running tcp://192.168.99.109:2376
|
||||
```
|
||||
|
||||
#### restart
|
||||
|
||||
Restart a machine. Oftentimes this is equivalent to
|
||||
`machine stop; machine start`.
|
||||
|
||||
```
|
||||
$ machine restart
|
||||
INFO[0005] Waiting for VM to start...
|
||||
```
|
||||
|
||||
#### rm
|
||||
|
||||
Remove a machine. This will remove the local reference as well as delete it
|
||||
on the cloud provider or virtualization management platform.
|
||||
|
||||
```
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
foo0 virtualbox Running tcp://192.168.99.105:2376
|
||||
foo1 virtualbox Running tcp://192.168.99.106:2376
|
||||
$ machine rm foo1
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
foo0 virtualbox Running tcp://192.168.99.105:2376
|
||||
```
|
||||
|
||||
#### ssh
|
||||
|
||||
Log into or run a command on a machine using SSH.
|
||||
|
||||
```
|
||||
$ machine ssh -c "echo this process ran on a remote machine"
|
||||
this process ran on a remote machine
|
||||
$ machine ssh
|
||||
## .
|
||||
## ## ## ==
|
||||
## ## ## ## ===
|
||||
/""""""""""""""""\___/ ===
|
||||
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
|
||||
\______ o __/
|
||||
\ \ __/
|
||||
\____\______/
|
||||
_ _ ____ _ _
|
||||
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
|
||||
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
|
||||
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|
||||
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
|
||||
Boot2Docker version 1.4.0, build master : 69cf398 - Fri Dec 12 01:39:42 UTC 2014
|
||||
docker@boot2docker:~$ ls /
|
||||
Users/ dev/ home/ lib/ mnt/ proc/ run/ sys/ usr/
|
||||
bin/ etc/ init linuxrc opt/ root/ sbin/ tmp var/
|
||||
```
|
||||
|
||||
#### start
|
||||
|
||||
Gracefully start a machine.
|
||||
|
||||
```
|
||||
$ machine restart
|
||||
INFO[0005] Waiting for VM to start...
|
||||
```
|
||||
|
||||
#### stop
|
||||
|
||||
Gracefully stop a machine.
|
||||
|
||||
```
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev * virtualbox Running tcp://192.168.99.104:2376
|
||||
$ machine stop dev
|
||||
$ machine ls
|
||||
NAME ACTIVE DRIVER STATE URL
|
||||
dev * virtualbox Stopped
|
||||
```
|
||||
|
||||
#### upgrade
|
||||
|
||||
Upgrade a machine to the latest version of Docker.
|
||||
|
||||
#### url
|
||||
|
||||
Get the URL of a host
|
||||
|
||||
```
|
||||
$ machine url
|
||||
tcp://192.168.99.109:2376
|
||||
```
|
||||
|
||||
## Driver Options
|
||||
|
||||
TODO: List all possible values (where applicable) for all flags for every
|
||||
driver.
|
||||
|
||||
#### VirtualBox
|
||||
#### Digital Ocean
|
||||
#### Microsoft Azure
|
||||
#### Google Compute Engine
|
||||
#### Amazon Web Services
|
||||
#### IBM Softlayer
|
Loading…
Reference in New Issue