Docker Tutorial
![]() |
![]()
|
|
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
Contact Us
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.