Краш-курс на docker: научитесь плавать с большой рыбой

5 ответов

Лучший ответ

Чтение с: страницы тома докеров

Итак, простой docker-compose (внутри папки с именем nginx):

Выдаст все файлы в системе хоста через:

Затем вы можете просмотреть файлы на хосте :

И, наконец, использовать его из ./ config :

4

Tyhal
17 Дек 2019 в 08:07

Ну, вы не должны делать отображение так, как вы это делаете, потому что, как вы сказали, это уродливо. Самый удобный и удобный способ сделать это так:

Местоположение / etc / nginx также содержит другие файлы (например, mime.types и fastcgi_params), которые не будут существовать, если вы сопоставите каталог хоста ./ config , если только Конечно, вместо этого вы копируете их на хост, но это не очень хорошее решение.

Выше я просто сопоставил локальный файл nginx.conf, расположенный в папке / nginx / myapp, с /etx/nginx/nginx.conf, а локальную папку с включенными сайтами — в папку / etc / nginx / sites-enabled в контейнере.

Вам было бы лучше, если бы все было как можно проще, потому что докер уже сложен по своей природе.

Skeptic
11 Дек 2019 в 10:06

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

В качестве ссылки вы должны посмотреть на уже отвеченный вопрос, который выглядел примерно так же, как ваш: https://stackoverflow.com/a/53930043/12485228

Я надеюсь, что это помогает.

aru_sha4
10 Дек 2019 в 11:43

Не совсем возможно. Тома Docker монтируются в контейнер. Не работает наоборот. Возможная альтернатива здесь: https://stackoverflow.com/a/41914917/5586914

-1

Herz3h
16 Дек 2019 в 20:33

Как правило, это невозможно, поскольку контейнеры представляют собой просто «запускаемые изображения» и хранятся в виде пакета zip-файлов в fs. При запуске события они помещаются в «папку», где ядро Linux выполняет и запускает процессы с использованием этого корня.

ДОПОЛНИТЕЛЬНО вы можете в конце процесса отобразить некоторые пути от хост-системы к некоторым путям в , но не обратно. Когда Docker выполняет сопоставление, это путь полностью, поэтому все существующие файлы в пути будут «скрыты» от образа fs и «заменены» отображенным путем к хосту.

Я думаю, что вы хотите взглянуть на «конфигурацию файлов по умолчанию» для пути в изображении. Есть два пути с моей точки зрения:

  • Запустите контейнер с сопоставленным путем к другому каталогу, и, когда ваш контейнер запустится, просто скопируйте необходимое содержимое папки с помощью оболочки контейнера в сопоставленную папку. Пример: давайте сопоставим с хоста, и когда контейнер запустится, перейдем в работающий контейнер с помощью и запустим что-то вроде .
  • экспортировать всю файловую систему изображений с помощью https://docs.docker.com/engine/reference / commandline / export / и взгляните на интересную конфигурацию изображения и так далее.

Оба способа работают, обычно я делаю первый, если мне нужны какие-либо папки с изображения.

Удачи!

Alexandr Shurigin
10 Дек 2019 в 12:09

Что такое супервизор и зачем он нужен?

Супервизор для меня решает две задачи:

  • возможность в один клик поставить какой-то дополнительный аддон
  • возможность в один клик обновить Home Assistant

Супервизор HA это отдельный докер контейнер, который управляет другими контейнерами.
Если на моем компьютере с HA выполнить команду «docker ps -a», то появится список
запущенных контейнеров:

Тут видно:

  • сам супервизор
  • Home Assistant
  • аддон в котором работает mqtt сервер mosquitto
  • аддон в котором работает zigbee2mqtt

Но кроме этих понятных для меня штук еще и работают вещи которые я совершенно не
понимаю зачем нужны:
* audio — зачем? у меня к этому компьютеру не подключены колонки, никакое аудио я на нем не играю
* dns — а это зачем? почему не использовать данные о dns с хост машины

Я вполне могу запустить руками и сервер mosquitto и zigbee2mqtt.
Мне не ясно зачем тащить все вот это которое делает непонятно что.

Есть и другая вещь, почему я рад отказаться от супервизора.
Я тут недавно узнал что супервизор обновляется сам. Они
выпустили версию с багом (тред про баг,
а потом сами раскатили исправление.

В случае системы автоматизации я считаю что это неприемлемое поведение.
Они сами заявляют local first, а тут что-то автоматом без моего
ведома приезжает из облака. В случае HA я хочу контролировать
что приходит с обновлениями и иметь возможность это не поставить
если мне это не нравится.

Так что, все обдумав я решил перестать использовать супервизор
докера, а запускать все самостоятельно.

Запуск контейнера Docker

Запущенный ранее hello-world представляет собой пример контейнера, который открывается и закрывается после отображения тестового сообщения. При этом контейнеры предназначены для выполнения более полезных задач. Они имеют много общего с виртуальными машинами, однако требуют намного меньше ресурсов для работы.
Можно рассмотреть, как запустить контейнер при помощи последней версии образа Ubuntu. Добавление опций -i и -t предоставляет доступ в интерактивном режиме к командному процессору:

docker run -it ubuntu

Командная строка изменится, указывая на переход в контейнер, и будет выглядеть таким образом:

Следует обратить внимание, что также отображается идентификатор контейнера. Здесь это 2c88170e5391

Он понадобится позже, чтобы сообщить клиенту, какой именно удалить контейнер.

После этого можно запустить любую команду в контейнере. К примеру, можно обновить базу данных пакетов. Для этого нет необходимости пользоваться командой sudo, поскольку работа ведется от имени пользователя с root-правами:

apt update

Затем появится возможность установки приложений. Рассмотрим пример установки Node.js:

apt install nodejs

Эта команда выполнит установку Node.js в контейнер, используя репозиторий Ubuntu. По завершении установки можно проверить, была ли она успешно выполнена:

node -v

Будет показан номер текущей версии Node.js:

Проведенные изменения в контейнере распространяются только на него. Завершить работу с контейнером можно командой exit.

Работа с командой Docker без прав суперпользователя

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

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

sudo usermod -aG docker ${USER}

Чтобы применить изменения, потребуется выйти с заново войти на сервер. Можно также воспользоваться этой командой:

su - ${USER}

Продолжить работу можно будет после ввода пароля пользователя. Проверить, что добавление пользователя прошло успешно, можно командой (пользователь sammy):

id -nG

При желании добавить выбранного пользователя в группу, можно указать его имя:

sudo usermod -aG docker username

Последующие шаги предполагают, что пользователь уже добавил себя в группу docker. Если нет желания это делать, перед командами необходимо набирать sudo.

Возможные проблемы

Рассмотрим некоторые проблемы, которые могут возникнуть в процессе настройки.

1. Errors during downloading metadata for repository ‘AppStream’

Ошибка возникает при попытке собрать имидж на Linux CentOS 8. Полный текст ошибки может быть такой:

Errors during downloading metadata for repository ‘AppStream’:
  — Curl error (6): Couldn’t resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=container
Error: Failed to download metadata for repo ‘AppStream’: Cannot prepare internal mirrorlist: Curl error (6): Couldn’t resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=container

Причина: система внутри контейнера не может разрешить dns-имена в IP-адрес.

Решение: в CentOS 8 запросы DNS могут блокироваться брандмауэром, когда в качестве серверной части (backend) стоит nftables. Переключение на iptables решает проблему. Открываем файл:

vi /etc/firewalld/firewalld.conf

Находим строку:

FirewallBackend=nftables

… и меняем ее на:

FirewallBackend=iptables

Перезапускаем сервис firewalld:

systemctl restart firewalld

Начинаем установку

1. Устанавливаем git, чтоб он был доступен из командной строки. Процесс описывать не буду, это легко гуглится.

2. Устанавливаем сам Docker desktop for mac/windows https://docs.docker.com/docker-for-mac/install/https://docs.docker.com/docker-for-windows/install/

Затруднений при установке возникнуть не должно, делать все как описано в инструкции по этим ссылкам.
Главное чтоб у вас установился Docker desktop, чтобы его иконка отображалась в строке состояния со статусом: is running

В процессе установки на своё усмотрение выделяете необходимое кол-во ядер, памяти и места на женском диске.
Для windows не забудьте в настройках указать раздел жесткого диска.

3. Проверяете установился ли Докер. Когда вы установили сам клиент docker — открываете командную строку и вводите:

После выполнения команды должна отобразиться версия докера.

Если все хорошо на этом шаге — то, отлично, переходим дальше!

4. Теперь мы выберем сборку контейнеров для докера и создадим папку, в которой все это будет храниться.

Вообще можно собрать конечно самому сборку и я вначале так и пытался сделать, однако столкнулся с множеством проблем, чтением мануалов. Что привело меня к поиску уже готовой сборки для веб сервера. И я такую нашел: https://github.com/sprintcube/docker-compose-lamp

В нее входят следующие компоненты:

  • PHP (вы сами можете выбрать нужную вам 1 из 6 версий. начиная с 5.4 до 7.4)
  • Apache
  • MySQL
  • phpMyAdmin
  • Redis

Теперь нужно создать папку куда мы ее скачаем. У меня это — /Users/your_name/Documents/docker/lamp

lamp — это название сборки (в первую очередь для меня, чтобы не забыть)

5. Далее читаем Installation https://github.com/sprintcube/docker-compose-lamp
переходим в папку и выкачиваем файлы с репозитория:

6. Команда docker-compose up -d

Это команда обращается к пакетному менеджеру docker, скачивает и устанавливает (если еще не установлены) все компоненты которые описаны в docker-compose.yml — собирает их вместе и запускает контейнеры.

В файле docker-compose.yml — вы увидите какие именно это пакеты и как они прописаны. Обязательно откройте этот файл и ознакомьтесь с содержимым!

Первый раз процесс скачивания и установки может быть немного длительным, и в результате в командной строе должно отобразиться:

Поздравляю! Теперь можете заходить на localhost и отобразиться страничка, которая расположена по адресу /Users/your_name/Documents/docker/lamp/www/index.php

Разумеется, вы ее меняете, закачиваете в папку свой проект и наслаждаешь дальнейшей разработкой!

Подключение к базе из веб-сервера

По отдельности, наши серверы готовы к работе. Теперь настроим их таким образом, чтобы из веб-сервера можно было подключиться к СУБД.

Зайдем в контейнер с базой данных:

docker exec -it maria_db /bin/bash

Подключимся к mariadb:

:/# mysql -p

Создадим базу данных, если таковой еще нет:

> CREATE DATABASE docker_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

* в данном примере мы создаем базу docker_db.

Создаем пользователя для доступа к нашей базе данных:

> GRANT ALL PRIVILEGES ON docker_db.* TO ‘docker_db_user’@’%’ IDENTIFIED BY ‘docker_db_password’;

* и так, мы дали полные права на базу docker_db пользователю docker_db_user, который может подключаться от любого хоста (%). Пароль для данного пользователя — docker_db_password.

Отключаемся от СУБД:

> quit

Выходим из контейнера:

:/# exit

Теперь перезапустим наши контейнеры с новым параметром, который будет объединять наши контейнеры по внутренней сети.

Останавливаем работающие контейнеры и удаляем их:

docker stop maria_db web_server

docker rm maria_db web_server

Создаем docker-сеть:

docker network create net1

* мы создали сеть net1.

Создаем новые контейнеры из наших образов и добавляем опцию —net, которая указывает, какую сеть будет использовать контейнер:

docker run —name maria_db —net net1 -d -v mariadb:/var/lib/mysql mariadb

docker run —name web_server —net net1 -d -p 80:80 dmosk/webapp:v1

* указав опцию —net, наши контейнеры начинают видеть друг друга по своим именам, которые мы задаем опцией —name.

Готово. Для проверки соединения с базой данных в php мы можем использовать такой скрипт:

<?php
ini_set(«display_startup_errors», 1);
ini_set(«display_errors», 1);
ini_set(«html_errors», 1);
ini_set(«log_errors», 1);
error_reporting(E_ERROR | E_PARSE | E_WARNING);
$con = mysqli_connect(‘maria_db’, ‘docker_db_user’, ‘docker_db_password’, ‘docker_db’);
?>

* в данном примере мы подключаемся к базе docker_db на сервере maria_db с использованием учетной записи docker_db_user и паролем docker_db_password.

После его запуска, мы увидим либо пустой вывод (если подключение выполнено успешно), либо ошибку.

Дополнение. Добавляем еще неограниченное кол-во хостов с проектами

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

1. нужно добавить строчки в /etc/hosts на вашей машине mac (или windows — c:\windows\system32\drivers\etc\hosts), чтоб ваша операционная система понимала по какому адресу обращаться при запросе вашего хоста.

нажимаем ctrl + o, ctrl+x (перезаписываем и сохраняем файл)

2. добавляем в файл конфига /Users/your_name/Documents/docker/lamp/config/vhosts/default.conf
следующие строчки, он будет синхронизирован с контейнером Докер.

3. Чтобы наши изменения вступили в силу — перезапускаем контейнеры:

Мой опыт

Лет 5 назад я начал пользовался vagrant + puphpet, и это было достаточно удобное решение, но столкнувшись однажды с проблемой обновления версии php, а также с проблемой медленной синхронизации файлов mac — я решил перейти на docker. Также его использую когда нужно запустить проект на windows. Но на windows он оказался куда капризней.

Надо сказать, что я сразу не смог разобраться и настроить docker — было несколько этапов взятия. Поэтому я для себя нашел оптимальное решение, с чем и хочу поделиться.

И то я очень много в нем не знаю, docker это очень обширная тема, и разбираться в нем и изучать его можно очень долго.

Как работать с образами Docker

Запуск контейнеров выполняется из образов. Изначально Docker берет образы в хабах Docker Hub (реестр образов, поддерживаемый разработчиком). Любой имеет возможность создавать и загружать собственные образы. Так что для большей части дистрибутивов и программ уже имеются необходимые образы в Docker Hub.

Приведенная ниже команда позволяет проверить, есть ли возможность получить доступ и скачивать образы в Docker Hub (на примере образа hello-world):

docker run hello-world

Этот вывод данных указывает, что Docker работает правильно:

Сначала сервис не мог найти образ hello-world на локальной машине, из-за чего ему приходилось загрузить образ в хабе (репозитории по умолчанию). После его скачивания Docker создал отдельный контейнер из образа и уже затем запускал в нем программу контейнере.

Представленные в хабе образы можно найти при помощи команд docker и search. К примеру, найти образ Ubuntu можно следующим образом:

docker search ubuntu

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

Строчка OK в столбце OFFICIAL говорит о том, что образ создан и его поддержка осуществляется компанией, ответственной за этот проект. Выбрав требуемый образ, его можно скачать на компьютер, используя подкоманду pull.

Загрузка официального образа Ubuntu на компьютер выполняется такой командой:

docker pull ubuntu

По завершении операции отобразится такой результат:
Когда образ будет скачан, станет возможным выполнить запуск контейнера из образа при помощи команды run. На примере hello-world видно, что если после ввода run образ не был скачан, сначала клиент загрузит его и уже запустит контейнер с образом.

Чтобы посмотреть, какие образы были загружены на компьютер, используется команда:

docker images

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

Запуск стека приложений

Теперь, когда у вас есть файл , его можно запустить.

  1. Сначала убедитесь, что никакие другие копии приложения и базы данных не запущены ( и ).

  2. Запустите стек приложений с помощью команды . Добавьте флаг , чтобы выполнить все в фоновом режиме. Либо можно щелкнуть правой кнопкой мыши файл Compose и выбрать параметр Compose Up (запустить Compose) на боковой панели VS Code.

    После запуска должны отобразиться примерно следующие выходные данные.

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

  3. Просмотрите журналы с помощью команды . Отобразятся журналы каждой из служб, которые чередуются в одном потоке. Это чрезвычайно полезно, когда необходимо отслеживать проблемы, связанные с временем. Флаг дает команду «следовать за журналом», поэтому выходные данные будут выдаваться в режиме реального времени по мере их создания.

    Если вы еще этого не сделали, вы увидите следующий результат.

    Имя службы отображается в начале строки (часто в цвете), чтобы облегчить различение сообщений. Если вы хотите просмотреть журналы для определенной службы, можно добавить имя службы в конец команды logs (например, ).

    Dica

    Ожидание базы данных перед запуском приложения. При запуске приложения оно фактически ожидает, пока MySQL будет готов к работе, прежде чем попытаться подключиться к нему. В Docker отсутствует встроенная поддержка, позволяющая ожидать, пока другой контейнер будет полностью готов, запущен и подготовится к запуску другого контейнера. Для проектов на основе узлов можно использовать зависимость wait-port. Аналогичные проекты существуют для других языков и платформ.

  4. На этом этапе вы сможете открыть приложение и увидеть, что оно запускается. И постойте! Вы сделали это с помощью одной команды!

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

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

Отправка образов в репозиторий начинается с авторизации на Docker Hub.

docker login -u docker-registry-username

Чтобы вход был успешно осуществлен, потребуется ввести пароль Docker Hub. Если он правильный, авторизация пройдет успешно.

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

docker tag admin/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

После чего можно приступать к загрузке образа на сервер:

docker push docker-registry-username/docker-image-name

Что касается разбираемого примера ubuntu-nodejs, для отправки его в реестр sammy следует ввести эту команду:

docker push admin/ubuntu-nodejs

Загрузка образа может занять время. Когда образ будет находиться в репозитории, его название появится в списке, открываемом в панели управления вашего аккаунта.
В таком случае необходимо снова попытаться сделать вход с использованием docker login и загрузить образ. Наконец, остается проверить, что он был добавлен успешно. Затем можно набрать в терминале docker pull admin/ubuntu-nodejs, чтобы воспользоваться образом на новой машине и пользоваться им при создании новых контейнеров.

NGINX + PHP + PHP-FPM

Рекомендуется каждый микросервис помещать в свой отдельный контейнер, но мы (для отдельного примера) веб-сервер с интерпретатором PHP поместим в один и тот же имидж, на основе которого будут создаваться контейнеры.

Создание образа

Создадим каталог, в котором будут находиться файлы для сборки образа веб-сервера:

mkdir -p /opt/docker/web-server

Переходим в созданный каталог:

cd /opt/docker/web-server/

Создаем докер-файл:

vi Dockerfile

  1. FROM centos:8
  2. MAINTAINER Dmitriy Mosk <[email protected]>
  3. ENV TZ=Europe/Moscow
  4. RUN dnf update -y
  5. RUN dnf install -y nginx php php-fpm php-mysqli
  6. RUN dnf clean all
  7. RUN echo «daemon off;» >> /etc/nginx/nginx.conf
  8. RUN mkdir /run/php-fpm
  9. COPY ./html/ /usr/share/nginx/html/
  10. CMD php-fpm -D ; nginx
  11. EXPOSE 80

* где:
1) указываем, какой берем базовый образ. В нашем случае, CentOS 8.
3) задаем для информации того, кто создал образ. Указываем свое имя и адрес электронной почты.
5) создаем переменную окружения TZ с указанием временной зоны (в нашем примере, московское время).
7) запускаем обновление системы.
8) устанавливаем пакеты: веб-сервер nginx, интерпретатор php, сервис php-fpm для обработки скриптов, модуль php-mysqli для работы php с СУБД MySQL/MariaDB.
9) удаляем скачанные пакеты и временные файлы, образовавшиеся во время установки.
10) добавляем в конфигурационный файл nginx строку daemon off, которая запретит веб-серверу автоматически запуститься в качестве демона.
11) создаем каталог /run/php-fpm — без него не сможет запуститься php-fpm.
13) копируем содержимое каталога html, который находится в том же каталоге, что и dockerfile, в каталог /usr/share/nginx/html/ внутри контейнера. В данной папке должен быть наше веб-приложение.
15) запускаем php-fpm и nginx. Команда CMD в dockerfile может быть только одна.
17) открываем порт 80 для работы веб-сервера.

В рабочем каталоге создаем папку html:

mkdir html

… а в ней — файл index.php: 

vi html/index.php

<?php
phpinfo();
?>

* мы создали скрипт, который будет выводить информацию о php в браузере для примера. По идее, в данную папку мы должны положить сайт (веб-приложение).

Создаем первый билд для нашего образа:

docker build -t dmosk/webapp:v1 .

Новый образ должен появиться в системе:

docker images

При желании, его можно отправить на Docker Hub следующими командами:

docker login —username dmosk

docker tag dmosk/webapp:v1 dmosk/web:nginx_php7

docker push dmosk/web:nginx_php7

* первой командой мы прошли аутентификацию на портале докер-хаба (в качестве id/login мы используем dmosk — это учетная запись, которую мы зарегистрировали в Docker Hub). Вторая команда создает тег для нашего образа, где dmosk — учетная запись на dockerhub; web — имя репозитория; nginx_php7 — сам тег. Последняя команда заливает образ в репозиторий.
* подробнее про докера.

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

Запускаем веб-сервер из созданного образа:

docker run —name web_server -d -p 80:80 dmosk/webapp:v1

Открываем браузер и переходим по адресу http://<IP-адрес сервера с docker> — откроется страница phpinfo:

Наш веб-сервер из Docker работает.

Как работало раньше

Home Assistant можно установить несколькими разными способами.
Самый простой способ — это скачать официальный образ специальной
операционной системы в котором уже правильным способом существует HA.
Этот образ ставится на хост и Home Assistant работает.
Это способ никуда и не делся. Анонс про deprecated никак не
влияет на этот способ установки — этот способ все еще
официально поддерживается.

Плюс этого способа — он очень простой. Скачивается образ, заливается
на носитель — компьютер загружается — все, Home Assistant работает.

Но у этого способа есть недостаток: очень ограниченная возможность
делать что-то свое на операционной системе из этого образа.

Поэтому я использовал другой вариант установки:

  • сам ставлю нужную мне операционную систему
  • устанавливаю докер в это систему
  • запускаю скрипт, который устанавливает набор докер контейнеров в которых живет HA

Вот ровно этот скрипт установки и объявили deprecated.

Почему я ставил HA не в виде официального образа, на собственноручно
установленную операционную систему? Во-первых, мне так удобнее.
Эту операционную систему я понимаю, ту которую тащит с собой HA — я не понимаю.
Удобно зайти, что-то там посмотреть-сделать.
Кроме Home Assistant у меня на этой операционной системе еще и крутятся мои
скрипты, с помощью которых у меня настроен удаленный доступ к HA (я делаю
проброску ssh туннелей, подробнее о том как это настроено тут).

Home Assistant заработает на том что за деньги предоставляют удаленный доступ к инсталляции HA.
Забавно что в моем случае то что задеприкейтили как раз используется для того
чтобы не платить им деньги, а сделать удаленный доступ другим способом.

Почему docker?

Можно конечно же установить на саму операционную систему необходимые компоненты, например — php, mysql, nginx/apache. Однако, это не совсем правильно, ввиду того, что среда разработки должна соответствовать среде исполнения вашего приложения. На хостинге это как правило linux, — поэтому и среда разработки должна быть тоже linux.

Докер уже набрал огромную популярность, почти в любой вакансии разработчика и не важно какого указано требование — уметь пользоваться докером.
Докер применяется как для разработки, так и для продакшена. Есть множество хостингов для ваших докер контейнеров: https://geekflare.com/docker-hosting-platforms/
Не важно какая у вас ОС (windows, mac, linux) — установите Докер, сделайте сборку контейнеров и получите рабочее окружение.
Создавайте под каждый свой проект — уникальное окружение со специфическими конфигурациями, легко делитесь этим окружением с другими разработчиками и им не нужно будет муторно настраивать под каждый проект уникальное окружение.. Исходя из всего вышеперечисленного вот почему я остановился на докер и почему рекомендую обязательно его рассмотреть при разработке

Исходя из всего вышеперечисленного вот почему я остановился на докер и почему рекомендую обязательно его рассмотреть при разработке.

Синтаксис и опции docker run

Синтаксис команды docker run похож на синтаксис других команд Linux и выглядит следующим образом:

$ docker run опции образ команда

Утилите обязательно надо передать образ, на основе которого будет создан контейнер. Образ может быть локальным или указывать на образ, который надо загрузить из сети. Мы рассмотрим это в примерах ниже. Опции позволяют настроить контейнер и параметры его запуска более детально. Сама команда позволяет переопределить программу, которая выполняется после запуска контейнера. Например, выполнив /bin/bash, вы можете подключится к самому контейнеру.

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

  • -d — запускает контейнер в фоновом режиме;
  • -t — прикрепляет к контейнеру псевдо-TTY-консоль;
  • -i — выводит в терминал STDIN поток контейнера;
  • —name — имя контейнера, по которому потом можно будет к нему обращаться;
  • —dns — устанавливает DNS-серверы для контейнера;
  • —network — тип сети для контейнера, может принимать такие значения: bridge (используется по умолчанию), none, host. Также можно передать идентификатор сети Docker, к которой надо подключится;
  • —add-host — добавляет строчку в /etc/hosts;
  • —restart — указывает, когда надо перезапускать контейнер. Возможные значения: no, on-failure, always, unless-stopped;
  • —rm — удаляет контейнер после завершения его работы;
  • -m, —memory — количество оперативной памяти, доступное Docker-контейнеру;
  • —memory-swap — объём памяти раздела подкачки, доступный в контейнере;
  • —cpus — количество ядер процессора, доступных в контейнере;
  • —shm-size — размер файла /dev/shm;
  • —device — позволяет монтировать устройства из папки /dev в контейнер;
  • —entrypoint — позволяет переопределить скрипт, который выполняется при запуске контейнера, перед запуском основной команды;
  • —expose — позволяет пробросить несколько портов из контейнера в хост-систему;
  • -P — пробрасывает все порты контейнера в хост-систему;
  • -p — переносит все порты контейнера в хост-систему без смены номера порта;
  • —link — позволяет настроить связь контейнеров Docker;
  • -e — добавляет переменную окружения в контейнер;
  • -v, —volume — позволяет монтировать папки хоста в контейнер;
  • -w — изменяет рабочую директорию контейнера.

Это основные опции, которые мы будем использовать в этой статье, а теперь давайте рассмотрим на примерах, как создать контейнер Docker в Linux.

Как все будет работать в итоге

  • Мы установим следующую сборку: PHP (5.4 — 7.4), Apache, MySQL, phpMyAdmin. Сможем зайти из браузера на localhost и запустить ваш проект (или просто в данном случае index.php)
  • Будет папка, в которой хранится ваш проект. Т.е. используете ваш любимый IDE для разработки. Со всеми файлами вы работаете из своей родной ОС (mac/windows).
  • Докер сделает виртуальный контейнер, в котором запустит необходимую сборку (в нашем случае lamp) и все файлы будут синхронизированы
  • Доступны конфиги php.ini, apache, дампы mysql, которые загружаются в виртуальный контейнер docker
  • при желании c помощью командной строки можно зайти на виртуальный сервер (контейнер) и сделать при желании там все необходимое (подправить конфиг, запустить команду и тд).
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: