Docker Tutorial

From RidgeRun Developer Wiki
Revision as of 20:05, 7 April 2020 by Mgruner (talk | contribs)

Presentation

<pdf page="0" height="455">File:Rr training sesssions docker.pdf</pdf>

Commands Quick Reference

Legend

The following code applies throughout the rest of the wiki.

# Commands to be run in the host
# Commands to be run in the container

Install

Stable Version

On Debian-based systems Docker may be installed via Apt (taken from the official documentation):

# Uninstall old versions
sudo apt remove docker docker-engine docker.io containerd runc

# Install dependencies
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# Install GPG Key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Add Docker PPA
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Finally install
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

To run as non-root user:

# Create the docker group
sudo groupadd docker

# Add yourself to the group
sudo usermod -aG docker $USER

# To avoid re-logging
newgrp docker

# Test proper installation
docker ps

Other supported OS:

Running as Non-Root (no sudo)

Create Containers

Basic Creation

These are my go-to recipes for daily container creation:

# Basic container creation
docker create -ti --name mycontainer ubuntu:18.04

# Share dir: /home/mgruner (host) in /host (container)
docker create -ti -v /home/mgruner/:/host ubuntu:18.04

# Share file: /home/mgruner/file.txt (host) in /host.txt (container)
docker create -ti -v /home/mgruner/file.txt:/host.txt ubuntu:18.04

# Create a persistent volume for future use
docker create -ti -v myvolume:/host ubuntu:18.04

# Additional useful options
# -m Memory limit
# -c CPU percentage
# --restart Restart policy
# --rm Remove container after usage
# -e Environment variable
docker create -ti -m 1G -c 1.5 --restart unless-stopped --rm -e MYENV=myenv ubuntu:18.04

Container Information

Here's some commands on how to query info about containers

# List existing containers (started)
docker ps

# List existing containers (all)
docker ps -a

# Get container info (IP address, for example)
docker inspect mycontainer

Use Containers

Basic Usage

Very basic container usage:

# Start the container
docker start mycontainer

# Open a shell in the container
docker exec -ti mycontainer bash

# Stop the container
docker stop mycontainer

Common Initial Setups

Here's my goto recipe when creating a container from scratch.

# Load up apt caches
apt update

# Install common packages
apt install git build-essential autoconf Libtool autotools emacs vi

You can also setup SSH for network access.

# Install ssh server and sudo for your new user
apt install sudo openssh-server

# Create a new user (to avoid using root to access)
adduser ridgerun

# Give it root access
adduser ridgerun sudo

# Manually start ssh server (every time container is started)
service ssh start

# Exit the container
exit

Running Long Processes

Sometimes you need to keep a long running process on the container in a remote server, and disconnect from the server and go to sleep. Here's how to run a command and disconnect from the container without stopping the session.

# Option 1: detach at creation time
docker exec -d -ti mycontainer /long_running_script.sh

Alternatively:

# Option 2: detach from the shell
./long_running_script.sh

# Now press ctrl+p ctrl+q to detach

Now attach to your container by running:

# Reattach to the container
docker attach mycontainer

Save a Container Snapshot

New Image

You can create a new image from the current state of a container:

# Save an image based on a container
docker commit -a "Michael Gruner <michael.gruner@ridgerun.com>" -m "Example" mycontainer myimage:mytag

You can create a new image from another image:

# Create an alias 
docker tag myimage:mytag newimage:newtag

Image Utils

Here are some common utils to interact with images.

# List existing images
docker images

# List existing images (alternative)
docker image ls

# Remove image
docker image rm newimage:newtag

# Remove all unused images
docker image prune

Sharing Images

You may share via tarball:

# Save image
docker save myimage:mytag | gzip > myimage_mytag.tar.gz

# Load image from tarball
docker load < myimage_mytag.tar.gz

You may share via docker registry:

# Point to custom registry
docker tag newimage:newtag dockerhub.cr.ridgerun.com:5000/ridgerun/myimage:mytag

# Push image
docker push dockerhub.cr.ridgerun.com:5000/ridgerun/myimage:mytag


# Point do ridgerun repository at Docker Hub
docker tag myimage:mytag ridgerun/myimage:mytag

# Push image
docker push ridgerun/myimage:mytag

Dockerfiles

Alternatively, you may create an image from a Dockerfile.

FROM ubuntu:18.04
RUN apt-get update && \
apt-get install -y openssh-server sudo && \
useradd -p $(openssl passwd -1 mgruner) mgruner && \ adduser mgruner sudo
ENTRYPOINT service ssh restart && bash
# Build an image from a dockerfile
docker build -t imagename:imagetag .

# List images
docker images