Docker: The basics
by Joe Meilinger
What/why docker?
- Lightweight "Virtual Machine" runner
- Enforces much of 12-factor application design
- Provides a simpler mechanism to move an application from development to other environments
- Reduces ops burden when utilizing a container orchestrator (eg. Kubernetes, Kubernetes derivates, docker swarm, etc) versus managing application servers
Text
Virtual Machines vs Docker Containers
Images vs containers
- Images are built by running commands contained in a Dockerfile
- Images are stored in a registry and contain a complete binary representation of the layers used to create the image
- Containers are running images
- In OOP: Image = Class
- In OOP: Container = Object
- Containers can have volumes mapped, run in a network, have environment variables injected, etc
- Containers are meant to be lightweight and disposable
- Runs a single process (which can spawn others as needed)
Getting setup
- Install Docker for Windows/Docker for Mac
- From bash/git-bash, verify docker is running properly via:
> docker ps # list running containers
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
> docker images # list images in local registry
REPOSITORY TAG IMAGE ID CREATED SIZE
Basic Docker cli commands
- docker ps -- displays list of running containers
- docker images -- displays a list of local registry images
- docker build -- build a docker image
- docker run -- run a container for an image
- docker exec -- run a process on a running container
- docker logs -- display STDOUT/STDERR of container
- docker system prune -- clean up your local system
Building an image
- Uses a Dockerfile to build
- By default, publishes image to a local registry
- Never build actual configuration into images, defaults are fine
- Same image should be able to be used across environments as configuration would be the only thing changing
> cat Dockerfile
FROM python:3.8
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "app.py"]
> docker build . # builds docker image using auto-generated name and ID
> docker build . -t my-image # builds docker image, tagging w/ "latest"
> docker build . -t my-image:1.0 # builds docker image, tagging w/ "1.0"
Running a container from an image
- Pulls image from a registry (local or remote)
- Runs on a docker host (local machine or remote host)
> docker run [IMAGE] # runs image by repo:tag OR image id using default entrypoint
> docker run -it [IMAGE] /bin/bash # runs image using your specified entrypoint (/bin/bash)
> docker run -p 3000:5000 [IMAGE] # runs image, mapping port 5000 on the container 3000 on host
Image Registry
img1
img2
img3
container1
from img1
Docker runtime
Mapping volumes/attaching to containers/injecting environment variables etc
> docker run -v "$(pwd)":/app [IMAGE] # run image, mount current host folder to /app on container
> docker exec -it [CONTAINER_ID] /bin/bash # execute command on running container (/bin/bash)
> cat vars
VAR1=VAL1
VAR2=VAL2
> docker run --env-file vars [IMAGE] # runs image, using env variables from "vars" file
- Able to overlay a host filesystem location to a container's filesystem via bind mount
- Can run an additional process (ex. interactive shell) on a running container via "docker exec" command
Networking containers together
- Docker utilizes internal/bridged networks
- If you're running more than one container, probably easiest to create a docker-compose.yml to orchestrate a stack
API
UI
Docker runtime
FGDRT + C3PO example
- Run local C3PO + API via docker-compose
- Run FGDRT API + FGDRT UI
Docker runtime
C3PO DB
C3PO API
FGDRT API
FGDRT UI
localhost:3001
> docker-compose -d --build
> docker-compose --build
Resources
Step-by-step tutorial/example
Docker: The basics
By Joe Meilinger
Docker: The basics
- 196