Альтернативы:

Компоненты docker

КомпонентОписание
Docker host (сервер Docker) компьютер или виртуальный сервер, на котором установлен Docker
Docker daemon (демон Docker/dockerd)центральный системный компонент, который управляет всеми процессами Docker: создание образов, запуск и остановка контейнеров, скачивание образов
Docker client (клиент Docker/CLI) утилита, предоставляющая API к демону Docker.
Docker-compose (менеджер запуска кластера контейнеров)
Docker registry/Docker HUBОтдельный сервис для хранения образов Docker docker login

  • Образ
  • Контейнер
  • Том
  • Сеть
  • Сервисы
КомандаОписание
sudo apt install docker.ioУстановка Docker
docker info Информация о докере

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

Когда вы создаете новый образ Docker, он сначала скачивается с репозитория Docker Hub или другого частного репозитория, а затем запускается в контейнере. Образ Docker можно рассматривать как "шаблон" для создания контейнеров, который обеспечивает единообразие и повторяемость при развертывании приложений.

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

Images (образы) - Схемы нашего приложения, которые являются основой контейнеров. В примере выше мы использовали команду docker pull чтобы скачать образ busybox.

У образа есть имя, это как адрес, откуда забирать докер. Если имени нет, то смотрит локальное хранилище или на DockerHub. Образ обязан иметь тег в текущем реестре.

Слой - (layer) сохранённые изменения образа или промежуточного образа Docker. Каждый слой имеет свой уникальный идентификатор.

КомандаОписание
docker image –help
docker image ls / docker imagesПосмотреть список скачанных образов
docker image ls <id>Посмотреть образ в локальном хранилище с конкретным ID
docker image build <id>Сборка образа
docker image pull <id>Скачать образ из удалённого хранилища
docker image push <id>Отправить образ в удалённое хранилище
docker image rm <id>Удаление образа из удалённого хранилища
docker rmiУдаление ненужного образа
docker rmi –forceУдаление ненужного образ, но это некорректно, т.к. контейнер останется
docker search nginxПоиск образа

docker inspect

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

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

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

КомандаОписание
docker loginЗалогиниться в Hub перед скачиванием
docker pull busyboxСкачать образ busybox из регистра докера и сохраняет локально

Docker container, или контейнер Docker, представляет собой изолированную среду, в которой выполняются приложения. Контейнеры Docker основаны на ядре операционной системы Linux и используют технологию cgroups для контроля над ресурсами и namespace для изоляции процессов.

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

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

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

КомандаОписание
docker container lsСписок запущенных контейнеров и их статус
docker container ls -аСписок всех контейнеров и их статус
docker container create <image>Создать контейнер из образа
docker container start <id>Запуск контейнера
docker container stop <id>Остановка контейнера
docker container rm <id>Удаление контейнера
docker container exec <id>Выполнение команды в контейнере
КомандаОписание
docker run image_nameЗапуск контейнера из образа. По сути это замена команд docker image pull, docker container create, docker container start
docker run hello-world Проверка работы docker
docker ps Команда, которая позволяет нам просматривать запущенные контейнеры
docker ps -a-a помогает увидеть все, когда-либо запущенные контейнеры
docker run busyboxСоздание и запуск контейнера busybox
docker run busybox echo "hello from busybox"
docker run -ti busybox shПодключение интерактивного tty в контейнер и можно запускать команды
docker run –help
docker rm 305297d7a235 ff0a5c3750b9Удаление контейнеров по ID, можно сразу несколько
docker rm 30Удалять можно по первым буквам ID, если вариант один
docker rm vigilУдалять можно по именам. Если имя при создании не указывалось, то будет выбрано случайное.
docker rm $(docker ps -a -q -f status=exited)команда удаляет все контейнеры, у которых статус exited. Флаг -q возвращает только численные ID, а флаг -f фильтрует вывод на основе предоставленных условий.
docker exec -it nginx bash Запуск bash в контейнере nginx, -it интерактивный терминал
docker start|stop|restart nginx запуск, остановка, перезапуск контейнера
docker logs nginx
docker inspect nginx
docker top nginx
docker cp /etc/ssh/sshd_config|- container:dest_pathКопирование файла из локальной системы в контейнер и наоборот
docker stats nginx
docker rm nginx
docker run -d –name nginx -p 80:80 -v /var/www/html:/usr/share/nginx/html nginx -d в режиме сервиса/демона(detached режим, без привязки к терминалу), –name название, -p порты внешний и внутренний, -v прокидываем bind volume, внешняя папка:внутренняя папка, nginx в конце название образа
docker container attach alpine1 Подцепиться к контейнеру alpine1 с помощью терминалом.
docker run -d –name nginx2 –network host nginx:1.24 запуск контейнера nginx:1.24 в сети хоста и её будет видно снаружи
docker container exec -ti wordpress-phpmyadmin-1 bashПодключиться к контейнеру и запустить в нём bash
КомандаОписание
docker pull alpine:3.16Скачать образ ОС alpine 3.16
docker inspect alpine:3.16Просмотреть образ
docker volume create demo_dateСоздать том demo_data
docker volume lsПросмотреть тома
docker network create demo_networkСоздать сеть demo_network
docker network lsПросмотреть сети
docker run -it --rm --name demo1 --hostname=demo1 -v demo_data:/_data --network=demo1_network alpine:3.16

-it-интерактивный режим,
--rm -удаление контейнера после выключения,
--name -имя контейнера,
--hostname -имя машины для внутреннего DNS,
-v demo_data:/_data -монтируем внутренний том demo_data на рут к папке _data
--network=demo1_network -помещаем в сетку demo1_network |

ls /
touch /_data/demo1.txt
docker run -it –name some-guest -hostname=ghost -v demo_data:/_data –network=demo1_network -e NODE_ENV=development -e url=http://localhost:3001 -p3001:2368 ghost
ls /
ls /_data

set

КомандаОписание
docker exec -it tools_php-mysql shПодключимся к контейнеру MySQL
CREATE DATABASE `test`Создадим базу данных
SHOW DATABASES;Посмотрим на все базы данных

Сеть в Docker

  • bridge режим по умолчанию, изоляция NAT (docker0: интерфейс)
    • Есть дефолтная сеть
    • Можно создать свои сети и тогда контейнеры смогут общаться между собой
  • host отсутствие изоляции, полный доступ к хосту
  • overlay - связь между контейнерами на разных хостах
  • ipvlan сеть на уровне IP(L2,802.1q trunk L2,L3)
  • macvlan создание отдельных интерфейсов с MAC адресами (bridge, 802.1q trunk bridge)
  • none отсутствие доступа к сети

Кастомная сеть позволяет общаться контейнерам по внутренним именам, например ping container1

КомандаОписание
docker network lsПосмотреть сети
docker network create mynetСоздать доп.сеть
docker network inspect mynetБольше информации о сети
docker network rm mynetУдалить доп.сеть
docker run -dit –name alpine1 –network alpine-net alpine ash Запуск контейнера в сети alpine-net. При запуске можем указать только одну сеть.
docker network connect bridge alpine4 Закинуть запущенный контейнер в ещё одну сеть.
docker network inspect hostПосмотреть содержимое хостовой сети

Все данные пишутся на временные тома в контейнере, которые не сохраняются после размонтирования контейнера. Этот слой можно сохранить при помощи команды docker commit, как слой для чтения в новом образе. Для сохранения данных есть два механизма

  • Тома
  • Монтирование

Монтирование - подключение каталогов или файлов с хостовой машины к контейнеру. Тома позволяют сохранять данные в постоянном хранилище на хостовой машине в /var/lib/docker/volumes Тома имеют три типа

  • Именованный (named) Создаётся docker volume create …
  • Анонимный(anonymous) Описывается при создании контейнера для хранения временных данных
  • Временный(tmpfs) Создаётся в памяти

КомандаОписание
docker volume --helpПосмотреть помощь по командам томов
docker volume lsПосмотреть список томов
docker volume create storage1Создать том storage1. Появится в /var/lib/docker/volumes/
docker volume rm storage1Удалить storage1

ss -ntlp посмотреть порты, используемые процессом docker

Команде docker run можно передать флаг –rm, тогда контейнер будет автоматически удаляться при завершении. Это очень полезно для разовых запусков и экспериментов с докером.

Том остаётся после удаления контейнера.

  • Логи хранятся вне контейнера
  • Локальное хранение (journald,syslog) или централизованное (gelf,fluentd)
  • docker logs nginx
  • docker logs nginx –follow (аналог tail -f)
  • docker logs –tail 100 nginx
  • docker logs –until 10m nginx
  • docker logs –since 2023-10-20T10:00:00 nginx

Сборка контейнеров

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

Файл Dockerfile состоит из серии инструкций, которые выполняются последовательно. Некоторые из наиболее распространенных инструкций включают

КомандаОписание
FROMиспользуется для указания базового образа.
RUNВыполняет команду в контейнере и фиксирует её, как новый слой.Не забыть сделать очистку временных файлов при выполнении заданной команды
ADD/COPYдля копирования файлов в контейнер. Предпочтительно COPY, т.к. ADD может копировать с внешних ресурсов
EXPOSEдля указания портов, которые должны быть открыты для внешнего доступа
ENV <key=<value>Добавляет при сборке в образ переменную окружения. Как команда export в Linux.
ARG <name>[=<default value>]Добавляет при сборке переменную окружения, которую можно использовать только во время сборки, можно передать docker build –build-arg= <varname>=<value>
USER <user>[:<group>]\USER <UI]>[:<GUID>]Задаёт пользователя в контексте которого будет выполняться последующая сборка и выполнения процессов внутри контейнера. Пользователь по умолчанию root
WORKDIR <path>Рабочий каталог по умолчанию для процессов внутри контейнера при выполнении и процессов при сборке образа
LABEL <key>=<value> добавляет в образ метаданные и помечает образ. Метки никак не влияют на работу контейнеров, они нужны для внешних программ.
VOLUME <path>Создание анонимного тома и подключение его к контейнеру
ENTRYPOINT Строка запуска первого процесса в контейнере, который будет создан на основе этого образа.
CMDдобавляет параметры запуска для ENTRYPOINT.

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

Пример DockerFile.

FROM python:3.7.2-alpine3.8
RUN apk update && apk upgrade
COPY . ./app
RUN ["mkdir", "/a_directory"]
CMD ["python", "./my_script.py"]
 
FROM node:16-alpine
ARG NPM_REGISTRY=https://registry.npmjs.org
RUN npm --registry $NPM_REGISTRY install npm -g
COPY package.json /package.json
RUN npm run build
COPY default_config.toml /dist/config.toml
RUN node /dist/app.js --version
WORKDIR /harvester
ENTRYPOINT ["node"]
CMD ["app.js","--config","config.toml"]
 
# пример COPY
FROM node:16-alpine
COPY package.json /package.json
COPY _common /_common
COPY * /*
 
#Пример ARG
FROM node:16-alpine
ARG NPM_REGISTRY=https://registry.npmjs.org
ARG DEFAULT_VERSION=v16
 
#Пример RUN
FROM node:16-alpine
RUN node--version && \
  npm --version && \
  cd harvester && \
  npm ci && \
  npm audit fix --force && \
  node app.js -v
 
#Пример USER 
FROM node:16-alpine
RUN addgroup -g 1000 node && \
 adduser -u 1000 -G node -s /bin/sh -D node
USER node
 
#Пример WORKDIR
FROM node:16-alpine
COPY app /app
WORKDIR /app
RUN npm ci
 
#Пример LABEL
FROM node:16-alpine
LABEL version=v1.0
LABEL department=frontend
LABEL type=ui
 
#пример VOLUME
FROM node:16-alpine
VOLUME /cache
VOLUME ["/data","/tempf"]
 
#пример ENTRYPOINT/CMD
FROM node:16-alpine
ENTRYPOINT node
CMD ["/apps.js","--config","/config.toml"]
 
 
FROM ubuntu:18.10
COPY test /test
RUN chmod +x test
CMD ./test

Ещё пример DockerFile

FROM ubuntu:22.10
RUN apt update && apt install --yes make build-essential bc bison flex libssl-dev libelf-dev wget
RUN apt install --yes cpio fdisk extlinux dosfstools qemu-system-x86
RUN apt install --yes vim
ARG APP=/app
ARG LINUX_DIR=$APP/linux
ARG FILES_DIR=$APP/files
ARG SCRIPTS_DIR=$APP/scripts
ENV BUILD_DIR=$APP/build
ENV LINUX_DIR=$LINUX_DIR
ENV FILES_DIR=$FILES_DIR
ENV LINUX_VER=5.15.79
ENV BUSYBOX_VER=1.35.0
ENV BASH_ENV="$SCRIPTS_DIR/bash-env/env" 
COPY ./scripts $APP/scripts
COPY ./files $APP/files
RUN mkdir -p $LINUX_DIR
RUN  ln -s $APP/scripts/start-linux.sh /usr/bin/start &&\
     ln -s $APP/scripts/build-linux.sh /usr/bin/build &&\
     ln -s $APP/scripts/build-image.sh /usr/bin/image
WORKDIR $APP/scripts
CMD build

Точка в конце DockerFile. обязательна

КомандаОбъяснение
docker build /.doc –tag printer –tag - имя контейнера
docker buid -f new_Dockerfile -t image_name:v1

Пример Dockerfile

  docker buid -t module4-demo:v1 .
  docker run -it --rm module4-demo:v1
#Плохая практика
RUN node --version
RUN npm --version
RUN cd /harvester
 
#Хорошая практика
RUN node --version && \
    npm --version && \
    cd /harvester
 
  • .dockeringore — файл с шаблонами файлов и папок, которые должны быть исключены при COPY и ADD при сборке контейнера.
  • Сборка должна быть такой, чтобы .dockerignore был не нужен.
  • COPY * /.* — плохая практика.

Compose - Это инструмент для простого определения и запуска многоконтейнерных Докер-приложений. В нем есть файл docker-compose.yml, и с его помощью можно одной командой поднять приложение с набором сервисов. Нужно находиться в директории с файлом docker-compose.yml чтобы запускать большую часть команд Compose.

Недостаток Docker Compose в том, что невозможно объединить несколько серверов в одну среду. Мы ограничены одним сервером и он не является оркестратором.

docker-compose.yml - файл описания проекта. В нём описаны необходимые сервисы, тома, сети, зависимости. Пример docker-compose.yml

version: "2"  # версия формата docker-compose.yml, обязательный ключ

services: # описание разворачиваемых сервисов, обязательная секция
  es:
    image: elasticsearch
  web:
    image: prakhar1989/foodtrucks-web
    command: python app.py
    ports:
      - "5000:5000"
    volumes:
      - .:/code

networks: ... # описание сетей
volumes: .... # описание томов

Все ключи можно посмотреть в документации Документация по ключам docker-compose.xml

Отступы в docker-compose.yaml - это два пробела.

services:
  ffb:     #имя сервиса в проекте
    container_name:"ffb" #Имя контейнера
    hostname:"ffb" # Имя хоста контейнера
    image: "ffb:v1" # Образ
    logging: # Настройка логирования
      driver: "json-file"
      options:
        max-file:"2"
        max-size:"200k"
    networks: # Список сетей
      -"shop" 
    ports:    # Публикуемые порты
      -"443:3000"
КомандаОписание
sudo docker-compose up -dЗапустить контейнеры, описанные в файле docker-compose.yaml
sudo docker-compose psПосмотреть список запущенных контейнеров
docker compose logs название конейнера -f Просмотр логов
sudo docker-compose logs webserver
sudo docker-compose up –force-recreate –no-deps webserver Запуск контейнеров
sudo docker-compose rm -fsv