Docker Tutorial

From RidgeRun Developer Wiki



Docker Tutorial Presentation

See the presentation in the following link

<pdf>File:Example.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


# Dockerfile

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

Running as Non-Root (no sudo)

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 OSs

Other supported OS:

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 are 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

Delete the Container

# Stop the container
docker mycontiainer stop

# Remote the container
docker rm mycontainer

Advanced Tips

Container Manager (Portainer)

Create and run the Portainer container

# Create a persistent memory volume
docker volume create portainer_data

# Run portainer forever!
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Access to your URL: http://localhost:9000

Container GUI

Via X11

Your docker container may display graphical windows by forwarding them through X11 to your host container. In Mac you may want to look at XQuartz.

docker create -ti --name guicontainer -e DISPLAY="host.docker.internal:0" -v /tmp/.X11-unix:/tmp/.X11-unix myimage:mytag

You will need to enable X11 remote connections on your system:

Debian based
xhost + 127.0.0.1
Mac OSX based
XQuartz Preferences -> Security (disable Authenticate connections and enable Allow connections from network clients)

Via X2Go

Another alternative is to use the X2Go server. This is very useful if you want to interact with the full desktop environment.

In the container install the following:

# Install x2go server, ssh server, desktop environment and sudo
apt install x2goserver openssh-server xfce4 sudo

# Create a user
adduser ridgerun

# Give the new user sudo access
adduser ridgerun sudo

# Start ssh server
service ssh start

Now install the client on your host:

# Install x2go client
sudo apt install x2goclient

Start the client and fill out the following when creating a new session:

Host
The IP of the container
Login
ridgerun (or the user you chose)
SSH port
22
Session Type
XFCE

Moving docker location

Docker by default uses /var/lib/docker to store all images, layers and data. If this location is taking too much space or you want to move, and you want for example to use space from another partition or disk, you can use the following to change docker location:

1. Stop docker service

sudo systemctl stop docker

2. Sync your current docker state to another folder

rsync -avxP /var/lib/docker/ <another directory>/docker
sudo rm -rf /var/lib/docker

3. Modify the docker service /lib/systemd/system/docker.service to use this different directory:

ExecStart=/usr/bin/dockerd --data-root <another directory>/docker -H fd:// --containerd=/run/containerd/containerd.sock

4. Reload services files and start the docker service

systemctl daemon-reload
systemctl start docker


For direct inquiries, please refer to the contact information available on our Contact page. Alternatively, you may complete and submit the form provided at the same link. We will respond to your request at our earliest opportunity.


Links to RidgeRun Resources and RidgeRun Artificial Intelligence Solutions can be found in the footer below.