Docker (software)

From David's Wiki
\( \newcommand{\P}[]{\unicode{xB6}} \newcommand{\AA}[]{\unicode{x212B}} \newcommand{\empty}[]{\emptyset} \newcommand{\O}[]{\emptyset} \newcommand{\Alpha}[]{Α} \newcommand{\Beta}[]{Β} \newcommand{\Epsilon}[]{Ε} \newcommand{\Iota}[]{Ι} \newcommand{\Kappa}[]{Κ} \newcommand{\Rho}[]{Ρ} \newcommand{\Tau}[]{Τ} \newcommand{\Zeta}[]{Ζ} \newcommand{\Mu}[]{\unicode{x039C}} \newcommand{\Chi}[]{Χ} \newcommand{\Eta}[]{\unicode{x0397}} \newcommand{\Nu}[]{\unicode{x039D}} \newcommand{\Omicron}[]{\unicode{x039F}} \DeclareMathOperator{\sgn}{sgn} \def\oiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x222F}\,}{\unicode{x222F}}{\unicode{x222F}}{\unicode{x222F}}}\,}\nolimits} \def\oiiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x2230}\,}{\unicode{x2230}}{\unicode{x2230}}{\unicode{x2230}}}\,}\nolimits} \)

Docker is a service for creating and managing linux containers.
Containers are the application layer of an OS and whatever software you're trying to run.
For the most part, software can be containerized to run in a consistent environment.
This applies so long as the container linux environment is compatible with your host system's linux kernel.

Installation

Ubuntu

Reference

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

# Update repos
sudo apt update

# Install prerequisites
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# Add official gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

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

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

Windows

  • Upgrade Windows to 2004 or newer
  • Install and enable WSL2
  • Install Docker Desktop

Guides

Get Started

Usage

Images

Containers

docker container ls

Run

docker run <container>
  • -p hostport:containerport to do port forwarding
    • To restrict listing to localhost use -p 127.0.0.1:80:80
  • -it to be interactive with a pseudo-tty

Networking

The default mode for networking is bridge. You should leave this for most of your containers.

bridge

In bridge mode, the docker service acts as a NAT and gives each container a separate local IP along with the docker host.
On linux, you can type ip a to see the ip address of the docker0 network interface.
On my server, it is 172.17.0.1/16.
To access services running on the host (such as MySQL or Postgres), you will need to make these services liston on this network interface and allow it through your firewall.
Then make your docker containers connect using the ip address of your docker host.

host

In this mode, docker processes have full access to your network. This can cause port conflicts if you are not careful. Furthermore, your docker service will have full access to your localhost. I do not recommend using this mode for most things.

Windows

Notes on using docker with windows

Git bash paths

Reference
When mounting paths using git bash, you need to prepend a / to $(pwd)


docker-compose

Docker compose allows you to specify multiple docker services into a single docker-compose.yml file and run them all together.
You can also use it to setup docker commands instead of listing options in a shell script.

# Create a folder for your service and cd into it
# Make the docker-compose file.

# Run (i.e. build, create, and start)
docker-compose up -d

# Stop
docker-compose down

# Upgrade
docker-compose pull # (Optional) Pull before recreating to reduce downtime.
docker-compose up --force-recreate --build -d
docker image prune -f
  • Note that docker-compose restart will just restart existing containers. It will not recreate them.

Resources