265 lines
9.0 KiB
Markdown
265 lines
9.0 KiB
Markdown
|
via [Section.io](https://www.section.io/engineering-education/docker-machine/)
|
|||
|
|
|||
|
Typically, we create services that run in containers which we then subsequently access via the local host. Docker machine brings a new way of managing and accessing these services.
|
|||
|
|
|||
|
It allows developers to create docker engines on the virtual hosts and expose them via a specified port.
|
|||
|
|
|||
|
In this tutorial, I will walk you through the concept of docker-machine and discuss how it exposes its services running **in the virtual machine.**
|
|||
|
|
|||
|
### Table of contents
|
|||
|
|
|||
|
- [Requirements](https://www.section.io/engineering-education/docker-machine/#requirements)
|
|||
|
- [Objective](https://www.section.io/engineering-education/docker-machine/#objective)
|
|||
|
- [Getting started with a docker-machine](https://www.section.io/engineering-education/docker-machine/#getting-started-with-a-docker-machine)
|
|||
|
- [Differences between docker machine & docker engine](https://www.section.io/engineering-education/docker-machine/#differences-between-docker-machine--docker-engine)
|
|||
|
- [Installing docker machine](https://www.section.io/engineering-education/docker-machine/#installing-docker-machine)
|
|||
|
- [Using docker-machine to run docker containers](https://www.section.io/engineering-education/docker-machine/#using-docker-machine-to-run-docker-containers)
|
|||
|
- [Run containers and experiment with machine commands](https://www.section.io/engineering-education/docker-machine/#run-containers-and-experiment-with-machine-commands)
|
|||
|
- [Conclusion](https://www.section.io/engineering-education/docker-machine/#conclusion)
|
|||
|
|
|||
|
### Requirements
|
|||
|
|
|||
|
- Basic knowledge of docker.
|
|||
|
- Docker engine installed on your local machine.
|
|||
|
- Virtual machine installed on your development environment. We will be using VirtualBox in this tutorial.
|
|||
|
|
|||
|
### Objective
|
|||
|
|
|||
|
This tutorial aims to introduce you to the concepts of the docker machine.
|
|||
|
|
|||
|
First, I will show you how to install and run the docker machine on Ubuntu. We’ll then proceed to provision and manage multiple remote Docker hosts.
|
|||
|
|
|||
|
### Getting started with a docker-machine
|
|||
|
|
|||
|
A Docker machine runs on the virtual host, local development environment, cloud, or even on a server somewhere.
|
|||
|
|
|||
|
We know that the Docker daemon does all the work of creating and executing the containers with docker knowledge.
|
|||
|
|
|||
|
You can manage your containers and images using the docker command-line tool in this normal setup process.
|
|||
|
|
|||
|
With the introduction of a docker-machine, you can easily set up as many containers as possible, deploy them to virtual hosts such as VirtualBox. This host then exposes an IP address, as we’ll see in a minute, and provide you with an environment to manage these containers.
|
|||
|
|
|||
|
The advantage of this docker-machine that we cannot achieve using just docker is that it allows for a simple interactive environment to manage several containers.
|
|||
|
|
|||
|
### Differences between Docker Machine & Docker Engine
|
|||
|
|
|||
|
Whenever you hear the term `docker`, it typically refers to the `docker engine`. When you run a command such as the one shown below, you’re simply interacting with the docker engine command-line interface.
|
|||
|
|
|||
|
```bash
|
|||
|
docker run <image>
|
|||
|
```
|
|||
|
|
|||
|
Now, imagine a situation where you have multiple dockerized Java applications. It would be hard to manage these applications independently. That’s where the docker machine comes in.
|
|||
|
|
|||
|
As discussed earlier, docker-machine is used to provision and manage these dockerized hosts. How it works is that this machine is installed on a local machine. It’s then used to install the docker engine in a virtualized environment.
|
|||
|
|
|||
|
### Installing Docker Machine
|
|||
|
|
|||
|
```bash
|
|||
|
# run this command to check your installed version
|
|||
|
docker --version
|
|||
|
```
|
|||
|
|
|||
|
Proceed and download docker machine by running the following command:
|
|||
|
|
|||
|
```bash
|
|||
|
# this installs the docker machine for Linux
|
|||
|
base=https://github.com/docker/machine/releases/download/v0.16.0 \
|
|||
|
&& curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine \
|
|||
|
&& sudo mv /tmp/docker-machine /usr/local/bin/docker-machine \
|
|||
|
&& chmod +x /usr/local/bin/docker-machine
|
|||
|
```
|
|||
|
|
|||
|
Output:
|
|||
|
|
|||
|
```bash
|
|||
|
# when you run the above command, you're supposed to see something like this
|
|||
|
# you notice it moves the docker-machine to a new directory
|
|||
|
# then sets the access mode to allow for execution
|
|||
|
|
|||
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
|||
|
Dload Upload Total Spent Left Speed
|
|||
|
100 633 100 633 0 0 511 0 0:00:01 0:00:01 --:--:-- 511
|
|||
|
100 26.8M 100 26.8M 0 0 374k 0 0:01:13 0:01:13 --:--:-- 318k
|
|||
|
```
|
|||
|
|
|||
|
To check that you have successfully installed docker-machine, run the following command on your terminal:
|
|||
|
|
|||
|
```bash
|
|||
|
docker-machine --version
|
|||
|
```
|
|||
|
|
|||
|
Output Example:
|
|||
|
|
|||
|
```bash
|
|||
|
# note that this version is at the time of this writing
|
|||
|
docker-machine version 0.16.0, build 702c267f
|
|||
|
```
|
|||
|
|
|||
|
### Using docker-machine to run docker containers
|
|||
|
|
|||
|
Let’s now look at how the docker-machine is used to manage docker containers. Start by running this command to list down your docker machines.
|
|||
|
|
|||
|
```bash
|
|||
|
$ docker-machine ls
|
|||
|
# no output since we've not
|
|||
|
# created any machine.
|
|||
|
|
|||
|
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
Let’s proceed and create on machine by executing the commands below:
|
|||
|
|
|||
|
```bash
|
|||
|
docker-machine create --driver VirtualBox default
|
|||
|
# you notice we've included a driver flag passed the name of our machine
|
|||
|
```
|
|||
|
|
|||
|
Output:
|
|||
|
|
|||
|
```bash
|
|||
|
# the result while installing the docker-machine
|
|||
|
Running pre-create checks...
|
|||
|
Creating machine...
|
|||
|
#... some output goes here
|
|||
|
Waiting for the machine to be running, may take a few minutes...
|
|||
|
# here the OS you're currently using for installation is being detected
|
|||
|
Detecting operating system of created instance...
|
|||
|
# ssh connection setup
|
|||
|
Waiting for SSH to be available...
|
|||
|
# detecting the provisioner
|
|||
|
Detecting the provisioner...
|
|||
|
Provisioning with boot2docker...
|
|||
|
Copying certs to the local machine directory...
|
|||
|
# here you notice we're connected to virtual machine
|
|||
|
# a remote machine hence certs are being generated and
|
|||
|
# configured
|
|||
|
Copying certs to the remote machine...
|
|||
|
# docker configuration process
|
|||
|
Setting Docker configuration on the remote daemon...
|
|||
|
#... installation complete
|
|||
|
Docker is up and running!
|
|||
|
#...
|
|||
|
```
|
|||
|
|
|||
|
Now that we’ve successfully created a docker-machine, let’s proceed and check whether this machine exists by running the following command:
|
|||
|
|
|||
|
```bash
|
|||
|
docker-machine ls
|
|||
|
# this command lists down the list of machines available
|
|||
|
```
|
|||
|
|
|||
|
Output:
|
|||
|
|
|||
|
```bash
|
|||
|
|
|||
|
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
|
|||
|
default - virtualbox Running tcp://192.168.99.102:2376 v19.03.12
|
|||
|
```
|
|||
|
|
|||
|
Let’s set environmental command for our virtual machine as shown below:
|
|||
|
|
|||
|
```bash
|
|||
|
# a command to create an env command
|
|||
|
docker-machine env default
|
|||
|
```
|
|||
|
|
|||
|
Output:
|
|||
|
|
|||
|
```bash
|
|||
|
export DOCKER_TLS_VERIFY="1"
|
|||
|
export DOCKER_HOST="tcp://192.168.99.102:2376"
|
|||
|
export DOCKER_CERT_PATH="/home/jumamiller/.docker/machine/machines/default"
|
|||
|
export DOCKER_MACHINE_NAME="default"
|
|||
|
# Run this command to configure your shell:
|
|||
|
# eval $(docker-machine env default)
|
|||
|
```
|
|||
|
|
|||
|
Lastly, let’s connect our shell to our virtualized environment by running the command given in the previous step output;
|
|||
|
|
|||
|
```bash
|
|||
|
# configuring the shell
|
|||
|
eval $(docker-machine env default)
|
|||
|
```
|
|||
|
|
|||
|
### Run containers and experiment with machine commands
|
|||
|
|
|||
|
Now that we’ve set everything ready, let’s proceed and verify our installation by running the following commands:
|
|||
|
|
|||
|
```bash
|
|||
|
# donwloads docker-machine and prints hello John doe
|
|||
|
docker run busybox echo hello John doe
|
|||
|
```
|
|||
|
|
|||
|
Output:
|
|||
|
|
|||
|
```bash
|
|||
|
# it downloads busybox and prints hello John doe
|
|||
|
# if the image is not locally available, you should it is pulled
|
|||
|
b71f96345d44: Pull complete
|
|||
|
Digest: sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
|
|||
|
#...
|
|||
|
Hello John Doe
|
|||
|
```
|
|||
|
|
|||
|
Next, get your VirtualBox IP address by running the following commands:
|
|||
|
|
|||
|
```bash
|
|||
|
# run this command to get the IP address of our default docker-machine
|
|||
|
docker-machine IP default
|
|||
|
```
|
|||
|
|
|||
|
IP Address Output:
|
|||
|
|
|||
|
```bash
|
|||
|
# It's important to note that this may vary from your local machine
|
|||
|
192.168.99.102
|
|||
|
```
|
|||
|
|
|||
|
We can then proceed and run the Nginx container by running the following commands:
|
|||
|
|
|||
|
```bash
|
|||
|
# note that if you don't have this image, it will be pulled!
|
|||
|
docker run -d -p 8000:80 nginx
|
|||
|
```
|
|||
|
|
|||
|
Expected Output:
|
|||
|
|
|||
|
```bash
|
|||
|
#...pulling image
|
|||
|
33847f680f63: Pull complete
|
|||
|
dbb907d5159d: Pull complete
|
|||
|
8a268f30c42a: Pull complete
|
|||
|
b10cf527a02d: Pull complete
|
|||
|
c90b090c213b: Pull complete
|
|||
|
1f41b2f2bf94: Pull complete
|
|||
|
Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
|
|||
|
Status: Downloaded newer image for nginx:latest
|
|||
|
d74c42d4e75403d4e4bd0031b293df6bbe0040e1a94a2ebdf1960caa6698b808
|
|||
|
```
|
|||
|
|
|||
|
We can now hit the server on port 8000 defined above by using CuRL as shown below:
|
|||
|
|
|||
|
```bash
|
|||
|
curl $(docker-machine IP default):8000
|
|||
|
```
|
|||
|
|
|||
|
Output:
|
|||
|
|
|||
|
```html
|
|||
|
<!-- note that this an output on the bash -->
|
|||
|
<!DOCTYPE html>
|
|||
|
<html>
|
|||
|
<head>
|
|||
|
<title>Welcome to nginx!</title>
|
|||
|
<style>
|
|||
|
...
|
|||
|
|
|||
|
</style>
|
|||
|
...
|
|||
|
</body>
|
|||
|
</html>
|
|||
|
```
|
|||
|
|
|||
|
And that’s how simple and easy it is to use a docker machine to create and manage multiple hosts using virtual and docker machines.
|