Основано на видеоуроках с youtube.
Запуск контейнера
docker run -d -p 80:80 docker/getting-started
- -d — работа в фоне (не блокируется terminal)
 - -p 80:80 привязка портов (проброс)
 
Просмотр образов
docket images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
docker/getting-started   latest    3e4394f6b72f   2 months ago   47MB
Просмотр контейнеров
docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS         PORTS                NAMES
1d58b01e8210   docker/getting-started   "/docker-entrypoint.…"   11 minutes ago   Up 3 minutes   0.0.0.0:80->80/tcp   strange_kirch
Остановка контейнера
docker stop 1d58b01e8210
Где 1d58b01e8210 — идентификатор контейнера полученный из команды docker ps
Аналогичны команды:
- docker start — запуск
 - docker pause — пауза
 - docker unpause — запуск после паузы
 - docker restart — перезапуск
 
Запуск и остановка по имени
docker run -it --name MyJava openjdk
docker stop MyJava
Создание образа Ubuntu
docker pull ubuntu
docker run -it --name MyUbuntu ubuntu
Создание контейнера Ubuntu с именем MyUbuntu
Сборка контейнера
#Dockerfile
FROM openjdk:11
COPY . /java
WORKDIR /java
RUN javac Main.java
CMD [ "java", "Main" ]
#Main.java
package com.itproger;
class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!!!"); // Показываем строку
    }
}
Выполняем команду: docker build .
Где символ точка — это каталог откуда должны быть получены данные
# с указанием имени
docker build -t my-php-app ./php
Удаление образа
docker images
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
<none>                   <none>    90389505100b   24 seconds ago   654MB
ubuntu                   latest    08d22c0ceb15   2 weeks ago      77.8MB
openjdk                  latest    71260f256d19   6 weeks ago      470MB
docker/getting-started   latest    3e4394f6b72f   3 months ago     47MB
docker image rm 90389505100b
Deleted: sha256:90389505100b8a62cd0a8aab3c8e92eb0c7fccda068563cd41cd6611cccf3b6f
Удаление контейнера
#check container
docker ps -a
#remove container
docker rm containerID
Если образ не удаляется
docker image rm 935492793c47
Error response from daemon: conflict: unable to delete 935492793c47 (must be forced) - image is being used by stopped container 0f632ed0d1b5
# можно запустить так
docker image rm -f 935492793c47
Deleted: sha256:935492793c475e0d0f3208ef3a193a7b5ba26c246a65fe8e16716c41e4aee16d
Ещё один пример создания и запуска контейнера
# ./php/Dockerfile
FROM php:7.2-apache
COPY . /var/www/html
WORKDIR /var/www/html
EXPOSE 80
# ./php/index.php
<?php
    echo "Hello";
# создаём образ с именем my-php-app
docker build -t my-php-app ./php
# запускаем образ
docker run -p 8001:80 -d my-php-app
Docker compose
# docker-compose.yml
version: '3.1'
services:
  db:
    image: mariadb:10.6
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: notSecureChangeMe
  phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
docker-compose build
# сборка
docker-compose up  
Подключение собственного образа
# docker-compose.yml
version: '3.1'
services:
    php:
        build: ./php
        ports:
            - 8081:80
...
Публикация образа в dockerhub
Создание тома
docker volume create test
docker volume inspect test
На WSL эта информация хранится в папке:
\\wsl$\docker-desktop-data\data\docker\volumes
Привязка тома налету
docker run -it --rm -v newdata:/data busybox
Аргумент -v имеет собственный синтаксис, что видно по двоеточию, которое ставится сразу же после имени тома (мы выбрали для него очень оригинальное название newdata). А далее через слэш указывается путь монтирования тома в контейнере. Теперь можно записывать туда данные, например: 
echo "Timeweb" > /data/timeweb
Работа с файлами и папками
Для монтирования данных используются следующие параметры:
- -v или —volume
 - —mount
 
Их различие в том, что mount более явно заставляет указывать источник и цель монтирования папки. Вы можете использовать эти параметры совместно, отдельно, повторяя несколько раз — ограничений нет
Для примера — у меня есть следующая папка на хосте:
/home/alex/docker_data
В случае параметра «-v» указывается два пути «откуда:куда». В случае «—mount» это именованные параметры разделенные запятыми. Пример работы обоих:
-v /home/alex/docker_data:/usr/share/nginx/html
# или
--mount type=bind,source=/home/alex/docker_data,destination=/usr/share/nginx/html
В mount мы используем следующие параметры:
- type — со значением ‘bind’ говорит, что мы монтируем папку или файл;
 - source — источник т.е. папка или файл, который мы хотим подключить к контейнеру;
 - destination — папка или файл внутри контейнера.
 
В обоих случаях мы можем монтировать данный доступные только для чтения (read-only) добавив «ro» в конце:
-v /home/alex/docker_data:/usr/share/nginx/html:ro
--mount type=bind,source=/home/alex/docker_data,destination=/usr/share/nginx/html,ro
Так выглядит запуск контейнера с проброшенной папкой:
docker run -d --name nginx_vol1 -v /home/alex/docker_data:/usr/share/nginx/html:ro nginx
# или
docker run -d --name nginx_vol2 --mount type=bind,source=/home/alex/docker_data,destination=/usr/share/nginx/html,ro nginx