Skip to main content

Основные команды Docker

# Если Dockerfile находится не в текущем каталоге
docker build -f  
 
# Открытие порта (портов) и настройка пернаправления портов
docker run -p

# Открыты будут все порты, указанные в инструкции EXPOSE
docker run -P

# Отключение кэширования при создании образа
docker build --no-cache=True

# Создание образа
docker build -t <имя_образа>:latest .

Опция -t в команде docker build используется для установки тега (tag) для создаваемого Docker образа. Тег представляет собой идентификатор, который указывает на версию и/или метку образа. При использовании этой опции необходимо указать имя образа и соответствующий тег в формате <имя_образа>:<тег>.

# Запуск контейнера на основе образа в фоновом режиме (-d)
docker run -d --name <имя_контейнера> <имя_образа>:latest

Если вы не укажете имя контейнера в команде docker run, Docker автоматически сгенерирует случайное имя контейнера для вас. Это имя будет состоять из двух случайных слов, разделенных символом подчеркивания.

# То же, но с пробросом портов из контейнера в хостовую систему
docker run -d --name <имя_контейнера> -p 8008:8008 <имя_образа>:latest 

в команде docker run опция -t не нужна. Опция -t используется только при сборке образа с помощью docker build, чтобы установить тег для создаваемого образа.
В команде docker run используется только имя образа с указанием тега (если нужно) и другие опции, такие как -d для запуска контейнера в фоновом режиме и --name для установки имени контейнера.

# Запуск образа в интерактивном (не фоновом) режиме
docker run -it -p 8008:8008 -p 8078:8078 <имя_образа>

Опция -it в команде docker run используется для запуска контейнера в интерактивном режиме (связанным с терминалом).
    -i (или --interactive) обеспечивает интерактивное подключение к контейнеру, что позволяет взаимодействовать с ним через стандартный ввод (stdin).
    -t (или --tty) выделяет псевдо-TTY для контейнера, что обычно используется для поддержки интерактивного ввода/вывода.
Таким образом, опция -it объединяет эти две опции, обеспечивая интерактивное подключение к контейнеру через псевдо-TTY.

# В этом примере перед каждым заданным в докерфайле параметром ставится ключ -e
docker run -it -p 8008:8008 -p 8078:8078 -e DOMAIN_NAME=example.com -e STATS=yes matrix-synapse-nginx

# Параметры можно передавать либо при сборке образа, либо при запуске контейнера. В случае со сборкой образа перед параметром ставить ключ --build-arg
docker build -t matrix-synapse-nginx --build-arg DOMAIN_NAME=example.com --build-arg STATS=yes .
docker run -it -p 8008:8008 -p 8078:8078 -e DOMAIN_NAME=example.com -e STATS=yes matrix-synapse-nginx

# Загрузка образа с Docker Hub
docker pull имя_репозитория:тег

Где:
    имя_репозитория - это имя пользователя или организации, которая загрузила образ на Docker Hub, и имя образа.
    тег - это опциональная метка, которая указывает на конкретную версию образа. Если тег не указан, будет загружена последняя версия.
Например, чтобы скачать последнюю версию образа Nginx, вы можете выполнить следующую команду:
docker pull nginx
Если вы хотите скачать конкретную версию образа, укажите соответствующий тег. Например:
docker pull nginx:latest

После выполнения этой команды Docker загрузит образ с Docker Hub на вашу локальную машину, и вы сможете его использовать для создания и запуска контейнеров.
Когда вы скачиваете образ с Docker Hub с помощью команды docker pull, сам образ сохраняется в локальном хранилище Docker на вашей машине. По умолчанию, образы Docker сохраняются в специальном месте, которое управляется Docker Engine.
На Unix-подобных системах (таких как Linux), обычно образы сохраняются в /var/lib/docker/. Внутри этой директории образы хранятся в различных поддиректориях, включая overlay2, containers, и другие.
Если вы хотите узнать, где именно на вашей системе хранятся образы Docker, вы можете воспользоваться командой docker info. Эта команда выведет информацию о Docker Engine, включая местоположение директории с данными Docker. Выполните следующую команду в терминале:
docker info

В выводе вы найдете информацию о местоположении директории с данными Docker под названием Docker Root Dir. В этой директории и будут храниться все образы и контейнеры Docker на вашей машине.

# Сохранение образа в виде файла
docker save -o имя_файла.tar имя_образа:тег

Где:
    имя_файла.tar - это имя файла, в который будет сохранен архив образа.
    имя_образа:тег - это имя и тег образа, который вы хотите сохранить.
Например, чтобы сохранить образ Nginx с тегом latest в файл с именем nginx.tar, выполните следующую команду:
docker save -o nginx.tar nginx:latest

Это создаст файл nginx.tar, содержащий образ Nginx.
После этого файл будет сохранен в текущей директории, где вы выполняли команду. Если вам нужно сохранить файл в другую директорию, укажите полный путь к файлу. Например:
docker save -o /путь/к/директории/nginx.tar nginx:latest

# Загрузка образа из файла
docker load -i имя_файла.tar

-----------------------------------------------
Избегайте использования systemd: Вместо того, чтобы пытаться запустить systemd внутри контейнера, лучше всего разрабатывать контейнеры таким образом, чтобы они могли запускать необходимые сервисы непосредственно внутри себя, без использования systemd. Это может потребовать изменений в структуре приложения или использование альтернативных методов управления сервисами внутри контейнера, таких как runit, supervisor и другие.
-----------------------------------------------

# Просмотр списка образов
docker images

# Удаление образа 
docker rmi <имя_образа>:<тег>
или
sudo docker rmi <ID_образа>

# Принудительное удаление образа (даже если какой-то контейнер работает)
docker rmi --force <имя_образа>:<тег>
или
sudo docker --force rmi <ID_образа>

# Остановка контейнера
docker stop <ID_контейнера>
или 
docker stop <Имя_контейнера>

# Запуск контейнера
docker start <ID_контейнера>
или 
docker start <Имя_контейнера>

# Удаление контейнера
docker rm <ID_контейнера>

# Удаление кэша
docker system prune

Эта команда удалит все неиспользуемые слои кэша сборки, освобождая дисковое пространство на вашем компьютере.
Термин "неиспользуемый" относится к кэшу сборки (Build Cache), который был загружен в локальное хранилище Docker в процессе сборки образов, но в настоящее время не используется ни для каких активных сборок.
Когда вы собираете Docker-образы, Docker кэширует промежуточные результаты (например, слои образов) для повторного использования при следующих сборках. Это помогает ускорить процесс сборки, поскольку Docker может использовать кэшированные результаты, вместо того чтобы повторно скачивать и собирать одни и те же зависимости.
"Неиспользуемый" кэш сборки означает, что эти кэшированные результаты в настоящее время не используются Docker при сборке каких-либо образов. Например, если вы собрали образ, а затем изменили Dockerfile или исходный код проекта таким образом, что Docker больше не может использовать существующий кэш для сборки образа, кэш становится неиспользуемым.
Поэтому "неиспользуемый" кэш сборки можно смело очистить, так как он больше не нужен для текущих или будущих сборок образов.

docker system prune -a
Эта команда удалит все незадействованные образы, включая образы, на которых основаны неиспользуемые контейнеры, а также все неиспользуемые слои образов.
Примечание: Будьте осторожны при использовании этой команды, поскольку она удалит все незадействованные ресурсы Docker, включая образы и контейнеры. Убедитесь, что вы не удаляете ничего важного.

# Общее использование дискового пространства Docker, включая использование образов, контейнеров и объем кэша.
docker system df

# Указание базового образа системы в Докерфайле, пример
FROM ubuntu:22.04

#
При скачивания репозитория через команды Dockerfile может возникнуть ошибка при определении ОС. Поэтому надо либо в том же Докерфайле прописать установку lsb_release, либо вместо переменной $(lsb_release -cs) вписать конкретное обозначение системы, например, jammy для Ubuntu 22.04 или focal для Ubuntu 20.04

----------------------------------------------

# Команда для запуска Matrix Synapse в докерфайле (перепроверить правильность)
CMD ["synctl", "start", "/etc/matrix-synapse/homeserver.yaml"]

# Логи контейнера
docker logs <ID_контейнера>

# Просмотр запущенных контейнеров
docker ps

# Просмотр всех контейнеров, включая остановленные
docker ps -a

# Просмотр содержимого файла в контейнере (в данном случае файла homeserver.yaml)
docker exec -it <ID_контейнера> cat /etc/matrix-synapse/homeserver.yaml

# Копирование файла из контейнера в хостовую систему (копировать можно и каталоги, включая корневой каталог со всем содержимым)
docker cp <ID_контейнера>:/etc/matrix-synapse/homeserver.yaml /локальный/путь/до/каталога/homeserver.yaml

# Запуск bash внутри контейнера 
docker exec -it <ID_контейнера> bash
или 
docker exec -it <имя_контейнера> /bin/bash

Для использования команды docker exec контейнер должен быть запущен.

--------------------------------------------

# Если при создании образа запрашивается таймзона.
Dockerfile, в начало файла
--------------
ARG TZ
ENV TZ=$TZ
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

Создание образа
--------------
docker build --build-arg TZ=Europe/Moscow -t <имя_образа> .

Или попробовать так:
ENV TZ=Europe/Moscow
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

docker run -e TZ=Europe/Moscow <имя_образа>
------------------------------------------

# Пример создания пользователя для Matrix Synapse прямо в контейнере
docker exec -it <container_name_or_id> register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008

# Просмотр списка слоев образа и команд, выполненных в каждом слое
docker history <имя_образа>:<тег>

Это покажет вам список слоев образа и команды, выполненные в каждом слое. Однако, это не будет полным Dockerfile, так как некоторые команды могут быть скрыты или объединены в один слой. Тем не менее, это может быть полезной информацией, если вам нужно воссоздать Dockerfile на основе существующего образа.
-----------------------------------------

# Остановка всех контейнеров
docker stop $(docker ps -q)

-------------------------------------------


# Запуск всех контейнеров
sudo docker start $(sudo docker ps -aq)