Докер образы.

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

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

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

Что такое контейнеры?

Ключевые команды докера

Образы — это один из двух основных строительных блоков Docker (второй — «Контейнеры»).
Изображения — это чертежи/шаблоны для контейнеров. Они доступны только для чтения и содержат приложение, а также необходимую среду приложения (операционную систему, среду выполнения, инструменты и т. д.).
Образы не запускаются сами по себе, вместо этого их можно запускать как контейнеры.
Образы либо предварительно созданы (например, официальные образы, которые вы найдете на DockerHub), либо вы создаете свои собственные (как мы увидим позже в этом руководстве) образы, определяя Dockerfile, который содержит инструкции, которые выполняются, когда Образ создается с помощью команды ( docker build . ), затем каждая инструкция создает слой в образе. Слои используются для эффективного перестроения и совместного использования образов.
Инструкция CMD особенная: она выполняется не при построении образа, а при создании и запуске контейнера на основе этого образа.

Объем докера

Контейнеры — еще один ключевой строительный блок Docker.
Контейнеры — это запущенные экземпляры образов. Когда вы создаете контейнер (через docker run ), тонкий слой для чтения и записи добавляется поверх образа.
Таким образом, можно запускать несколько контейнеров на основе одного и того же образа.

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

Тома

Полный список всех команд см.

добавить — помощь после команды — например. docker — help , docker run
— help и т. д.
Также ознакомьтесь с официальной документацией для получения полной и подробной документации ВСЕХ команд и функций: https://docs.docker.com/engine/reference/run /
Важно! Это может быть ошеломляющим! На самом деле вам понадобится лишь часть этих функций и
команд!

сборка докера. : Создайте Dockerfile и создайте собственный образ на основе файла.

  • настройка проекта laravel с докером

Докер Сеть

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

Но даже с контейнерами для чтения и записи во многих приложениях, использующих Docker, возникают две большие проблемы:
1. Данные, записанные в контейнере, не сохраняются: если контейнер останавливается и удаляется, все данные, записанные в контейнере, теряются.
2. Контейнер Контейнер не может взаимодействовать с файловой системой хоста: если вы что-то измените в папке вашего хост-проекта, эти изменения не отразятся на работающем контейнере. Вам нужно пересобрать образ (который копирует папки) и запустить новый контейнер

Проблему 1 можно решить с помощью функции Docker под названием «Тома».

Проблема 2 может быть решена с помощью «Привязать крепления».

docker-compose

Тома — это папки (и файлы), управляемые на вашем хост-компьютере, которые подключены к папкам/файлам внутри контейнера.
Существует два типа томов:
Анонимные тома: создаются с помощью -v /some/path/in/container и автоматически удаляются
при удалении контейнера из-за добавления — rm в команду запуска docker
Именованные тома: создаются с помощью -v some-name:/some/path/in/container и НЕ удаляются автоматически
С помощью томов данные можно передавать в контейнер (если папка на хост-компьютере не пуста), и его можно сохранить при записи контейнером (изменения, сделанные контейнером, отражаются на вашем хост-компьютере).

Тома создаются и управляются Docker — как разработчику вам не обязательно знать, где именно хранятся папки на вашем хост-компьютере. Поскольку данные, хранящиеся там, не предназначены для просмотра или редактирования вами — используйте «Bind Mounts», если вам нужно это сделать! Вместо этого, особенно именованные тома могут помочь вам с сохранением данных.
Поскольку данные записываются не только в контейнер, но и на ваш хост-компьютер, данные сохраняются даже при удалении контейнера (поскольку именованный том не удаляется). в таком случае). Следовательно,
вы можете использовать именованные тома для сохранения данных контейнера (например, файлов журналов, загруженных файлов, файлов базы данных и т. д.).

Анонимные тома могут быть полезны для обеспечения того, чтобы некоторые внутренние папки контейнера не были перезаписаны, например, при «привязке монтирования».
По умолчанию анонимные тома удаляются, если контейнер был запущен с — вариант rm и после этого был остановлен. Они не удаляются, если контейнер был запущен (а затем удален) без этой опции.
Именованные тома никогда не удаляются, вам нужно сделать это вручную (через docker volume rm

Привязка монтирования
Привязка монтирования очень похожа на тома — ключевое отличие состоит в том, что вы, разработчик, устанавливаете путь на своем хост-компьютере, который должен быть подключен. к некоторому пути внутри контейнера.
Вы делаете это- v/absolute/path/on/your/host/machine:/some/path/inside/of/container .
Путь перед : (т. е. путь на хост-компьютере к папке, которая должна использоваться совместно с контейнером) должен быть абсолютным путем при использовании -v в команде запуска docker.
Привязать монтирование очень полезны для обмена данными с контейнером, которые могут измениться во время работы контейнера, например. исходный код, которым вы хотите поделиться с контейнером, работающим в вашей среде разработки.
Не используйте Bind Mounts, если вы просто хотите сохранить данные — для этого следует использовать именованные тома (исключение: вы хотите иметь возможность проверять данные, записанные во время разработки).
В общем, Bind Mounts — отличный инструмент во время разработки — они не предназначены для использования в рабочей среде (поскольку ваш контейнер должен работать изолированно от хост-компьютера).
> Ключевые команды Docker
docker run -v /path/in/container IMAGE :

Создайте анонимный том внутри контейнера
docker run -v some-name:/path/in/container IMAGE :

Создайте именованный том (с именем some-name) внутри контейнера
docker run -v /path/on/your/host/machine:path/in/container IMAGE: создайте Bind Mount и подключите локальный путь к вашему хост-компьютер по некоторому пути в контейнере docker volume ls: Список всех активных/сохраненных в настоящее время томов (по всем контейнерам)
docker volume создает VOL_NAME : создает новый (именованный) том с именем VOL_NAME . Обычно вам
этого делать не нужно, поскольку Docker создает их автоматически, если они
не существуют при запуске контейнера
docker volume rm VOL_NAME : удалить том по его имени. (или ID)
docker volume prune: удаление всех неиспользуемых томов (т. е. не подключенных к текущему
работающему или остановленному контейнеру)

Подсобные контейнеры

Что такое докер и как он может ускорить процесс разработки вашей команды

Варианты использования докера

Что такое докер?

t NAME:TAG : присвойте NAME и TAG образу
docker run IMAGE_NAME : создайте и запустите новый контейнер на основе образа IMAGENAME (или
используйте идентификатор образа)
— name NAME : Назначьте ИМЯ контейнеру. Имя можно использовать для остановки и
удаления и т. д.
-d : Запустить контейнер в отсоединенном режиме — т. е. вывод, напечатанный контейнером,
не виден, командная строка/терминал НЕ дождаться остановки контейнера
-it : запустить контейнер в «интерактивном» режиме — после этого контейнер/приложение
готовы получать ввод через командную строку/терминал. Вы можете остановить контейнер
с помощью CTRL + C при использовании флага -it
— rm : автоматически удалить контейнер, когда он остановлен
docker ps : вывести список всех запущенных контейнеров
-a : Список всех контейнеров, включая остановленные
docker images : Список всех локально сохраненных образов
docker rm CONTAINER : Удаление контейнера с именем CONTAINER (вы также можете использовать
идентификатор контейнера)
docker rmi IMAGE: удалить образ по имени/идентификатору
docker container prune: удалить все остановленные контейнеры
docker image prune: удалить все висячие образы (непомеченные образы)
-a: удалить все локально сохраненные образы
docker push IMAGE : отправить образ в DockerHub (или другой реестр) — имя образа/тег
должны включать имя/URL репозитория
docker pull IMAGE : извлечь (загрузить) образ из DockerHub (или другого реестра) — это
делается автоматически, если вы просто запускаете docker IMAGE, а образ перед этим не подтягивался

Настройка проекта сервера nodejs с докером

  • Во многих приложениях вам понадобится более одного контейнера по двум основным причинам:
    1. Считается хорошей практикой сосредоточить каждый контейнер на одной основной задаче (например, запустить веб-
    сервер, запустить базу данных, …)
    2. Очень сложно настроить контейнер, который выполняет более одной «основной задачи» (например, запускает
    веб-сервер И базу данных).
    Многоконтейнерные приложения вполне распространено, особенно если вы работаете над «настоящими приложениями».
    Часто некоторым из этих контейнеров необходимо обмениваться данными:
    либо друг с другом
    , либо с хост-компьютером
    или со всемирной паутиной
    Связь со всемирной паутиной (WWW)
    Связь с WWW (т. е. отправка HTTP-запроса или других видов запросов на другие
    серверы) к счастью, очень проста.
    Рассмотрим этот пример JavaScript — хотя он будет работать всегда, независимо от того, какую технологию
    вы используете:
    fetch('«https://some-api.com/my-data ').then(...)»
    Этот очень простой фрагмент кода пытается отправить GET-запрос на some-api.com/my-data .
    Это будет работать из коробки, без дополнительных требуется настройка! Приложение, работающее в
    контейнере, не будет иметь проблем с отправкой этого запроса.
    Связь с хост-компьютером
    Связь с хост-машиной (например, если у вас есть база данных, работающая на хосте< br /> Машина) тоже довольно просто, хотя и не работает без каких-либо изменений.
    Одно важное замечание: если вы разворачиваете Контейнер на сервер (т.е. другую машину), очень маловероятно,
    что вам нужно будет связаться с этой машиной. Связь с хост-компьютером обычно является
    требованием во время разработки — например, потому что вы запускаете некоторую базу данных для разработки
    на своем компьютере.
    Опять же, рассмотрим этот пример JS:
    fetch ('localhost:3000/demo').then(…)Этот фрагмент кода пытается отправить запрос GET на некоторый веб-сервер, работающий на локальном хосте
    (т. е. за пределами контейнера, но не в WWW).< br /> На вашей локальной машине это сработает — внутри контейнера это не сработает. Поскольку localhost
    внутри контейнера относится к среде контейнера, а не к вашему локальному хост-компьютеру
    , на котором работает контейнер / Docker!
    Но Docker поможет вам!
    Вы просто нужно изменить этот фрагмент следующим образом:
    fetch('host.docker.internal:3000/demo').then(…)
    host.docker.internal — это специальный адрес/идентификатор, который транслируется на IP-адрес
    машины, на которой размещен Контейнер от Docker.
    Важно: «Переведено» не означает, что Docker идет вперед и изменяет исходный код. Вместо этого
    он просто обнаруживает исходящий запрос и может разрешить IP-адрес для этого запроса.
    Связь с другими контейнерами
    Связь с другими контейнерами также довольно проста. У вас есть два основных варианта:
    1. Вручную узнать IP-адрес другого контейнера (хотя он может измениться)
    2. Использовать Docker Networks и поместить взаимодействующие контейнеры в одну и ту же сеть.
    Вариант Вариант 1 не очень хорош, так как вам нужно искать IP-адрес самостоятельно, и он может измениться с течением
    времени.
    Однако вариант 2 идеален. С помощью Docker вы можете создавать сети через docker network create
    SOME_NAME, а затем вы можете подключить несколько контейнеров к одной и той же сети.
    Вот так:
    docker run -network my-network — name cont1 my-image
    docker run -network my-network — name cont2 my-other-image
    Cont1 и cont2 будут находиться в одной и той же сети.
    Теперь вы можете просто использовать контейнер имена, чтобы они могли общаться друг с другом — опять же,
    Docker разрешит вам IP-адрес (см. выше).
    fetch('cont1/my-data').then(…)
  • Docker Compose – это дополнительный инструмент, предлагаемый экосистемой Docker, который помогает
    в оркестровке и управлении несколькими контейнерами. Его также можно использовать для отдельных контейнеров, чтобы
    упростить сборку и запуск.
    Почему?
    Рассмотрим следующий пример:
    docker network create shop
    docker build -t shop- node .
    docker run -v logs:/app/logs — сетевой магазин — имя shope-web shop-node
    docker build -t shop-database
    docker run -v data:/data /db — network shop — name shop-db shop-database
    Это очень простой (придуманный) пример — но вам нужно выполнить и запомнить довольно много команд,
    чтобы вызвать все контейнеры. требуется этому приложению.
    И вы должны запускать (большинство) эти команды всякий раз, когда вы что-то меняете в своем коде или
    вам нужно снова вызвать свои контейнеры по какой-то другой причине.
    С Docker Compose, это становится намного проще.
    Вы можете поместить конфигурацию своего контейнера в файл docker-compose.yaml, а затем использовать всего одну
    команду, чтобы вызвать всю среду: docker-compose up .
    Файлы Docker Compose
    Файл docker-compose.yaml выглядит следующим образом:
    версия: «3.8» # версия используемой спецификации Docker Compose
    services: # «Services» в конце концов, это Контейнеры, которые нужны вашему приложению
    web:
    build: # Определите путь к вашему Dockerfile для образа этого контейнера
    context: .
    dockerfile: Dockerfile- web
    volumes: # Определить необходимые тома / привязать монтирования
    - logs:/app/logs
    db:build:
    context: ./db
    dockerfile: Dockerfile -web
    volumes:
    - data:/data/db
    Вы можете удобно отредактировать этот файл в любое время, и у вас есть короткая и простая команда,
    которую вы можете использовать для поднимите свои Контейнеры:
    docker-compose up
    Вы можете найти полный (возможно, пугающий — вам понадобится только небольшой набор доступных опций
    ) список конфигураций здесь: « https://docs.docker.com/compose/compose-file/»
    Важно помнить: при использовании Docker Compose вы автоматически получаете сеть
    для всех ваших контейнеров, поэтому вам Вам не нужно добавлять свою собственную сеть, если только вам не нужно несколько
    сетей!
    Ключевые команды Docker Compose
    Есть две ключевые команды:
    docker-compose up : запустить все упомянутые контейнеры/службы. в файле Docker Compose
    -d : Запустить в автономном режиме
    — build : Заставить Docker Compose переоценить/пересобрать все образы (в противном случае он
    делает это, только если образ отсутствует )
    docker-compose down : остановить и удалить все контейнеры/сервисы
    -v : удалить все тома, используемые для контейнеров — в противном случае они останутся, даже если
    контейнеры будут удалены
    Конечно, есть еще команды. Вы увидите больше команд в других разделах курса (например,
    в разделах «Утилиты-контейнеры» и «Демонстрация Laravel»), но вы, конечно, уже можете погрузиться
    в официальный справочник команд: «https:/ /docs.docker.com/compose/refere»Том Docker«nce/»