Docker как найти контейнер

Время на прочтение
5 мин

Количество просмотров 543K

Прим. перев.: Неделю назад Aymen El Amri, руководящий компанией eralabs и создавший обучающий курс «Безболезненный Docker», опубликовал свой Docker Cheat Sheet — шпаргалку по основным командам Docker. Git-репозиторий этого документа на GitHub уже набрал 1000+ stars и несколько сторонних контрибьюторов, что подтвердило его актуальность и пользу.

Представленные здесь команды описаны минимально (с акцентом на читаемость как есть) и включают в себя установку Docker, работу с реестрами и репозиториями, контейнерами, образами, сетью, Docker Swarm. Ниже представлен перевод шпаргалки в её состоянии на 2 сентября с дополнениями из комментариев ниже.

Установка

Linux

curl -sSL https://get.docker.com/ | sh

Mac

Скачайте dmg по этой ссылке:

https://download.docker.com/mac/stable/Docker.dmg

Windows

Используйте MSI-инсталлятор:

https://download.docker.com/win/stable/InstallDocker.msi

Реестры и репозитории Docker

Вход в реестр

docker login

docker login localhost:8080

Выход из реестра

docker logout

docker logout localhost:8080

Поиск образа

docker search nginx

docker search nginx -- filter stars=3 --no-trunc busybox

Pull (выгрузка из реестра) образа

docker pull nginx

docker pull eon01/nginx localhost:5000/myadmin/nginx

Push (загрузка в реестр) образа

docker push eon01/nginx

docker push eon01/nginx localhost:5000/myadmin/nginx

Первые действия с контейнерами

Создание контейнера

docker create -t -i eon01/infinite --name infinite

Первый запуск контейнера

docker run -it --name infinite -d eon01/infinite

Переименование контейнера

docker rename infinite infinity

Удаление контейнера

docker rm infinite

Обновление контейнера

docker update --cpu-shares 512 -m 300M infinite

Запуск и остановка контейнеров

Запуск остановленного контейнера

docker start nginx

Остановка

docker stop nginx

Перезагрузка

docker restart nginx

Пауза (приостановка всех процессов контейнера)

docker pause nginx

Снятие паузы

docker unpause nginx

Блокировка (до остановки контейнера)

docker wait nginx

Отправка SIGKILL (завершающего сигнала)

docker kill nginx

Отправка другого сигнала

docker kill -s HUP nginx

Подключение к существующему контейнеру

docker attach nginx

Получение информации о контейнерах

Работающие контейнеры

docker ps

docker ps -a

Логи контейнера

docker logs infinite

Информация о контейнере

docker inspect infinite

docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -q)

События контейнера

docker events infinite

Публичные порты

docker port infinite

Выполняющиеся процессы

docker top infinite

Использование ресурсов

docker stats infinite

Изменения в файлах или директориях файловой системы контейнера

docker diff infinite

Управление образами

Список образов

docker images

Создание образов

docker build .

docker build github.com/creack/docker-firefox

docker build - < Dockerfile

docker build - < context.tar.gz

docker build -t eon/infinite .

docker build -f myOtherDockerfile .

curl example.com/remote/Dockerfile | docker build -f - .

Удаление образа

docker rmi nginx

Загрузка репозитория в tar (из файла или стандартного ввода)

docker load < ubuntu.tar.gz

docker load --input ubuntu.tar

Сохранение образа в tar-архив

docker save busybox > ubuntu.tar

Просмотр истории образа

docker history

Создание образа из контейнера

docker commit nginx

Тегирование образа

docker tag nginx eon01/nginx

Push (загрузка в реестр) образа

docker push eon01/nginx

Сеть

Создание сети

docker network create -d overlay MyOverlayNetwork

docker network create -d bridge MyBridgeNetwork

docker network create -d overlay 
  --subnet=192.168.0.0/16 
  --subnet=192.170.0.0/16 
  --gateway=192.168.0.100 
  --gateway=192.170.0.100 
  --ip-range=192.168.1.0/24 
  --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" 
  --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" 
  MyOverlayNetwork

Удаление сети

docker network rm MyOverlayNetwork

Список сетей

docker network ls

Получение информации о сети

docker network inspect MyOverlayNetwork

Подключение работающего контейнера к сети

docker network connect MyOverlayNetwork nginx

Подключение контейнера к сети при его запуске

docker run -it -d --network=MyOverlayNetwork nginx

Отключение контейнера от сети

docker network disconnect MyOverlayNetwork nginx

Очистка Docker

Удаление работающего контейнера

docker rm nginx

Удаление контейнера и его тома (volume)

docker rm -v nginx

Удаление всех контейнеров со статусом exited

docker rm $(docker ps -a -f status=exited -q)

Удаление всех остановленных контейнеров

docker container prune

docker rm `docker ps -a -q`

Удаление контейнеров, остановленных более суток назад

docker container prune --filter "until=24h"

Удаление образа

docker rmi nginx

Удаление неиспользуемых (dangling) образов

docker image prune

docker rmi $(docker images -f dangling=true -q)

Удаление неиспользуемых (dangling) образов даже с тегами

docker image prune -a

Удаление всех образов

docker rmi $(docker images -a -q)

Удаление всех образов без тегов

docker rmi -f $(docker images | grep "^<none>" | awk "{print $3}")

Остановка и удаление всех контейнеров

docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)

Удаление неиспользуемых (dangling) томов

docker volume prune

docker volume rm $(docker volume ls -f dangling=true -q)

Удаление неиспользуемых (dangling) томов по фильтру

docker volume prune --filter "label!=keep"

Удаление неиспользуемых сетей

docker network prune

Удаление всех неиспользуемых объектов

docker system prune

По умолчанию для Docker 17.06.1+ тома не удаляются. Чтобы удалились и они тоже:

docker system prune --volumes

Docker Swarm

Установка Docker Swarm

curl -ssl https://get.docker.com | bash

Прим. перев.: в Docker версий 1.12.0+ ничего дополнительно устанавливать не требуется, т.к. Docker Swarm встроен в Docker Engine в виде специального режима (Swarm mode).

Инициализация Swarm

docker swarm init --advertise-addr 192.168.10.1

Подключение рабочего узла (worker) к Swarm

docker swarm join-token worker

Подключение управляющего узла (manager) к Swarm

docker swarm join-token manager

Список сервисов

docker service ls

Список узлов

docker node ls

Создание сервиса

docker service create --name vote -p 8080:80 instavote/vote

Список заданий Swarm

docker service ps

Масштабирование сервиса

docker service scale vote=3

Обновление сервиса

docker service update --image instavote/vote:movies vote

docker service update --force --update-parallelism 1 --update-delay 30s nginx

docker service update --update-parallelism 5--update-delay 2s --image instavote/vote:indent vote

docker service update --limit-cpu 2 nginx

docker service update --replicas=5 nginx

P.S.

Прим. перев.: Напомню, что оригинальная (англоязычная) версия Docker Cheat Sheet доступна и обновляется в Git-репозитории. Автор будет рад исправлениям/пополнениям от сообщества.

Читайте также в нашем блоге:

  • «Play with Docker — онлайн-сервис для практического знакомства с Docker».
  • «В чём суть проекта Moby и почему главным репозиторием Docker вдруг стал moby/moby?»
  • «Собираем Docker-образы для CI/CD быстро и удобно вместе с dapp (обзор и видео)».

Рассмотрим основные команды для работы Docker, а также приведём несколько примеров.

Детальная официальная документация Docker: https://docs.docker.com/

В Windows для ввода команд используйте «Командную строку» (cmd.exe)

В лучших традициях Linux каждая команда Docker имеет встроенную документацию для этого добавьте —help

# Например, документация для команды images
docker images --help

1. Общие команды

  • docker version — показывает техническую информацию о Docker
  • docker login — авторизует пользователя в реестре Docker
  • docker system prune — выполняет очистку, удаляя из системы неиспользуемые контейнеры, ненужные сети и образы без имен и меток

2. Команды для управления образами

Образ (Docker Image) — неизменяемая, изолированная файловая система. Содержит всё необходимое для запуска приложения — все зависимости, конфигурации, сценарии, двоичные файлы и т. д. Образ также содержит конфигурацию контейнера: переменные среды, команды по умолчанию для запуска, и другие метаданные.

  • build — собирает образ с нуля
  • push — отправляет образ в реестр
  • pull — загружает готовый образ с необходимыми для работы параметрами
  • images — списком показывает все образы Docker на диске
  • ls — показывает все существующие образы
  • history — показывает каждый слой образа в ретроспективе, отображая некоторые полезные сведения
  • inspect — рассказывает всё, что известно об образе, включая данные, касающиеся отдельных слоев
  • rm — удаляет образ Docker из системы
# Синтаксис
docker image %команда%

# Вывести список всех образов
docker images

3. Команды для управления контейнерами

Контейнер (Docker Container) — это исполняемый экземпляр запущенного образа. Можно создать, запустить, остановить, переместить или удалить контейнер с помощью DockerAPI или CLI. Контейнер можно запускать на локальных машинах, виртуальных машинах или развертывать в облаке. Контейнер может работать на любой ОС. Контейнер изолирован от других контейнеров и запускает собственное программное обеспечение, двоичные файлы и конфигурации.

  • create — создает контейнер из выбранного образа
  • start — активирует уже существующий контейнер
  • run — создает новый контейнер и сразу включает его
  • ls — отображает все существующие контейнеры
  • inspect — подробнее рассказывает о выбранном контейнере
  • logs — выводит в консоль логи (журнал событий)
  • pause — приостанавливает все запущенные процессы внутри контейнера
  • stop — пытается остановить выбранный контейнер, отправив ему сигнал SIGTERM, требующий завершить всю активность и сохранить пользовательские данные. Если ответ занимает слишком много времени, то следом посылает сигнал SIGKILL, чтобы «убить» процесс без сохранения данных
  • kill — выполняет ту же задачу, что и предыдущая команда, но пропускает шаг с отправкой SIGTERM. Сразу выключает контейнер, игнорируя сохранение пользовательских данных
  • rm — удаляет выбранный контейнер (он должен быть выключен, чтобы команда сработала)
# Синтаксис
docker container %команда%

# Выводит список запущенных контейнеров
docker ps

# Выводит список всех контейнеров
docker ps -a

# Выводит список id всех контейнеров
docker ps -a -q

# Запуск существующего контейнера 
docker start %container-id%

# Выполнить команду внутри запущенного контейнера
docker exec -it %container-id% /bin/bash 

# Остановка существующего контейнера
docker stop %container-id%

# Удаление существующего контейнера
docker rm %container-id%

4. Команды для управления томами

Том (Docker Volumes) — способ хранения данных, представляющий собой примонтированный каталог хоста к файловой системе контейнера.

Контейнеры могут создавать, обновлять и удалять файлы, но эти изменения теряются при удалении контейнера, и все изменения изолируются в этом контейнере. С помощью томов это можно изменить. Тома предоставляют возможность подключать определенные пути файловой системы контейнера обратно к хост-компьютеру. Если каталог в контейнере смонтирован, то изменения в этом каталоге также видны на хост-компьютере. Если мы смонтируем один и тот же каталог при перезапуске контейнера, мы увидим одни и те же файлы.

# Создать том с именем user-data без контейнера
docker volume create --name user-data

# Вывести список томов
docker volume ls

# Вывести детальную информацию по имени тома
docker inspect user-data

# Запустить контейнер ubuntu и подключить созданный том -v
docker run --rm -v user-data:/data -it ubuntu:22.04 /bin/bash

# Записать случайное число в файл
echo $RANDOM > /data/test

# Прочитать файл
cat /data/test

# В нашем примере это число 
12415

# Теперь нужно запустить любой другой контейнер и подключить тот же том user-data
# Например запустим centos v.8 и попробуем прочитать содержимое того же файла из тома user-data
docker run --rm -v slurm-storage:/data -it centos:8 /bin/bash -c "cat /data/test"

# Получим тот же результат. Задача выполнена - данные были сохранены в томе.
12415

5. Команды для работы портами

Docker запускает сервис изолированно — все порты между хостом и контейнером закрыты. Для доступа к сервису нужно указать сопоставление портов или создать маппинг. Тогда все запросы, проходящие через указанный порт хоста, будут перенаправляться в контейнер. Сопоставление портов делает сервисы контейнера доступными извне.

-p <host_post>:<container_port>

Для примера поднимем сервер и сделаем его доступным в основной ОС через порт 8082.

# 0. Создать каталог и перейти в него
mkdir apache 
cd apache

# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-apache
WORKDIR /var/www/html
COPY . /var/www/html
# разрешить подключение к 80 порту контейнера
EXPOSE 80

# 2. Создать файл index.php с содержимым
printf("Текущее время: %s<br/>", date('H:i:s', time() ) );

# 3. Создать
docker build . --tag apache

# 4. Запустить контейнер с указанием порта хоста и контейнера
docker run --rm -p 8082:80 apache

# 5. Перейти в браузере по адресу http://localhost:8082
# Вывод будет примерно таким
> Текущее время: 09:02:04

# 6. Найти id контейнера и остановить 
docker ps
docker stop %container-id%

6. Команды Docker-Compose

Docker-Compose — это инструмент в составе Docker, который позволяет запускать несколько контейнеров одновременно и маршрутизировать потоки данных между ними. Написан на Python.

При работе в Compose используется конфигурационный файл YAML. Создание и запуск всех служб производится выполнением одной команды.

Для примера поднимем сервер и сделаем редактирование файлов на лету, без ребилда. В конфигурационном файле для Compose укажем 2 сервиса: app и mysql. При этом для сервиса app укажем зависимость (depends_on) от сервиса mysql.

# 0. Создать каталог и перейти в него
mkdir apache2
cd apache2

# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-apache
# указываем рабочий каталог 
WORKDIR /var/www/html
# запускаем обновление по и установку wget
RUN apt-get update
# запускаем установку расширений php для работы с бд
RUN docker-php-ext-install pdo pdo_mysql mysqli
EXPOSE 80

# 2. Создать файл index.php с содержимым
# Выводим текущее время, 
# а также подключаемся в базе данных и выводим её версию
printf("Текущее время: %sn", date('H:i:s', time() ) );
$mysqli = new mysqli("mysql", "app", "secret", "db");
if( mysqli_connect_errno() )
{
	printf("Не удалось подключиться к mysql: %s<br/>", mysqli_connect_error());
	exit();
}
printf("Версия mysql сервера: %d<br/>", $mysqli->server_version);


# 3. Создать файл docker-compose.yml с содержимым
# В примере запускается только два сервиса app и mysql, 
# на практике файлы конфигурации, конечно, содержат множество сервисов
# Указываем, что монтируется текущий каталог ОС. Это позволит вносить изменения без перестроения/ребилда.
services:
  app:    
    container_name: php-server
    build:
      context: .
    ports:
      - 8082:80
    volumes:
      - .:/var/www/html    
    depends_on:
      - mysql
  mysql:
    image: mysql:8
    container_name: mysql-server-8
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - .:/application      
    restart: "always"
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: db
      MYSQL_USER: app
      MYSQL_PASSWORD: secret     
    ports:
        - "33099:3306"

# 4. Парсинг конфига YML и создание сервисов
docker-compose build

# 5. Запуск сервисов
docker-compose up

# 6. Перейти в браузере по адресу http://localhost:8082
# При изменении файлов в примонтированном каталоге основной ОС ,
# изменения будут сразу применяться в контейнере
# Вывод будет примерно таким
> Текущее время: 09:33:41
> Версия mysql сервера: 80031

Пример получения образа и запуска контейнера:

# 1. Скачать с Dockerhub.com образ Ubuntu 22.04
docker pull ubuntu:22.04

# 2. Создать контейнер образа ubuntu:22.04, запустить его и выполнить команду echo
# после выполнения команды контейнер завершает работу
docker run ubuntu:22.04 echo 'hello from ubuntu v.22.04'

# 3. Запуск контейнера с выполнением неограниченного количества команд
# открыть консоль виртуальной ОС Ubuntu для выполнения команд
docker run -it ubuntu:22.04 /bin/bash

# 4. Запуск контейнера с монтированием локальной директории C:Usersusernamedocker
# в запущенной ubuntu будет доступна директория локальной ОС Windows
docker run -it -v C:Usersusernamedockerapp:/mounted  ubuntu:22.04 /bin/bash

# 5. Можно добавить флаг --rm
# в таком случае контейнер будет удалён после завершения работы
docker run -it --rm ubuntu:22.04 /bin/bash

# 6. Если открыть новое окно cmd.exe, то команда ps отобразить список запущенных контейнеров
docker ps

# 7. Выход из контейнера
exit

Пример сборки образа с помощью Dockerfile и запуска контейнера:

# 0. Перейти в каталог проекта
cd /Users/username/docker/app

# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-cli
COPY board.php /board.php
RUN chmod +x /board.php
CMD php /board.php

# 2. Создать файл board.php с содержимым
$size = $argv[1] ?? 4;

$board = "";

for( $y = 0; $y < $size; $y++)
{
	for( $x = 0; $x < $size; $x++ )
	{
    	if( ( $x + $y ) % 2 == 0 )
		{
      		$board .= " ";
    	} else {
      		$board .= "#";
    	}
  	}
  	$board .= "n";
}
echo $board;


# 3. Создание образа с названием kolotun из конфигурационного файла Dockerfile, 
# расположенного в текущей директории (.)
docker build . --tag kolotun

# 4. Запуск и удаление после выполнения
docker run --rm kolotun

# 5. Запуск для выполнения команды ls (просмотра списка файлов)
docker run --rm kolotun ls

# 6. Запуск с параметром для скрипта
docker run --rm kolotun php board.php 10

# 7. Альтернативный файл Dockerfile
FROM php:7.4-cli
COPY board.php /board.php
RUN chmod +x /board.php
ENTRYPOINT ["php", "/board.php"]
CMD  ["4"]

# 8. Пересобираем образом с новым конфигом
docker build . --tag kolotun

# 9. Запуск с параметром для контейнера
docker run --rm kolotun 10

Сервер

13.12.2022

просмотров: 1.3k

Оценить код:

Код был обновлён. Предыдущий рейтинг:

  • Бесполезный код — 0 голосов
  • Костыль — 0 голосов
  • Полезный код — 2 голоса

Рассмотрим систему управления контейнерами под названием Docker. Ознакомимся с базовыми принципами ее работы, а также подробно рассмотрим основные команды, необходимые для управления Docker и ее составляющими. 

Краткая справка

Docker — это система управления контейнерами. Контейнеры же представляют собой логическое эволюционное продолжение виртуальных машин. Это изолированная среда для разработки и тестирования программного обеспечения. 

Контейнер Docker потребляет мало ресурсов и быстро запускается, а еще его легко переносить с одного устройство на другое. Из-за этих преимуществ Docker постепенно наращивает аудиторию и превращается в некий индустриальный стандарт, которым пользуются даже крупные корпорации вроде Microsoft. 

Поэтому стоит хотя бы на базовом уровне понимать, что есть Docker и как им управлять. В этом материале речь пойдет об основных командах для управления контейнерами. Будем их создавать, запускать, удалять и выполнять прочие полезные задачи, возникающие по ходу работы. 

Комьюнити теперь в Телеграм

Подпишитесь и будьте в курсе последних IT-новостей

Подписаться

Общие сведения об основных командах Docker

Управление контейнерами и образами в Docker мало чем отличается от управления другими приложениями в терминале Linux. Принцип тот же – вводим текст и получаем результат. Сначала надо указать ключевое слово Docker, потом указать команду, которую надо выполнить, а затем объект применения команды, аргументы, опции и прочие дополнения. Типичная операция, выполняемая в Docker, выглядит вот так:

docker container start

Для того чтобы обратиться к конкретному контейнеру или образу в Docker, используются их ID или названия, придуманные разработчиком. Допустим, для создания и запуска контейнера с названием new_container надо ввести: 

docker container run new_container

У команд существуют опции и аргументы. Их тоже рассмотрим.

Команды для управления контейнерами

Контейнер — ключевая единица в Docker. Поэтому для начала разберемся, как управлять ей. 

У описанных ниже команд есть общий синтаксис, который выглядит так: docker container название команды. Названия, собственно, ниже:

  • create — создает контейнер из выбранного образа.
  • start — активирует уже существующий контейнер.
  • run — создает новый контейнер и сразу включает его.
  • ls — отображает все существующие контейнеры.
  • inspect — подробнее рассказывает о выбранном контейнере.
  • logs — выводит в консоль логи (то есть журнал событий).
  • stop — пытается остановить выбранный контейнер, отправив ему сигнал SIGTERM, требующий завершить всю активность и сохранить пользовательские данные. Если ответ занимает слишком много времени, то следом посылает сигнал SIGKILL, чтобы «убить» процесс без сохранения данных.
  • kill — выполняет ту же задачу, что и предыдущая команда, но пропускает шаг с отправкой SIGTERM. Сразу выключает контейнер, игнорируя сохранение пользовательских данных.
  • rm — удаляет выбранный контейнер (он должен быть выключен, чтобы команда сработала).

Далее рассмотрим каждую из команд подробнее.

container create

Из названия понятно, что речь идет о создании нового контейнера. Это основная функция Docker, с нее начинается его работа.

Синтаксис следующий: docker create [опции] название образа [дополнительные команды][аргументы].

В квадратных скобках указываются опциональные компоненты команды. Использовать их необязательно, но можно оптимизировать создаваемый контейнер под свои задачи. 

К примеру, добавить ссылку на другой контейнер с помощью тега –link. Или подключить Standard Input с помощью команды в духе:

docker create -a STDIN название образа

Либо создать контейнер из образа операционной системы Ubuntu, добавив подключение к терминалу и запуск bash при каждом старте Docker: 

docker create -t -I ubuntu bash

Только при наличии терминала можно управлять контейнером. Поэтому его нужно обязательно запрашивать при каждому запуске. 

container start

В отличие от предыдущей команды, эта запускает контейнер, который существует, но находится в нерабочем состоянии. 

Синтаксис следующий: docker start [опции] название или ID контейнера [название или ID контейнера].

Все просто – вводите команду, а потом указываете название контейнера, чтобы его запустить:

docker start 49920 — пример старта через ID контейнера 49920

docker start testing_docker — пример старта через название testing_docker

Какой из вариантов использовать, решает разработчик, ориентируясь на собственные предпочтения. Технических отличий нет.

container run

Комбинирует две вышеописанные команды. Сначала создает новый контейнер, а потом тут же его включает. 

Синтаксис следующий: docker run [опции] название образа [команды][аргументы].

Практика та же, что мы видели в синтаксисе команды docker create. Разница в одном слове и доступных опциях. 

Чтобы создать контейнер из образа Ubuntu и тут же взять контроль над ним через командную строку, нужно сделать запрос терминала через опции команды.

К примеру,

docker run -it ubuntu root@d8e1140989525:/# 

используется для подключения к контейнеру с возможностью передавать ему команды после создания.

stop

Выполняет противоположную функцию. То есть не запускает контейнер, а, наоборот, останавливает его работу.

Синтаксис следующий: docker stop [опции] название или ID контейнера [название или ID контейнера].

Например, чтобы выключить контейнер с именем Timeweb, надо ввести в терминал:

docker stop timeweb

Аналогично с ID. Просто имя надо заменить на уникальный код, привязанный к контейнеру. Получится что-то в духе:

docker stop 14490

restart

Последняя команда, связанная с рабочим состоянием. Она выполняет перезапуск выбранного контейнера.

Синтаксис следующий: docker restart [опции] название или ID контейнера [название или ID контейнера].

Вводите команду, а потом указываете название контейнера, чтобы его перезапустить:

docker restart 49920 — пример перезапуска через ID контейнера 49920

docker restart testing_timeweb — пример перезапуска через название testing_timeweb

container ls (или docker ps)

Обе команды выполняют одну и ту же задачу. Просто одна из них использовалась раньше, а другая появилась позднее. 

docker ps отображает в терминале все запущенные контейнеры. А при добавлении опции -a в список попадают все контейнеры, созданные в системе.

В вывод команды попадают следующие параметры:

  • ID — то есть кодовое значение конкретного контейнера.
  • IMAGE — образ, используемый контейнером.
  • COMMAND — список команд, которые должны выполняться сразу после запуска.
  • CREATED — статус и время, когда контейнер бы создан (допустим, «35 минут назад»).
  • STATUS — текущее состояние – включен ли и время работы с последнего запуска. Тут может отображаться код выхода и время, когда он произошел.
  • PORTS — порты, используемые контейнером из списка.
  • NAMES — более понятные в сравнении с ID имена, которые можно точно так же использовать для исполнения команд или поиска.

При желании можно использовать опцию volume, чтобы в терминале отображались только тома, являющиеся предпочтительным механизмом хранения данных в Docker.

logs

Одна из команд, позволяющая подробнее ознакомиться с тем, как работает Docker. Точнее одна из его запущенных единиц. Показывает, как функционирует контейнер и что в текущий момент с ним происходит. Выводит некий журнал данных. 

Если указать ключ –follow и название контейнера, то в терминал в реальном времени будут выводиться логи Docker. Так можно беспрерывно наблюдать за его работой и возможным появлением ошибок.

inspect (для контейнера)

Отображает подробную информацию из Docker после обращения к конкретному контейнеру.

Синтаксис следующий: docker inspect [опции] название или ID контейнера [название или ID контейнера].

По умолчанию отображает данные в формате JSON. Можно использовать дополнительную опцию –format для смены формата данных.

docker inspect –format=‘{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}’ $INSTANCE_ID — пример вывода информации о MAC-адресе

docker inspect –format=‘{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}’ $INSTANCE_ID — пример вывода информации о портах

rm

Команда удаления одного или нескольких контейнеров Docker, найденных на диске вашего хостинга. 

Синтаксис следующий: docker rm [опции] название или ID контейнера [название или ID контейнера].

Чтобы удалить сразу несколько контейнеров с разными названиями и ID, нужно ввести:

docker rm 45fs testing_timeweb

Перед тем как удалить контейнер, нужно его выключить. Для этого надо воспользоваться командой:

docker stop

Команды Docker для управления образами

Еще одна значимая единица в Docker — образы. Управление ими во многом похоже на управление контейнерами, но есть ряд отличий, которые важно учитывать. Причем как в командах, так и в опциях.

У описанных ниже команд есть общий синтаксис, который выглядит так: docker image название команды. Названия, собственно, ниже:

  • build — собирает образ с нуля.
  • push — отправляет образ в реестр.
  • pull — загружает готовый образ с необходимыми для работы параметрами.
  • ls — показывает все существующие образы.
  • history — показывает каждый слой образа в ретроспективе, отображая ряд полезных сведений.
  • inspect — рассказывает все, что известно об образе, включая данные, касающиеся отдельных слоев.
  • rm — удаляет образ Docker из системы.
  • images — списком показывает все образы Docker, найденные на диске.

Рассмотрим каждую из них немного подробнее.

build

С помощью этой команды можно собрать образ, используя заранее подобранные параметры. Собираются одни из данных, хранящихся в файлах Dockerfile. Они находятся по определенным URL или заранее загружены в файловую систему. 

Синтаксис следующий: docker image build [опции] название и адрес файла Dockerfile, из которого будет собран образ.

Например, если вы хотите собрать образ с названием Timeweb и тегом host в директории moy_repositoriy, то надо ввести в терминал:

docker image build -t moy_repositoriy/timeweb:host

Образами можно делиться через сервис Docker Hub. Тогда ими смогут пользоваться другие пользователи Docker, указав при сборке соотвествующий адрес. Для входа в Hub используется команда docker login (еще упомянем ее ниже). 

push

После сборки образа на диске хостинга его можно разместить в Docker Hub с помощью отдельной команды. 

Синтаксис следующий: docker image push [опции] название и адрес, где будет размещен образ

К примеру, чтобы отправить в хаб образ Timeweb, который мы создали ранее, нужно ввести в терминал:

docker image push moy_repositoriy/timeweb:host

Он будет размещен по адресу, указанному в команде push. После этого его смогут вытащить другие пользователи. 

pull

В Docker Hub находится большой список уже готовых образов, которые были созданы вами или другими пользователями. Чтобы не собирать новые из Dockerfile, можно скачать уже имеющиеся и работать с ними. Чтобы их вытащить, нужна команда pull.

Синтаксис следующий: docker image pull [опции] название и адрес, где будет размещен образ.

К примеру, чтобы вытащить из хаба образ Timeweb, который мы создали ранее, нужно ввести в терминал:

docker image pull moy_repositoriy/timeweb:host

Аналогичным образом его смогут вытаскивать другие пользователи, обращаясь к адресу и названию образа, которые вы указывали. 

ls

docker image ls отвечает за отображение в терминале дополнительной информации об образах. Она показывает их список (как и в случае с контейнерами) и информацию о размере каждого.

Синтаксис следующий: docker image pull [опции][адрес репозитория:тег].

В вывод команды можно добавить другие данные с помощью отдельных ключей:

-a — увеличивает список отображаемых образов за счет отображения даже промежуточных. –digests — добавляет в вывод команды еще и дайджесты. -f — фильтрует выдачу по заранее определенным условиям. –format — меняет формат отображения данных на основе шаблона Go. –no-trunc — отключает усечение информации в терминале. -q — показывает ID вместо названий образов. 

history

Показывает своего рода историю образа. Речь идет о «слоях», то есть промежуточных вариациях образа, входящих в его состав. Команда history показывает их названия, размер и дату создания.

Синтаксис следующий: docker history [опции] название образа.

Например, чтобы отобразить слои образа Timeweb, введем в терминал:

docker image history timeweb

inspect (для образа)

Отображает подробную информацию из Docker после обращения к конкретному образу.

Синтаксис следующий: docker inspect [опции] название или ID контейнера [название контейнера или образа].

По умолчанию отображает данные в формате JSON. Можно использовать дополнительные опции –format для смены формата данных. Опция -s показывает размер инспектируемых элементов.

docker inspect –format=‘{{.Config.Image}}’ $INSTANCE_ID — пример вывода информации о названии образа

docker inspect –format=‘{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ $INSTANCE_ID — пример вывода информации об IP-адресе

rm

Команда удаления одного или нескольких образов Docker, найденных на диске вашего хостинга. 

Синтаксис следующий: docker rm [опции] название и путь до образа.

Чтобы удалить образ Timeweb из системы, нужно ввести:

docker rm moy_repositoriy/testing_timeweb:host

Эта команда позволяет выбирать только образы, которые хранятся локально. Удаленные элементы из репозитория удалить не получится. 

Чтобы удалить все локальные образы, обнаруженные в системе, введем в терминал:

docker image rm $(docker images -a -q)

images

Команда показывает все образы Docker, которые расположены на жестком диске вашего сервера (или локально). 

Вывод команды docker images выглядит так:

REPOSITORY

TAG

IMAGE ID

CREATED

SIZE

fedora

new

990fqD00124

12 hours ago

209MB

httpd

new

24eaet001s0s

24 hours ago

152MB

ubuntu

recent

30e102f4fas2

1 week ago

179MB

fedora

recent

92s0qF0D104

2 weeks ago

133MB

ubuntu

new

1d42e9ss40ft

24 hours ago

161MB

fedora

recent

eSS208s6das2

1 week ago

190MB

mysql

tag

pq544s09efg0

38 hours ago

452MB

Здесь отображаются следующие данные, касающиеся образа:

REPOSITORY — это репозитория, в котором хранится образ. TAG — привязанный к нему тег (прописывается в конце команды после двоеточия. Например, docker image build moy_repositoriy/testing_timeweb:host. IMAGE ID — код образа, используемый вместо имени. CREATED — срок жизни. Показывает, как давно был создан образ. Неделю назад, 12 часов назад и т.п. SIZE — пространство, которое образ занимает на диске. 

Прочие команды

Это общие операции, не привязанные к работе с конкретными сущностями типа образов и контейнеров. Но они тоже пригодятся при использовании Docker.

  • docker version — показывает техническую информацию о самом Docker. Как о клиенте, так и о сервере.
  • docker login — авторизует пользователя в реестре Docker.
  • docker system prune — выполняет некую чистку, удалив из системы контейнеры, которые уже не используются, ненужные сети и образы без имен и меток.

version

К этой команде можно обратиться за подробной информацией о самом Docker. Она отобразит версию клиента и сервера Docker. 

login

Об этой команде уже говорили. Она позволяет авторизоваться в реестре образов Docker Hub. Загружать туда образы и выгружать уже готовые к себе.

system prune

По умолчанию эта команда удаляет только данные без тегов, но можно настроить ее так, чтобы из системы были удалены все неиспользуемые элементы. 

Допустим, чтобы стереть из Docker все образы и сверху зацепить еще тома, то надо ввести в терминал:

docker system prune –all –volumes

На этом все. Это даже больше того минимума, который нужен для работы с Docker на начальных этапах. Этих команд хватит, чтобы собрать образ, запустить контейнер и перейти к разработке. А уже по ходу дела вы сможете обращаться в документацию и обогащать свои знания.

Оставлю тут. А то частенько забываю команды. Пусть будут перед глазами…
Да. Хорошая шпаргалка по докеру есть тут и тут

  • DOCKER RUN
  • ПРОСТЫЕ ДЕЙСТВИЯ С КОНТЕЙНЕРАМИ
  • ЗАПУСК И ОСТАНОВКА КОНТЕЙНЕРОВ
  • ИНФОРМАЦИЯ О КОНТЕЙНЕРЕ
  • РАБОТА С КОНТЕЙНЕРАМИ
  • РАБОТА С REGISTRY
  • РАБОТА С ОБРАЗАМИ
  • РАБОТА С ТОМАМИ
  • СЕТИ
  • ЧИСТКА МУСОРА

DOCKER RUN


docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[ OPTIONS ]

-it — интерактивный режим. Перейти в контейнер и запустить внутри контейнера команду
-d — запустить контейнер в фоне (демоном) и вывести его ID
-p port_localhost:port_docker_image — порты из докера на локалхост
-e «TZ=Europe/Moscow» — указываем нашему контейнеру timezone
-h HOSTNAME — присвоить имя хоста контейнеру
— link <имя контейнера> — связать контейнеры с другим
-v /local/path:/container/path/ — прокидываем в контейнер докера директорию с локальной машины
--name CONTAINERNAME — присвоить имя нашему контейнеру
--restart=[no/on-failure/always/unless-stopped] — варианты перезапуска контейнера при крэше

Подробнее про опции запуска тут

# Для больше читабельности можно при переносе строки ставить символ 
docker run  
—restart=always -it 

ПРОСТЫЕ ДЕЙСТВИЯ С КОНТЕЙНЕРАМИ


Создание контейнера

docker create -t -i eon01/infinite --name <CONTAINERNAME or CONTAINERID>

Переименование контейнера

docker rename <OLD CONTAINERNAME> <NEW CONTAINERNAME>

Удаление контейнера

docker rename <OLD CONTAINERNAME> <NEW CONTAINERNAME>

Обновление контейнера

docker update --cpu-shares 512 -m 300M <CONTAINERNAME or CONTAINERID>

ЗАПУСК И ОСТАНОВКА КОНТЕЙНЕРОВ


Запуск остановленного контейнера

docker start <CONTAINERNAME>

Остановка

docker stop <CONTAINERNAME>

Перезагрузка

docker restart <CONTAINERNAME>

Пауза (приостановка всех процессов контейнера)

docker pause <CONTAINERNAME>

Снятие паузы

docker unpause <CONTAINERNAME>

Блокировка (до остановки контейнера)

docker wait <CONTAINERNAME>

Отправка SIGKILL (завершающего сигнала)

docker kill <CONTAINERNAME>

Отправка другого сигнала

docker kill -s HUP <CONTAINERNAME>

Подключение к существующему контейнеру

docker attach <CONTAINERNAME>

Выход через Ctrl+p+q


ИНФОРМАЦИЯ О КОНТЕЙНЕРЕ


Работающие контейнеры

# Вывести работающие контейнеры
docker ps

# Вывести все контейнеры
docker ps -a

Логи контейнера

docker logs <CONTAINERNAME or CONTAINERID>

Информация о контейнере

# Все параметры контейнера
docker inspect <CONTAINERNAME or CONTAINERID>

# Вывести величину конкретного параметра
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -q)

События контейнера

docker events <CONTAINERNAME or CONTAINERID>

Публичные порты

docker port <CONTAINERNAME or CONTAINERID>

Выполняющиеся процессы

docker top <CONTAINERNAME or CONTAINERID>

Использование ресурсов

docker stats <CONTAINERNAME or CONTAINERID>

Изменения в файлах или директориях файловой системы контейнера

docker diff <CONTAINERNAME or CONTAINERID>

РАБОТА С КОНТЕЙНЕРАМИ


Зайти в уже запущенный контейнер.

(точнее выполнить команду внутри контейнера)

docker exec -it name_of_container /bin/bash

Запустить контейнер и открыть в нём bash

docker run -it -d --name my_container CONTAINER_ID /bin/bash

Копирование файлов внутрь контейнера.

docker cp some_files.conf docker_container:/home/docker/

При смене путей, можно копировать из контейнера.


РАБОТА С REGISTRY


Вход в реестр

# Вход на докерзаб
docker login

# Вход в WebUI локального registry
docker login localhost:8080

Выход из реестра

# Докерхаб
docker logout

# Локальный registry
docker logout localhost:8080

Поиск образа

# Простой поиск
docker search nginx

# Поиск с фильтрами
docker search nginx -- filter stars=3 --no-trunc busybox

Pull (выгрузка из реестра) образа

# Выгрузка из Докерхаба
docker pull nginx

# Из локального registry
docker pull eon01/nginx localhost:5000/myadmin/nginx

Push (загрузка в реестр) образа

# В докерхаб
docker push eon01/nginx

# В локальный registry
docker push eon01/nginx localhost:5000/myadmin/nginx

РАБОТА С ОБРАЗАМИ


Список образов

docker images

Создание образов

(файл опциями сборки образа), учитывая что мы находимся в папке где лежит этот файл. Через ключ -t назначаем имя нашему образу. Точка в конце означает что Dockerfile лежит в текущей директории.

docker build -t my_docker .
docker build .
docker build github.com/creack/docker-firefox
docker build - < Dockerfile
docker build - < context.tar.gz
docker build -t eon/infinite .
docker build -f myOtherDockerfile .
curl example.com/remote/Dockerfile | docker build -f - .

Удаление образа

docker rmi nginx

Загрузка репозитория в tar (из файла или стандартного ввода)

docker load < ubuntu.tar.gz
docker load --input ubuntu.tar

Сохранение образа в tar-архив

docker save busybox > ubuntu.tar

Просмотр истории образа

docker history

Создание образа из контейнера

docker commit nginx

Тегирование образа

docker tag nginx eon01/nginx

Push (загрузка в реестр) образа

docker push eon01/nginx

РАБОТА С ТОМАМИ


Немного теории:

  • Если монтируем пустой том с хоста, а в контейнере уже есть файлы, то они скопируются в том
  • Если монтируем с хоста том с файлами, то они окажутся в контейнере
  • Если мы монтируем не пустой том с хоста, а в контейнере по этому пути уже есть файлы, то они будут скрыты
  • Можно монтировать с хоста любые файлы. В том числе и служебные. Например сокет docker. Что бы получился docker-in-docker (dind)

Создание тома

docker volume create <VOLUME-NAME>

Монтируем с хоста в контейнер

docker run --mount source=<VOLUME-NAME>,target=/path/to/folder/in/container -d <IMAGE>

Монтируем с контейнера на хост

docker run --mount type=bind,source=/host/folder,target=/container/folder -d <IMAGE>

Посмотреть настройки тома

docker volumes inspect <VOLUME-NAME>

Вывести список всех томов с их названиями.

docker volume ls

Удаление volumes по названию

docker volume rm <VOLUME-NAME>

СЕТИ


Создание сети

docker network create -d overlay MyOverlayNetwork
docker network create -d bridge MyBridgeNetwork
docker network create -d overlay 
  --subnet=192.168.0.0/16 
  --subnet=192.170.0.0/16 
  --gateway=192.168.0.100 
  --gateway=192.170.0.100 
  --ip-range=192.168.1.0/24 
  --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" 
  --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" 
  MyOverlayNetwork

Удаление сети

docker network rm MyOverlayNetwork

Список сетей

docker network ls

Получение информации о сети

docker network inspect MyOverlayNetwork

Подключение работающего контейнера к сети

docker network connect MyOverlayNetwork nginx

Подключение контейнера к сети при его запуске

docker run -it -d --network=MyOverlayNetwork nginx

Отключение контейнера от сети

docker network disconnect MyOverlayNetwork nginx

ЧИСТКА МУСОРА


Показать образы и контейнеры

# Вывести все образы (images)
docker images -a

# Вывести все неиспользуемые образы
docker images -f dangling=true

# Выведет список запущенных контейнеров, если добавить ключ -a, выведет список всех контейнеров.
docker ps

Удаление образов (images)

# Для удаления используется команда docker rmi с добавлением ИД или тега, например:
# с ключом --force удалит контейнер и образ
docker rmi abb461727af5

# Удаление всех образов
docker rmi $(docker images -a -q)

# Удаление всех неиспользуемых образов
docker images prune
docker rmi $(docker images -f dangling=true -q)

# Удаление всех неиспользуемых (не связанных с контейнерами) образов:
# Если добавить к команде ключ -a, то произойдет удаление всех остановленных контейнеров и неиспользуемых образов.
docker system prune

# Удаление всех образов без тегов
docker rmi -f $(docker images | grep "^<none>" | awk "{print $3}")

# Удаление всех образов
docker rmi $(docker images -a -q)

Удаление контейнеров (containers)

# Для удаления контейнера, его необходимо сначала остановить командой ниже с указанием ID или названия контейнера.
docker stop CONTAINER_ID

# Для удаления контейнера используется команда docker rm с добавлением ИД или названия
docker rm CONTAINER_ID

# Удаление контейнера и его тома (volume)
docker rm -v CONTAINER_ID

# Удаление всех контейнеров со статусом exited
docker rm $(docker ps -a -f status=exited -q)

# Удаление всех остановленных контейнеров
docker container prune
docker rm `docker ps -a -q`

# Удаление контейнеров, остановленных более суток назад
docker container prune --filter "until=24h"

# Остановка и удаление всех контейнеров
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)

Удаление томов (volumes)

#Вывести список всех томов с их названиями.
docker volume ls

# Удаление volumes по названию
docker rm <volume_name>

# Вывести список всех томов не связанных с контейнерами
docker volume ls -f dangling=true

# Удаление томов (volumes) несвязанных с контейнерами
docker volume prune
docker volume rm $(docker volume ls -f dangling=true -q)

# Удаление неиспользуемых (dangling) томов по фильтру
docker volume prune --filter "label!=keep"

Удаление сетей (networks)

# Вывести список всех сетей с их ИД и названиями. 
docker network ls

# Для удаления используется команда  с добавлением ИД или названия:
docker network rm NETWORK_ID

# Удалит все сети не используемые хотя бы одним контейнером.
docker network prune

Удаление всех неиспользуемых объектов

docker system prune

# По умолчанию для Docker 17.06.1+ тома не удаляются. Чтобы удалились и они тоже:
docker system prune --volumes

Оцените статью

Docker

Содержание

  • Начало работы

    • Установка
    • Проверка установки
    • Настройка после установки
  • Словарь

  • Команды Docker

    • Клонирование образа (pull)
    • Поиск образа (search)
    • Просмотр контейнеров (ps, inspect, logs)
    • Запуск контейнера (run)
    • Повторный запуск контейнера (start)
    • Присоединение к контейнеру (attach)
    • Остановка контейнера (stop, kill)
    • Удаление контейнера или образа (rm)
    • Запуск команд в контейнере (exec)
    • Сохранение изменений в контейнере (commit)
    • Отправка данных на Docker Hub (login, push)
    • Копирование файлов (cp)
    • Информация об использовании диска (system df)
    • Очистка Docker (system df)
  • Dockerfile

    • FROM
    • LABEL
    • ENV
    • WORKDIR
    • COPY
    • ADD
    • RUN
    • CMD
    • ENTRYPOINT
    • VOLUME
    • EXPOSE
    • STOPSIGNAL
    • USER
    • ARG
    • HEALTHCHECK
    • Сборка проекта
    • Уменьшение размера образа
    • Многоэтапная сборка (multi-stage builds)
    • Dockerignore
    • Инструменты для Docker
  • Docker Compose

    • Установка Docker Compose
  • Команды Docker Compose

    • Сборка проекта Docker Compose (build)
    • Запуск проекта Docker Compose (up)
    • Остановка проекта Docker Compose (stop, down)
    • Просмотр состояния Docker Compose (ps, logs, images)
    • Отображение запущенных процессов Docker Compose (top)
    • Просмотр образов Docker Compose (images)
    • Выполнение команды внутри контейнера Docker Compose (exec)
    • Просмотр версии Docker Compose (version)
    • Прочие команды Docker Compose
  • Docker Compose file

    • version
    • services
    • build
    • image
    • ports
    • expose
    • env_file
    • environment
    • volumes
    • container_name
    • entrypoint
    • command
    • depends_on
    • restart
    • healthcheck
    • extends

Начало работы

Установка

Наверх

Начальная установка Docker.

Для Windows и Mac OS систем, требуется установить Docker Desktop c
официального сайта.

Настройка после установки

Наверх

Для Linux, чтобы каждый раз не нужно было писать sudo.

sudo groupadd docker
sudo usermod -aG docker $USER

И дальше требуется перезагрузить компьютер или перелогиниться,
чтобы изменения вступили в силу.

Если требуется, чтобы Docker daemon автоматически загружался
при старте операционной системы нужно указать это в настройках (systemd).

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

Для отключения этого.

sudo systemctl disable docker.service
sudo systemctl disable containerd.service

Проверка установки

Для проверки работы Docker.

docker run hello-world
docker ps -a

И после этого должен отображаться контейнер hello-world.

Дальше этот образ не требуется, поэтому его можно удалять.

docker rm $(docker ps -aq)
docker rmi hello-world

Словарь

Наверх

  • host — операционная система, на которую устанавливают Docker и на которой он работает.
  • daemon — служба, которая управляет Docker-объектами:
    сетями, хранилищами, образами и контейнерами.
  • client — консольный клиент, при помощи которого пользователь
    взаимодействует с Docker daemon и отправляет ему команды.
  • image — это неизменяемый образ, из которого разворачивается контейнер.
  • container — развёрнутое и запущенное приложение.
  • volumes — тома для постоянного хранения информации.
  • registry — репозиторий, в котором хранятся образы.
  • Docker Hub — Популярный публичный репозиторий, используемый по умолчанию в Docker.
  • Dockerfile — файл-инструкция для сборки образа.
  • Docker Compose — инструмент для управления несколькими контейнерами.
    Он позволяет создавать контейнеры и задавать их конфигурацию.
  • Docker Desktop — Это GUI-клиент, который отображает все сущности Docker.
    Работает на Linux, macOS и Windows.

Команды Docker

Клонирование образа

Наверх

Команда для клонирования образа.

По стандарту будет скачиваться latest версия,
но через двоеточие можно указать версию image.

docker pull <image-name>:<version>

Склонированный образ является неизменяемым.

Примеры:

Клонирование образа nginx.

Клонирование образа debian.

docker pull debian:11.4-slim

Поиск образа

Наверх

Для поиска образа используется команда search.
Она будет выводить все найденные варианты с Docker Hub.

docker search <image-name>

Официальный сайт, где можно найти все контейнеры и описание к ним
Docker Hub.

Примеры:

Поиск образов для debian.

Просмотр контейнеров

Наверх

Команда docker ps показывает все запущенные контейнеры.

Опции:

  • a — показать все контейнеры, даже остановленные.
  • s — показать размер контейнера.
  • q — показать только id контейнера.

Примеры:

Показать запущенные контейнеры.

Показать все контейнеры.

Показать все контейнеры и их размер.

Вывести id запущенных контейнеров.

Логи контейнера

Наверх

Для просмотра логов, которые отдаёт контейнер есть атрибут logs.

docker logs <container-name>
docker logs <container-hash>

Сборка проекта

Наверх

Сборка всего проекта в один контейнер.

Опции.

  • -t / --tag — тег для контейнера.
  • -f / --file — путь до Dockerfile.
  • --squash — все слои будут соединены в один.

Точка в конце указывает текущую директорию как место сборки.
Также можно указать путь до директории.

docker build -t <username>/<container-name>:<vesion> .

Полная документация по
docker build.

Примеры:

Сборка контейнера с именем.

docker build -t kotdimos/my_nginx:1.23.1 .

Сборка контейнера из определённого Dockerfile.

docker build -t kotdimos/my_nginx:1.23.1 -f Dockerfile.nginx .

Просмотр информации об объекте

Наверх

inspect — позволяет просмотреть низкоуровневую информацию
о различных объектах в docker.

Примеры:

Просмотреть данные контейнера.

docker inspect 852e9526a135

Просмотреть данные образа.

docker inspect mysql:8.0.31

Просмотреть данные network.

docker inspect network_deafault

Просмотреть данные volume.

Просмотр образов

Наверх

Для просмотра существующих образов.

Запуск контейнера

Наверх

Изначальный запуск контейнера.
Если образ никогда не был установлен,
то сначала Docker скачает образ, а потом запустит его.

docker run <image-name>:<version>

Для работы внутри контейнера требуется указать
флаги -it (-i interactive, -t — tty).

docker run -it <image-name>:<version>

Для старта работы контейнера в фоновом режиме
нужно использовать флаг -d (-d — detach).

docker run -d <image-name>:<version>

При обычном запуске генерируется рандомное имя контейнера.
Для того, чтобы дать самостоятельно имя требуется использовать флаг --name.

docker run -it --name <container-name> <image-name>:<version>

Для того, чтобы контейнеры взаимодействовали с основной машиной,
нужно установить им порты, по которым они будут взаимодействовать.
Для этого используется флаг -p,
и после этого указывается порт вашей машины,
и порт, который будет в докер контейнере.

docker run -d -p 8080:8080 <image-name>:<version>

Для того, чтобы передать контейнеру файлы основной машины,
можно воспользоваться флагом -v, где требуется указать директорию,
которая будет монтироваться, и потом, куда она будет монтироваться.

docker run -it -v <path-to-host-directory>:<path-to-container-directory> <image-name>:<version>

Примеры:

Запуск nginx.

Проброс портов для nginx.

docker run -p 80:80 nginx:1.23.1

Добавление имени к контейнеру.

docker run --name my_nginx -p 80:80 nginx:1.23.1

Повторный запуск контейнера

Наверх

Если использовать run, то Docker будет создавать новый контейнер.
Но если требуется запустить контейнер, который уже когда-то использовался,
используется команда start.
Запускать контейнер можно как и по имени контейнера, так и по его id.

docker start -it <container-name>
docker start -it <container-id>

Присоединение к контейнеру

Наверх

Команда для присоединения к рабочему контейнеру.

docker attach <container-name>
docker attach <container-id>

Для выхода из него обычно используется exit.

Остановка контейнера

Наверх

Для остановки контейнера используется команда stop.

docker stop <container-name>
docker stop <container-id>

Для остановки всех контейнеров.

docker stop $(docker ps -aq)

Принудительное завершение контейнера.

docker kill <container-name>
docker kill <container-id>

Удаление контейнера или образа

Наверх

Для удаления контейнера нужно использовать rm,
удалять можно как и по имени контейнера, так и по его id.

docker rm <container-id>
docker rm <container-name>

Если требуется удалить все контейнеры.

docker rm $(docker ps -aq)

Если требуется удалить контейнеры по имени образа.

docker rm $(docker ps -a | awk '$2=="<image-name>" { print $1 }')

Для удаления образа нужно использовать rmi,
при этом все контейнеры основанные на нём должны быть удалены.

Для удаления всех образов.

docker rmi $(docker images -q)

Запуск команд в контейнере

Наверх

Для запуска команд используется команда exec.

docker exeс -it <container-name> <command>
docker exeс -it <container-id> <command>

Если нужно запусить команду под определённым пользователем используется флаг -u.

docker exec -u <user-id> -it <container-id> <command>
docker exec -u <user-name> -it <container-id> <command>

Примеры:

Просмотреть корректность заполнения конфига в nginx.

docker exec -it 17911b46528e nginx -t

Вход под root пользователем в контейнере.

docker exec -u 0 -it b6910f29ad52 /bin/bash

Сохранение изменений в контейнере

Наверх

Для сохранения изменений требуется его закоммитить.

docker commit <container-name> <username>/<container-name>:<vesion>
docker commit <container-id> <username>/<container-name>:<vesion>

Отправка данных на Docker Hub

Наверх

Для отправки данных требуется авторизация

После этой команды консоль запрашивает логин и пароль для авторизации
на сайте docker.

После этого можно передать данные на Docker Hub.

Копирование файлов

Наверх

Команда cp позволяет копировать файлы к контейнер и из контейнера.

Опции:

  • -a / --archive — копирование всей инфромации (uid/gid).
  • -L / --follow-link — следовать символьной ссылке.
  • -q / --quiet — подавить вывод во время копирования.

Примеры:

Копирование файла в контейнер.

docker cp ./file_name container1:/home/user/file_name

Копирование файла из контейнера.

docker cp container1:/home/user/file_name ./file_name

Информация об использовании диска

Наверх

Команда, для того чтобы получить сколько использует docker дискового пространства.

Подробная информация об каждом объекте.

Очистка Docker

Наверх

Docker при долгом использовании очень сильно загрезняет диск.

Очистка всего docker от мусора.

Будут удалены:

  • все остановленные контейнеры.
  • все сети, не используемые хотя бы одним контейнером.
  • все тома, не используемые хотя бы одним контейнером.
  • все образы, с которыми не связан хотя бы один контейнер.
  • весь кэш сборки.

Такой вариант может быть довольно жёстким для очищения.

Отдельное удалеение:

Удаление всех dangling образов.

Удаление всех неиспользуемых сетей.

Удаление volumes.

Удаление всех остановленных контейнеров.

Dockerfile

Наверх

Dockerfile является настройкой собственного контейнера.
Каждая новая инструкция будет создавать новый слой контейнера.

Документация по всем командам.

FROM

Наверх

Наследование от другого образа, с которого будет происходить старт.

FROM <image-name>:<version>

Примеры.

FROM ubuntu:20.04

FROM debian:11.4-slim

LABEL

Наверх

Метаданные для образа.

LABEL <key>=<value> [<key>=<value> ...]

Примеры.

LABEL maintainer="user@example.org" version="1.1.1"

ENV

Наверх

Регистрация переменной окружения.

Примеры.

ENV LEVEL debug
ENV NGINX_VERSION=1.23.1

WORKDIR

Наверх

Указания рабочей директории, в какой директории будет находиться контейнер,
от куда будет запуск команд.
Если директория не создана, тогда docker сам создаст эту директорию.

Примеры.

WORKDIR /home/user
WORKDIR /app

COPY

Наверх

Копирование файлов из хоста в образ.
Копирование файлов будет происходить из хоста,
где находится Dockerfile и ниже, выше подниматься нельзя.

COPY <src> [<src> ...] <dst>
# <src> - файл или директория внутри build контекста
# <dst> - файл или директория внутри контейнеры

Примеры.

COPY . /home/user/
COPY nginx_config/ /home/user/nginx_config

ADD

Наверх

Добавление файлов работают ровно так же, как и COPY,
но также можно добавлять вместо локальных файлов файлы из интернета.

ADD <src> [<src> ...] <dst>
# <src> - файл или директория внутри build контекста
# <dst> - файл или директория внутри контейнеры

Примеры.

# добавление по url
ADD <url> /home/user/

RUN

Наверх

Вызов команд. Для уменьшения слоев можно писать несколько команд в одном запуске.

Примеры.

RUN apt update && apt install -y nginx

RUN apt install gcc -y && 
    gcc -Wall -o main main.c

CMD

Наверх

Указание какая команда будет выполняться при старте контейнера.

Примеры.

CMD /start.sh

CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT

Наверх

Аналог CMD — ENTRYPOINT.

Примеры.

ENTRYPOINT /start.sh

ENTRYPOINT ["nginx", "-g", "daemon off;"]

VOLUME

Наверх

Указание точки монтирования томов внутри образа.

VOLUME <dst> [<dst> ...]
# <dst> - директория монтирования для volume'a

Примеры.

VOLUME /app /db /data

VOLUME ["/var/log"]

EXPOSE

Наверх

Указание портов, которые слушает сервис в запущенном контейнере.

EXPOSE <port>[/<proto>] [<port>[/<proto>] ...]
# <port> - порт сервиса внутри контейнера
# <proto> - tcp или udp

Примеры.

EXPOSE 8080/tcp 3389/udp
EXPOSE 8080
EXPOSE 80 443

STOPSIGNAL

Наверх

Указывается сигнал, который посылается процессу при остановке контейнера.

Примеры.

USER

Наверх

Имя (ID) пользователя, от которого выполняются директивы RUN, CMD, ENTRYPOINT.

Примеры.

ARG

Наверх

Почти как ENV, но задаёт параметры только для docker build.
Если в ENV мы задавали константные переменные, то здесь они будут задаваться динамически.

Примеры.

HEALTHCHECK

Наверх

Команда, которой можно проверить состояние сервиса.

Уменьшение размера образа

Наверх

  1. Избегать установки лишних пакетов и упаковки лишних данных в образы.
  2. Использовать связанные команды для RUN инструкций.
RUN command_1 && command_2 && command_3

Или можно привести к более читаемому виду

RUN command_1 && 
    command_2 && 
    command_3
  1. Следить за последовательностью описания Dockerfile.
  2. Уменьшать количество слоёв.
  3. Продумывать порядок слоёв —
    сначала выполняются слои которые не будут обновляться после каждой пересборки,
    после, те которые могут подвергаться изменениям.
  4. Один контейнер — одна задача.
  5. Чистить за собой в контейнере.
  6. Использовать multi-stage сборки (для компилируемых языков).
  7. Использовать scratch образ для собственных приложений.

scratch — зарезервированный образ Docker, который является нулевым образом.

Многоэтапная сборка

Наверх

Многоэтапная сборка (multi-stage build) —
предназначена для оптимизации конечного контейнера.

Что было до появления многоэтапной сборки?

Создавались 2 Dockerfile-а, один для разработки
(содержит все необходимое для создания вашего приложения),
другой оптимизированный для создания итогового образа,
Эта практика в свое время получила название «шаблон строителя».
Однако, поддерживать в актуальном состоянии два Dockerfile-а очень трудно.
От этой концепции отказались когда пришла многоэтапная сборка.

Зачем нужна многоэтапная сборка?

Многоэтапная сборка нужна для оптимизации конечного контейнера.
Суть подхода заключается в том,
чтобы не заботиться о количестве получающихся слоев
в процессе сборки вашего приложения
и копировать результаты сборки из одного образа в другой.

К примеру, при компиляции приложения на c++,
требуются специальные библиотеки, компилятор и исходный код,
а в конце мы получаем лишь скомпилированный файл,
который весит пару МиБ.
И тогда можно просто перкопировать скомпилированный файл на другой контейнер,
и в итоге мы получим очень легковестный контейнер.

Для копирования файлов с одного контейнера
на другой используется команда COPY с опцией --from,
и через равно указывается номер контейнера от куда будет происходить копирование.

К опции FROM можно добавить псевдоним
для более удобного понимания от куда идёт копирование.

Пример:

FROM golang:latest as build
COPY . .
RUN go build ./src/main.go

FROM alpine:latest
COPY --from=build /go/main .
CMD ["./main"]

Dockerignore

Наверх

Файл .dockerignore преднзначен для исключения файлов и директорий.
Это помогает избежать ненужной отправки больший и конфиденциальных файлов и каталогов.

Знак Описание
# Комментарий
* Ноль, один или более символов
** Любое количество директорий, включая ноль
? Подстановка одного символа
! Исключение из исключений

Примеры:

Комментарий.

Игноривание всех файлов заканчивающихся на .log.

Игноривание всех файлов заканчивающихся на .log во всех директориях.

Исключение из исключений.

# Игноривание всех файлов *.md
*.md
# Но включение файла README.md
!README.md

Инструменты для Docker

Наверх

Для удобного просмотра контейнеров, какие запущены,
какие простаивают, сколько памяти тратят и пр., есть утилита ctop.

Документацию и установку можно найти на github.

Docker Compose

Наверх

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

Описывается всё в файле docker-compose.yml.
Это файл, который будет содержать инструкции, необходимые для запуска и настройки сервисов.
Обычно он хранится в корневой директории проекта.

Установка Docker Compose

Наверх

Один из вариантов установки docker compose, это установка Docker Desktop.
Он будет содержать в себе и docker и docker-compose.
Ссылка на установку Docker Desktop.

Можно установить docker-compose используя пакетный менеждер дистрибутива.
Это отдельный файл, который является обёрткой над docker.

Так же существует специальный плагин для docker — docker-compose-plugin.
Он позволяет использовать команду не docker-compose, а docker compose,
команда будет являться не отдельным файлом, а расширением docker.
Более подробная инструкция по установке.

Команды Docker Compose

Наверх

Docker Compose имеет общие опции для работы со всеми командами.

Опции:

  • -f / --file <docker-compose-specify-file>
    если требуется использовать другой файл.
    docker compose обычно запускает только файл
    docker-compose.yml или docker-compose.override.yml,
  • --env-file — указать альтернативный env файл.
    По умолчанию docker compose использует файл .env.
  • --project-name / -p — указать имя проекта.
  • --parallel <int> — контролировать максимальное количество параллелизма.
    для неограниченного количества -1. По умолчанию -1.

Сборка проекта Docker Compose

Наверх

Сборка проекта.

Опции:

  • --no-cache — не использовать кэш при сборке образа.
  • --pull — стараться всегда получить более новую версию.
  • --quiet / -q — ничего не выводить на stdout.
  • --build-arg — установить параметры сборки.

Запуск проекта Docker Compose

Наверх

Команда up запускает описанные контейнеры.

Опции:

  • --build — перед запуском, происходит сборка контейнеров.
  • -d — запуск контейнеров в фоновом режиме.
  • --no-build — не создавать образ, даже если он отсутствует.
  • --attach — прикрепиться сервисному выходу.
  • --attach-dependencies — присойдениться к зависимым контейнерам.
  • --no-recreate — если контейнеры существуют, не пересоздовать их заново.
  • --pull — вытянуть образы перед запуском.
  • --abort-on-container-exit — останавливает все контейнеры,
    если какой-то контейнер был остановлен.
  • --force-recreate — пересоздать контейнер, даже если его конфигурация не изменилась.
  • --remove-orphans — удалить контейнеры, если они были не определены в compose файле.

Примеры:

Запуск проекта.

Запустить проект и дополнительно собрать его.

docker compose up --build

Запустить проект в фоновом режиме.

Остановка проекта Docker Compose

Наверх

Остановка проекта.

Остановить проект и удалить контейнеры.

Просмотр состояния Docker Compose

Наверх

Посмотр логов сервиса.

docker compose logs -f <service-name>

Вывод списка контейнеров.

Показать список образов.

Отображение запущенных процессов Docker Compose

Наверх

Команда показывает какие процессы запущены в каждом запущенном контейнере.

Просмотр образов Docker Compose

Наверх

Команда для просмотра информации о образах.

Выполнение команды внутри контейнера Docker Compose

Наверх

Выполнение команды в контейнере.

docker compose exec <service-name> <command>

Просмотр версии Docker Compose

Наверх

version — предназначен для просмотра версии docker compose.

Прочие команды Docker Compose

Наверх

Справка по всем командам.

Docker Compose file

Наверх

Полная документация по docker compose file.

Документация по 3 версии.

version

Наверх

В начале файла указывается версия compose.
В различных версиях добавлены/удалены/изменены службы.
Все различные
версии и изменения.

При указании используемой версии файла compose,
при версиях 2 и 3, нужно указать как старший, так и дополнительный номера.
Если дополнительная версия не указана,
по умолчанию используется 0, а не последняя дополнительная версия.

version: "3"
# эквивалент вот этому
version: "3.0"

services

Наверх

services — в данном блоке описывается список сервисов.

services:
  name_1:
    ...
  name_2:
    ...
  name_3:
    ...

build

Наверх

build — указание пути, где лежит Dockerfile для определенного проекта
и передача определённых аргументов.

Примеры:

В текущей директории будет искаться файл Dockerfile и запускаться.

Будет запущен Dockerfile.nginx в директории nginx.

build: ./nginx/Dockerfile.nginx

Так же можно это разбить.

build:
  context: ./nginx
  dockerfile: Dockerfile.nginx

Для передачи аргументов используется args.

build:
  context: ./nginx
  args:
    ARG1: arg1
    ARG2: arg2

Либо такой вариант.

build:
  context: ./nginx
  args:
    - ARG1=arg1
    - ARG2=arg2

image

Наверх

image — образ с которого будет запускаться контейнер.

Примеры:

Запуск от определённого image.

ports

Наверх

ports — Открытие контейнерных портов, для работы с хостом.

ports:
  - <host-port>:<container-port>

Примеры.

Открытие порта.

Открытие нескольких портов.

ports:
  - 8080:80
  - 6060:6060

expose

Наверх

expose — открывает порты, не окрывая из на хостовой машине.
Будут доступны только связным службам.

Пример.

expose:
  - "3000"
  - "8000"

env_file

Наверх

env_file — Добавление переменные среды из файла.
Может быть одним значением или списком.

env_file: <env-file>

env_file:
  - <env-file-1>
  - <env-file-2>
  - <env-file-3>


VARIABLE=VALUE

Примеры.

Указания файлов.

env_file:
  - .env
  - nginx/.env

Сам env файл.

MY_VAR=value
NGINX_VERSION=1.23.1

environment

Наверх

environment — Добавление переменных для среды.

Примеры:

Указания переменных.

environment:
  SHOW: 'true'
  PASSWORD: "PASSWORD"

Указания переменных в другом формате yml.

environment:
  - SHOW=true
  - PASSWORD="password"

volumes

Наверх

volumes — Указание точки монтирования томов внутри образа.

Примеры:

Монтирование по абсолютному пути.

volumes:
  - /opt/data:/var/lib/mysql

Монтирование относительно compose файла.

Так же можно указывать именнованный том.

Сначала требуется создать.
В конце после всех services создаются все нужные volumes.

И дальше в нужном сервисе вставляется нужный volume.

volumes:
  - name_volume:/var/lib/mysql

Все созданые volumes хранятся по пути /var/lib/docker/volumes.

У volume есть параметры, которые монжо конфигурировать его.

name — указание имени volume, с которым он будет создоваться.

external — если стоит true, значит он не будет создавать новый volume,
а будет искать готовый.
Если не указывается параметр name, тогда требуется указать его в external.

Примеры:

Указание имени volume.

volumes:
  mysql_database:
    name: mysql_database

Использовать готовый volume.

volumes:
  mysql_database:
    external:
      name: mysql_database

Использование external вместе с name.

volumes:
  mysql_database:
    external: true
    name: mysql_database

container_name

Наверх

container_name — Собственное имя контейнера, вместо генерации по умолчанию.

container_name: <container-name>

Пример.

сontainer_name: nginx_container

entrypoint

Наверх

entrypoint — Переопределение начального запуска.

entrypoint: <command>

# Так же можно задать списком
entrypoint: ["<command>", "<arg1>", "<arg2>"]

Примеры:

entrypoint: "nginx -g daemon off;"
entrypoint: ["nginx", "-g", "daemon off;"]

command

Наверх

command — Переопределение команды для запуска.

command: "<command>"

# Так же можно задать списком
command: ["<command>", "<arg1>", "<arg2>"]

Примеры:

command: "nginx -g daemon off;"
command: ["nginx", "-g", "daemon off;"]

depends_on

Наверх

depends_on — зависимости запуска и завершения работы между службами.

Примеры:

Служба name_1 зависит от name_2 и name_3,
т.е. будет запускаться после них.

version "3.9"

services:
  name_1:
    depends_on:
      - name_2
      - name_3
  name_2:
    ...
  name_3:
    ...

restart

Наверх

restart — Политика перезапуска контейнера.

Существуют 4 варианта:

  • no — не перезапускает контейнер (по умолчанию).
  • always — контейнер будет всегда перезапускается.
  • on-failure — при ошибке будет перезапускаться контейнер.
  • unless-stopped — всегда перезапускается контейнер,
    если контейнер не остановлен (вручную или другим образом).

Примеры:

healthcheck

Наверх

healthcheck — проверка, которая запускается, чтобы определить,
являются ли контейнеры для этой службы работоспособными.

Параметры для healthcheck:

  • interval — через какой период будет запускаться проверка.
  • timeout — если проверка длится больше указанного времени,
    значит контейнер не работоспособен.
  • retries — сколько раз запускается проверка,
    чтобы понять что контейнер не работает.
  • start_period — время для запуска контейнера,
    перед запуском проверок работоспособности.

interval, timeout и start_period имеют специфичный вариант написания.
Поддерживаемые единицы измерения: us, ms, s, m и h.

Примеры написания:

2.5s
10s
1m30s
2h32m
5h34m56s

Пример:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s

extends

Наверх

extends — позволяет использовать общие конфигурации
для разных файлов или даже для разных проектов.
Расширение служб полезно, если есть несколько служб,
повторно использующих общий набор параметров конфигурации.

Шаблон.

extends:
  file: /path/to/file
  service: <service-name>

Примеры:

Использование сервиса из другого файла.

first-service.yml

services:
  webapp:
    build: .
    ports:
      - "8000:8000"

second-service.yml

services:
  web:
    extends:
      file: first-service.yml
      service: webapp

Понравилась статья? Поделить с друзьями:
  • Как исправить корректировочной счет фактуры
  • Как найти время задержки
  • Как найти вписанный угол без данных
  • Как найти вершину графика по формуле
  • Найди панка dop2 как пройти