Term | Description |
---|---|
Images | The blueprints of the application. Very roughly approximates to a git registry. Containers are created from images. Images can be base images (i.e. not based on another image; typically just an OS), or child images (i.e. based on a base image; typically adds functionality to base) |
Containers | A running instance of an application. |
DockerFile | A tool for simplifying the reployment of multi-container applications. |
Docker Compose | A text file containing a list of commands for creating an image. |
Docker Daemon | Local background service that mnages building, running and distributing of containers. |
Docker Client | The command line tool used to interact with the daemon (GUIs also exist). |
Docker Hub | A central registry of images maintained by Docker: https://hub.docker.com/ Repositories can also be hosted locally. |
Flask | A micro web framework, written in Python. Typically used for web applications. |
For further discussion of the difference between RUN
, CMD
and ENTRYPOINT
, see
#!/bin/bash
# build the flask container
docker image build -t oclipa/foodtrucks-web .
# create the network
docker network create foodtrucks-net
# start the ES container
docker container run -d --name es --net foodtrucks-net \
-p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" \
docker.elastic.co/elasticsearch/elasticsearch:6.3.2
# start the flask app container
docker container run -d --net foodtrucks-net -p 5000:5000 \
--name foodtrucks-web oclipa/foodtrucks-web
Relates to the following git repo: https://github.com/oclipa/food-trucks
A tool for managing a collection of containers as if they were a single app.
It is configured using a YAML file: docker-compose.yml
, of which the following is an example:
version: "3"
services:
es:
image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
container_name: es
environment:
- discovery.type=single-node
ports:
- 9200:9200
volumes:
- esdata1:/usr/share/elasticsearch/data
web:
#build: . # builds a new image
image: oclipa/foodtrucks-web # uses an existing image
command: python app.py
depends_on:
- es
#environment:
# - DEBUG=True # set an env var for flask
ports:
- 5000:5000
volumes:
- ./flask-app:/opt/flask-app
volumes:
esdata1:
driver: local
This file defines two services es
(the elasticsearch service) and web
(the web app). The details are broadly the same as those in the DockerFile, however note that depends-on
property, which indicates that the es service must be started before the web service. The volumes
properties are particularly useful for logging.
docker-compose
commands must be run in the same directory as the docker-compose.yml
file.
If problems are experienced, might need to run docker-compose up -d --build
.
Example Dockerrun.aws.json
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "[image-name; e.g. oclipa/catnip]",
"Update": "true"
},
"Ports": [
{
"ContainerPort": 5000,
"HostPort": 8000
}
],
"Logging": "/var/log/nginx"
}
Summarised:
- Create SSH keypair:
$ ssh-keygen -t rsa -b 4096
- Copy the public key to Digital Ocean account (Security -> Add SSH Key)
- Obtain a Droplet configured for Docker (may need to search in the Marketplace)
- Choose plan, region, SSH key and create Droplet
- Identify the IP address of the Droplet
- SSH to the Droplet:
$ ssh -i [path/to/private/key] root@ip-address]
- Run the Docker image:
$ docker run -p [external-port]:[internal-port] [container-name]
- Access the web page at:
http://[ip-address]:[external-port]/
To develop and test an existing image, do the following:
- Make changes to local files for the service under development
- In
docker-compose.yml
, for the service of interest, replace theimage [image name]
property with abuild .
property. - Restart the services:
docker-compose down -v; docker-compose up -d --build
- If you have problems, try deleting the existing image (
docker image rm [image-name]
) and restart the services again.
- Ubuntu - simple but flexible base image (use apt-get to install dependencies)
- Python - base image with python pre-installed
- Busybox - lightweight command line tools
- Elasticsearch - open source search and analytics engine
- Official Docker Reference Documentation: https://docs.docker.com/reference/
- Official DockerFile Documentation: https://docs.docker.com/engine/reference/builder/
- Official Docker Compose Documentation: https://docs.docker.com/compose/compose-file/
- Official Docker Networks Documentation: https://docs.docker.com/network/
- Get Started with Docker: https://www.docker.com/get-started
- Docker for Beginners: https://docker-curriculum.com/
Move along; nothing to see here...
<script type="text/javascript"> const loadCSS = (filename) => { const file = document.createElement("link"); file.setAttribute("rel", "stylesheet"); file.setAttribute("type", "text/css"); file.setAttribute("href", filename); document.head.appendChild(file); }; const loadJS = (filename) => { const file = document.createElement("script"); file.setAttribute("type", "text/javascript"); file.setAttribute("src", filename); document.head.appendChild(file); }; //just call a function to load your CSS //this path should be relative your HTML location loadCSS("../collapse.css"); loadJS("../collapse.js"); </script> <script type="text/javascript"> var sc_project=12427716; var sc_invisible=1; var sc_security="0dd6d290"; </script> <script type="text/javascript" src="https://www.statcounter.com/counter/counter.js" async></script>