В этой инструкии, не будет описания по установке docker — всю эту информацию можно найти на официальном сайте, только базовые понятия и основные команды.
Docker контейнеры создаются на основе docker images.
Для создания собственных docker images необходимо:
- В dockerfile прописать, все необходимые команды на основе которых будет создавать image(образ).
- После чего ввести команду: docker build
- Для запуска контейнера на основе образа: 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