Table of Contents

Docker Reference Page

Tom Clark 2022/02/12 09:25

If you are new to Docker technology, here is a guide that I found very helpful:

Docker Tutorial for Beginners [FULL COURSE in 3 Hours]
by TechWorld with Nana via Youtube

Base Questions

What does a Docker structure look like?

Why Docker vs a Virtual Machine?

Where are docker images stored?

How to install Docker?

Basic Commands

# Display images that are running:
docker ps
  -a = list both running and stopped images

# Display all docker images downloaded to and stored on your machine:
docker images

# Download a container based on latest version of an image:
docker pull [name-of-image] 

# Initial start of a container based on a specific version of image (pulls image from hub if not already downloaded to your machine:
docker run [flags] [name-of-image or id-of-image][:version] 
  -d = runs in detached mode (so you can continue to use your terminal instance.
  -p[host port]:[container port] = port binding the host's bare metal port and binding it to the application's port (i.e. -p6000:6000)
  --name [user assigned container name] = assign your container a name (i.e. --name mydockercontainer)

# Start a container that has already been run:
docker start [container name or last 12 positions of container id] 

# Stop a container:
docker stop [container name or last 12 positions of container id] 

# To view a container's logs:
docker logs [container name or last 12 positions of container id] 

# To enter into a terminal of a running container
docker exec -it [container name or last 12 positions of container id] /bin/bash

# To list Docker networks:
docker network ls

Docker Networks

In order for containers to talk to each other you have to setup a docker network. Normally, unless you are a developer, you would not have to do this, but if you do then review Nana's video, Developing with Containers chapter below. Or reference a more up-to-date tutorial or documentation. However, you can also setup a Docker network automatically when you use Docker compose. See topic below.

Docker Compose

Placeholders are in square [] brackets and comments are in curly {} braces in the template below. Note that in the template I have laid out 2 different Docker containers in a single compose file. When you do this, a common Docker network is created. Also, indentation must be precise for this to work (supposedly).

version:'3' {This is the version of Docker Compose the script is for.}
services:
  [user assigned name]: {same as docker run --name flag}
    image: [image name][:version] {name of image from Docker hub}
    ports:
      - [host port]:[container application port]
    volumes:
      - [user reference name]:[container path] {for a "named" volume}; or
      - [host path]:[container path] {for a "defined" volume}; or
      - [container path] {for an anonymous volume}
    environment:
      - [environment setting]=[assigned value]
  [user assigned name]: {same as docker run --name flag}
    image: [image name][:version] {name of image from Docker hub}
    ports:
      - [host port]:[container application port]
    volumes:
      - [user reference name]:[container path] {for a "named" volume}; or
      - [host path]:[container path] {for a "defined" volume}; or
      - [container path] {for an anonymous volume}
    environment:
      - [environment setting]=[assigned value] 

# For two containers to share a volume, you can set that after defining named volumes above and adding the volume after the container definition and using an already defined name (i.e).

volumes:
  db-data: {assuming db-data was established above}
    driver: local {this is needed but not sure why}

The contents of the file above would be saved in a text file saved with a .yaml extension.

To start a Docker compose file, run:

docker-compose [flags] [command]
  -f [name of yaml file] 

Commands:

  up = start a Docker Compose configuration
  down = stop a Docker Compose configuration

Examples:

docker-compose -f mycontainers.yaml up
docker-compose -f mycontainers.yaml down

Persistent Data with Docker Volumes

You need to do this when you want to store data/files between restarts of a Docker container.

You have three types of Docker volumes, i.e.

# A defined volume (Note: I am only showing the -v flag).
docker run -v [host folder]:[container folder]
docker run -v /home/myvolume/data:/var/lib/mysql/data

# An anonymous volume (Note: I am only showing the -v flag and I don't necessarily know where the persistent storage is kept but should be below /var/lib/docker/volumes).
docker run -v [container folder]
docker run -v /var/lib/mysql/data

# A named volume (Note: I am only showing the -v flag, again I may not know where the storage is kept but should be below /var/lib/docker/volumes, plus I am able to reference it better than an anonymous volume).

Packaging & Distributing Your Own Docker Containers into Images

Again, check with Nina on how to do this. Clients of Dockerized applications would not normally have to do any of this.