Docker — краткая справка по основам и базовым командам

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

Docker контейнеры создаются на основе docker images.
Для создания собственных docker images необходимо:

  1.  В dockerfile прописать, все необходимые команды на основе которых будет создавать image(образ).
  2. После чего ввести команду: docker build
  3. Для запуска контейнера на основе образа: docker run

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

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

docker build — создает свой общественный docker образ.

  • -t -название нашего образа
  • . — путь с которого мы будет собирать наш образ, .(точка) говорит о том что образ будет собирается из текущей директории.

Итоговая команда: docker build -t my-supper-image .

НО при выполнении данной команды необходимо, что бы в директории выполнения (текущей) был Docker файл.
т.е. файл без расширения с названием Dockerfile в котором будут описаны все инструкции по созданию образа.

Пример dockerfile

Для данного примеры мы заранее создали python приложение app.py
В котором расположен обычный скрипт print(«hello world») и теперь мы хотим упаковать наше приложение в образ.

Итак пример dockerfile’a:

# FROM указывает на базовый образ с которого мы начинаем сборку
FROM python:3.6

# RUN выполняет определенную комаду
RUN mkdir -p /usr/src/app/

# Переходим в нужный каталог, и выполнение команд начинается с текущего каталога
WORKDIR /usr/src/app/

# COPY принимает 2 параметра откуда и куда копировать.
# В данном случае .(точка) с текущей дирректории на нашей машине в нужную папку контейнера
COPY . /usr/src/app/

# CMD - команад которая говорит, что нужно сделать после запуска контейнера.
CMD ["python", "app.py"]

Докер файл готов, выполняем: docker build -t my-supper-image .
После этого у нас создастся новый образ.

Далее если выполнить команду: docker images
Мы увидим, что у нас появился наш новый образ: my-supper-image и скаченный образ python, т.к. его мы использовали при сборке.

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

docker run my-supper-image — Запускает образ в контейнере, после run передаем имя приложения.

Важно понимать, что в таком случае контейнер работает до тех пор пока работает приложение.
В нашем случае, запуститься python и наш скрипт app.py который выполнить print(), после чего работа контейнер будет остановлена.

Если вывести все контейнеры:
docker ps -a
Мы увидим таблицу, где в графе name нашему контейнеру присвоилось имя blablabla_lala.
Если мы хотим задать собственное имя для контейнера, то при запуске нужно указать, директиву —name:
docker run —name my-new-name my-supper-image

Если после этого выполнить команду:
docker ps -a

В таблице в поле name мы увидим:
blablabla_lala — имя контейнера запущенного в 1-ый раз
my-new-name — имя контейнера запущенного с директивой name
т.е. по факту мы уже имеем уже 2 контейнера на основании 1-го образа.

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

Для запуска контейнера в фоновом режиме(в режиме демона), необходима в параметрах запуска указать флаг -d:
docker run —name my-name -d my-supper-image

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

docker rm — удалит выбранный контейнер, принимает или имя контейнера или его ID
docker rm blablabla_lala

Как удалить 50-100-200 контейнеров за раз

Флаг -q в команде docker ps — возвращает только ID контейнеров.
Соответсвенно на вход команде docker rm мы можем передать команду ps -a -q
docker rm $(docker ps -a -q)

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

docker stop имя_контейнера(или id)

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

Как запустить контейнер, что бы после принудительной остановки(stop), либо после того как он отработает,
он автоматически удалился. Для этого в параметры запуска необходимо передать флаг —rm

docker run —name my-name -d —rm my-supper-image

Пример упаковки приложения

Упаковка приложения на flask в контейнер.
Подразумеваем, что мы создали небольшое приложение на flask и разместили его код, в файле app.py.
Далее мы создали файл с зависимостями requirements.txt
Соответсвенно в dockerfile необходимо прописать команду для установки всех зависимостей из requirements.txt в образ

Созлаем dockerfile:

FROM python:3.6

RUN mkdir -p /usr/src/app/

WORKDIR /usr/src/app/
    
COPY . /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "app.py"]

Соберем образ из текущего каталога:
docker build -t web-hello

Запустим образ с упакованным flask приложением в контейнере:
docker run —rm —name web web-hello

Проброска портов

При выполнении этой команды, мы не сможем достучаться до web приложения т.к. не проброшены порты.
По умолчанию flask запускается на порту 8080.
По этому в dockerfile добавим команду:
EXPOSE 8080
которая говорит о том, что при запуске контейнера, у нас есть возможность(разрешение) пробросить порт 8080.

Запускаем контейнер еще раз с флагом —p
который принимает 2 параметра:
1-ый порт на нашей машине
2-ой порт в самом контейнере

docker run —rm —name web —p 8080:8080 web-hello

Docker volume и обмен данными с контейнером

Как прикрутить(обмениваться) данными с контейнером.

Способ №1 — монтирование папки к контейнеру.

Для этого необходимо запустить контейнер с флагом -v
-v принимает 2 параметра:
1 — абсолютный путь к папке на локальном компьютере
2 — абсолютный путь в докер контейнере

docker run —rm —name web -p 8080:8080 -v /User/vova/temp:/usr/src/app/temp web-hello

Соответсвеноо в папке на локальном компьютере мы можем создать файл, условно readmy.txt
содержимое файла будет выводится flask-ом на страницу, соответсвенно при изменении файла
в этом случае фласк будет выводить разный текст.

Способ №2 Docker Volume

По своей сути Volume — эта таже папкка но уже с доп надстройками.
т.е. мы создаем docker volume и его присоединяем к контейнеру.

Для того что бы посмотреть какие volum-ы доступны, необходимо выполнить команду :

docker volume ls

Создание Volume

Для создания volume используется команда create имя_volume

docker volume create web

Запуск DOCKER с подключенным VOLUME

Для запуска контейнера с подключенным VOLUME необходимо добавить флаг:
-v имя_созданного_volume:абсолютный_путь

docker run —rm —name web -p 8080:8080 -v web:/usr/src/app/temp web-hello

Теперь после запуска вся информация из папки /usr/src/app/temp будет храниться в volume
Соответственно при остановке контейнера с информацией ничего не случиться т.к. она хранится в volume
это, актуально для баз данных или для файловых серверов. В дальнейшем мы даже можем привязать этот volume к
другому контейнеру

Как удалить image

Выполняем команду:
docker images — получаем весь список images

Удаление:
docker rmi имя_images

Docker compose

Doocker compose — это надстрока над docker .
Если требуется запустить несколько контейнеров, причем например каждый из контейнеров должен запускаться со своими параметрами, например:

  • 1-ый контейнер пробрасывает порт 1234, подключает вольюим X
  • 2-ой контейнер пробрасывает порт 4567, подключает volume Y
  • и.т.д

Так вот, что бы каждый раз не писать docker run с кучей параметров, все это можно прописать в специальном файле который будет запускать все контейнеры с нужными параметрами.

Создаем файл: docker-compose.yaml

Запуск всех контейнеров через docker compose:
docker-compose up -d