Альтернативы:
Компонент | Описание |
---|---|
Docker host (сервер Docker) | компьютер или виртуальный сервер, на котором установлен Docker |
Docker daemon (демон Docker/dockerd) | центральный системный компонент, который управляет всеми процессами Docker: создание образов, запуск и остановка контейнеров, скачивание образов |
Docker client (клиент Docker/CLI) | утилита, предоставляющая API к демону Docker. |
Docker-compose (менеджер запуска кластера контейнеров) | |
Docker registry/Docker HUB | Отдельный сервис для хранения образов Docker docker login |
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; | Посмотрим на все базы данных |
Кастомная сеть позволяет общаться контейнерам по внутренним именам, например 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 Тома имеют три типа
Команда | Описание |
---|---|
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, тогда контейнер будет автоматически удаляться при завершении. Это очень полезно для разовых запусков и экспериментов с докером.
Том остаётся после удаления контейнера.
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
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 |