Как говорил я ранее, у многих тех кто перешел с Windows на Linux появляется проблема с созданием локального веб сервера для веб разработок. Первое что приходит на ум, это просто установить Xampp или Apache прямо в систему. Но такой подход почти верен, если вы не заботитесь о чистоте системы и не боитесь каких либо сбоев, а так же если вебсервер вам нужен "временно" для небольших доработок тестирования итд.
Один из вариантов выхода из положения я описывал ранее, на базе создания виртуальной машины как вебсервер. Но сейчас рассмотрим другой способ, на базе Docker , что по сравнительному тестированию в работе, оказалось немного шустрей и немного удобней.
Так как инструкцию пишу больше для себя, чтобы не забыть (так как один раз настроил и забывается) то некоторые моменты могу упустить, поэтому пишите, если что пропустил. Начнем !!!
1 . Устанавливаем Docker . Обычно в любом линуукс дистрибутиве можно установить прямо из менеджера приложений, типа синаптик, но я использую Linux Mint и там менеджер программ в котором вводим в поиск Docker и устанавливаем приложение Docker.io
2 . После успешной установки, открываем терминал и проверим работоспособность. Для этого в терминале пишем команду docker run hello-world и если пошел процесс скачивания и запуск образа со всякими инструкциями типа Hello from Docker то все хорошо.
А вот если получили ошибку типа docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:
то или делаем по инструкции https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user или можно просто поменять права командой sudo chmod 666 /var/run/docker.sock хотя говорят это не лучшая практика и нужно делать хотя бы так sudo chown $USER /var/run/docker.sock где $USER имя пользователя.
3. Устанавливаем образ Debian . Наш веб сервер будет работать на базе дебиана, поэтому вводим команду docker run debian:latest и ждем скачивания. Проверить что все скачалось и у нас есть образы, можно командой docker images
4. Запускаем образ. Но перед запуском, создадим директорию для удобного копирования. Например в директории home/и_имя_пользвателя , создадим папку temp в итоге у меня получилося путь /home/roman/temp и этот путь будем использовать в команде запуска.
docker run -idt --name debin -p 8080:80 -v /home/roman/temp:/home/temp debian /bin/bash
где debin - это новое название контейнера, а /home/temp это директория в контейнере образа, ну и debian это соответственно название образа которое мы скачали. После запуска, у нас появится запущенный контейнер с названием debin с пробросанными портами и залинкованными директориями с основной машины в контейнер докера.
Кстати, чтобы проверить что контейнер запустился, нужно ввести команду docker ps и мы увидим информацию по запущенным контейнерам
5. Подключаемся к контейнеру. Для этого вводим команду docker exec -it debin bash и тут мы попадаем уже в терминал системы на debian !!! Не путайте с терминалом основной системы. Тут даже в теминале видим смену пользователя на типа root@fe50be8f4b57:/#
Т.е теперь мы внутри системы на Debian и можем делать все что угодно.
6. Устанавливаем нужные программы. Я обычно сразу устанавливаю файловый менеджер Midnight Commander чтобы было проще лазить по директориям и редактировать файлы. Для этого вводим сначала sudo apt update и после обновления вводим apt install mc а на вопросы скачивания конечно отвечаем Yes . После установки, проверяем вводом команды запуска mc . Мы установили и запустили файловый менеджер, Ура.
7. Скачивание xampp . Для этого на основном машине открываем сайт https://www.apachefriends.org/ и там скачиваем нужную версию, в моем случаи самую последнюю на главной странице XAMPP for Linux (для другой версии, например php7 нужно перейти по ссылке https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/ ) . После скачивания, копируем файл в нашу созданную директорию temp созданную в 4-м пункте. И вот теперь если перейдем обратно в терминал, (где мы запустили на предыдущем шаге файловый менеджер), и перейдем в директорию /opt то мы увидим наш файл... ура. Тут можно выйти из mc нажатием F10 или мышкой внизу по кнопке.
8. Установка Xampp. Тут тоже все просто. Сначало разрешаем права на выполнение для скаченного файла, который лежит у нас в компе по пути /home/roman/temp . Для этого правой кнопкой мыши заходим в свойство файла и на вкладке Права устанавливаем флаг для запуска файла. После этого переходим в контейнер и там через MC просто запускаем файл нажатием через Enter
Если это не ваш вариант, то можно это сделать и в терминале контейнера. Переходим в директорию командой cd home/temp и там сначало меняем права на файл, командой chmod +x xampp-linux-x64-8.2.4-0-installer.run чтобы сделать его запускаемым , а потом запускаем сам файл командой ./xampp-linux-x64-8.2.4-0-installer.run . (чтобы не вбивать название полностью, можно набрать xampp а потом нажать Tab)
После запуска, отвечаем на все Yes и ждем окончания установки.
Кстати, все тоже самое можно сделать через файловый менеджер mc , который мы установили, для этого в менеджере встаем курсором на файле и в верхнем меню выбираем File - далее пункт Chmod и в окне ставим галку Execute и после этого можно запустить файл нажатием Enter
9. Запускаем веб сервер командой /opt/lampp/lampp start
Кстати, будет ругаться на netstat . Установим его командой apt install net-tools
Вместо start работают и другие команды типа stop restart status
В итоге сервер запустится и в терминале увидим успешный ответ типа XAMPP: Starting Apache…ok. и XAMPP: Starting MySQL…ok.
Теперь можно в браузере набрать http://localhost:8080/ (или 127.0.0.1:8080) и мы попадем на страницу вебсервера. УРА!! Если вам этого достаточно, то можно работать с директорией /opt/lampp/htdocs/ ведь там все расположено.
Если что то не так !!! Например есть ошибка Apache server XAMPP responds "Another web server is already running" это значит в процессе проб и ошибок появился зависший процесс на 80 порту. Для этого найдем кто висит командой netstat -nap | grep :80 и в ответе мы увидим номер процессе типа 18237/httpd и убьем его командой kill 18237
10. Донастраиваем вебсервер. Мы уже видим что все работает, но обычно нужен доступ к управлению MySQL и если с главной страницы сервера попробовать открыть phpmyadmin то получим сообщение о том что согласно безопасности нельзя из вне подключаться, но нам это и нужно. Поэтому даем доступ так. Через файловый менеджер mc находим Файл конфига по пути /opt/lampp/etc/extra/httpd-xampp.conf редактируем строку Require local на Require all granted . Сохраняем. перезапускаем xampp.
11. Права на директории итд. Остается разобраться с правами. Для начала редактируе конфиг апаче, чтобы он работал от нужного пользователя. Идем в /opt/lampp/etc/httpd.conf и редактируем его, нажатием F4 и далее находим строку с текстом User daemon и Group daemon и заменим на www-data и www-data соответственно. Нажимаем F2 для сохранения. Потом F10 чтобы выйти.
Далее через mc создаем папку www в директории /opt/lampp/htdocs/ и устанавливаем права на запись группы (в пункте chmod крыжики Group ..) . Теперь если мы создадим простейший php файл который захочет создать там файл, то он с этим справится.
12. Сохраняем изменения. Нужно для того, что если мы создадим новый контейнер через run то конечно потеряем изменения, а создавать мы будем так как запустим с новыми параметрами. Для этого откроем новый терминал (т.е на основной машине, чтобы не быть в докере) и вводим команду docker commit c3f279d17e0a debi-xampp где циферки это id контейнера, который мы подсмотрели командой docker ps . Для проверки что у нас создан новый образ, смотрим командой docker images
Кстати, запущенный контейнер уже не нужен, поэтому можно удалить командой docker kill debin где debin название контейнера которое мы придумали в начале или можно его id как написано выше. На заметку, id можно писать не полностью, а только несколько уникальных символов, например c3f
13. Запускаем новый образ и контейнер. Вообще запуск нового контейнера это основное и если часто запускаете, то можете написать пару скриптов (об этом если что потом).
Сначало нам нужно создать новый контейнер с пробросом портов, на подобие того как делали в начале, но только теперь для удобства, укажем другие директории линковки.
docker run -idt --name debi7 -p 8080:80 -v /home/roman/mysite/www:/opt/lampp/htdocs/www -v /home/roman/mysite/mysql:/opt/lampp/var/mysql debi-xampp /bin/bash
Обратите внимание на линкуемые директории, у меня их две пары и их те котоые на компе, лучше создать самостоятельно, чтобы не встали права root с докера (или потом удалить и создать заново). Сделано для того, чтобы и сайт и файлы БД лежали на моем компе, а не хранились в контейнере. (Я предварительно сохранил директорию opt/lampp/var/mysql ) Это удобно и для редактирования и для хранения на всякий случай.
Как писал ранее, контейнер мы создали и теперь нужно запустить его и в нем запустить xampp для этого вводим команду docker exec -it debi7 bash где debi7 название контейнера введенного в команде выше. После попадания в консоль контейнера, мы запускаем сервер xampp как описано выше.
14. Но и этого для комфортной работы не достаточно. Дело в том, что когда сервер создает файлы, то он создает от пользователя www-data , а когда мы на компе в общей приленкованнй директории создаем файл, он создается от пользователя roman . В итоге получается чехарда. Чтобы устранить это как то, нужно подменить uid пользователя.
Для этого открываем на своей машине файл etc/passwd и смотрим uid у пользователя. В моем случаи это 1000. Далее идем уже в контейнер и тоже открываем там такой же файл и находим там пользователя www-data и ставим ему uid 1000 . Перезапускаем xampp и теперь видим, что создаваемые файы открыты для редактирования от пользователя.
15. Запуск и остановка. Для остановки контейнера вручную пишем команду docker stop debi7 а для повторного запуска его docker start debi7 и для запуска xampp пишем docker exec -it debi opt/lampp/lampp start
А чтобы не вбивать это все вручную, я создал два скрипта типа start.sh и stop.sh
Код для старта такой
docker start debi && echo SUCCESS || echo FAIL
docker exec -it debi opt/lampp/lampp start && echo SUCCESS || echo FAIL
$SHELL
Код для остановки
#!/bin/bash
docker stop debi && echo STOP SUCCESS || echo FAIL
$SHELL
Это позволяет спокойно запускать контейнер и останавливать его без необходимости лазить по терминалам.
Возможно как то это еще можно оптимизировать и где то скорей всего напутал, но я делаю так и работает все стабильно.
Хоть и написано много, но это кажется, просто нужно один раз вникнуть и все получится. Удачи.