про Docker
Для меня при изучении новой технологии всегда самое сложное это не синтаксис, не наборы команд, а понимание идеологии. Синтаксис всегда можно заучить или знать где подсмотреть, а вот понять «суть» удается не всегда.
И такая история у меня с докером. Не первый раз уже выделяю время, чтобы ознакомиться с технологией и понять ее, но пока удается плохо.
Кто подскажет?
— я правильно понимаю, что образ это набор слоев? И в основании КАЖДОГО образа должна идти операционная система? Ведь какое программное обеспечение мы не запускаем, оно прежде всего работает в ОС. Реальный пример. Пишу скрипт на пайтоне, одна строка — hello world. Создаю докер файл, чтобы потом по нему собрать контейнер моего супер приложения. Указываю что за основу взять образ python из докерхаба. Собираю свой образ. Вижу что он весит почти гигабайт. Значит хоть я и не указывал этого буквально, но взяв образ python я обязательно получил и все другие слои, вплоть до ОС?
— в докер файле указываю команду copy и настраиваю какую локальную директорию с кодом куда поместить внутри контейнера. Я правильно понимаю, что это означает что внутри контейнера всегда своя файловая система, не имеющая ничего общего с локальной? Да я понимаю, что можно примонтировать директорию, подключить volume но я не об этом. Тоесть при запуске любого контейнера в нем поднимается полноценный линукс со свойственной ему файловой системой и директориями?
— а как правильно быть, если приложению нужны например и python и php и ruby. Ведь если я получу все эти три образа с докерхаба, то каждый их них будет содержать кучу слоев и каждый будет запускаться в своей собственной операционной системе? Я правильно понимаю? Наверняка излагаю непонятно. Ну к примеру (только пока не касаемся докер композ, ведь он появился не сразу, насколько я знаю и изначально докером пользовались без него) мне нужно запустить веб приложение. Я получаю в докере образ nginx. Мне нужно чтобы часть скриптов обрабатывалась php5.6 а часть — php7.4. Я получаю еще два образа. Запускаю три этих образа и получаю три контейнера и в итоге получаю три совершенно изолированные операционные системы? У каждой внутри своя файловая система? Как им общаться то, ведь например в настройках сервера nginx нужно указать путь к сокету php-fpm а это возможно только если они работают в рамках одной операционной системы.
— и если мое предположение верно, что первым слоем у каждого образа должна идти операционная система, то как это работает для винды? К примеру мне нужен образ dot.net который работает на виндовс сервере. Но если убунта у нас бесплатна и может быть в любом образе, то как быть с платной операционной системой windows?
— образ докера это файл? Он может быть перенесен с сервера на сервер методом копирования и из него создать контейнер? или только через сервисы докерхаба, сначала пушить на докер хаб а потом забирать с докерхаба?
И такая история у меня с докером. Не первый раз уже выделяю время, чтобы ознакомиться с технологией и понять ее, но пока удается плохо.
Кто подскажет?
— я правильно понимаю, что образ это набор слоев? И в основании КАЖДОГО образа должна идти операционная система? Ведь какое программное обеспечение мы не запускаем, оно прежде всего работает в ОС. Реальный пример. Пишу скрипт на пайтоне, одна строка — hello world. Создаю докер файл, чтобы потом по нему собрать контейнер моего супер приложения. Указываю что за основу взять образ python из докерхаба. Собираю свой образ. Вижу что он весит почти гигабайт. Значит хоть я и не указывал этого буквально, но взяв образ python я обязательно получил и все другие слои, вплоть до ОС?
— в докер файле указываю команду copy и настраиваю какую локальную директорию с кодом куда поместить внутри контейнера. Я правильно понимаю, что это означает что внутри контейнера всегда своя файловая система, не имеющая ничего общего с локальной? Да я понимаю, что можно примонтировать директорию, подключить volume но я не об этом. Тоесть при запуске любого контейнера в нем поднимается полноценный линукс со свойственной ему файловой системой и директориями?
— а как правильно быть, если приложению нужны например и python и php и ruby. Ведь если я получу все эти три образа с докерхаба, то каждый их них будет содержать кучу слоев и каждый будет запускаться в своей собственной операционной системе? Я правильно понимаю? Наверняка излагаю непонятно. Ну к примеру (только пока не касаемся докер композ, ведь он появился не сразу, насколько я знаю и изначально докером пользовались без него) мне нужно запустить веб приложение. Я получаю в докере образ nginx. Мне нужно чтобы часть скриптов обрабатывалась php5.6 а часть — php7.4. Я получаю еще два образа. Запускаю три этих образа и получаю три контейнера и в итоге получаю три совершенно изолированные операционные системы? У каждой внутри своя файловая система? Как им общаться то, ведь например в настройках сервера nginx нужно указать путь к сокету php-fpm а это возможно только если они работают в рамках одной операционной системы.
— и если мое предположение верно, что первым слоем у каждого образа должна идти операционная система, то как это работает для винды? К примеру мне нужен образ dot.net который работает на виндовс сервере. Но если убунта у нас бесплатна и может быть в любом образе, то как быть с платной операционной системой windows?
— образ докера это файл? Он может быть перенесен с сервера на сервер методом копирования и из него создать контейнер? или только через сервисы докерхаба, сначала пушить на докер хаб а потом забирать с докерхаба?
Комментарии: 11
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Как можно знать, какие модули в нем установлены? Когда php работает не в контейнере, я в терминале своей ubuntu выполняю php -m и вижу список. А как получить доступ к терминалу контейнера в котором работает php?
Fi1osofЗдесь все необходимое для запуска MODX-3 (ну, просто он там в зависимостях, но можно и другие добавить в app/www).
Сам по себе докер (именно как один отдельно взятый контейнер) не очень интересно. Интересна возможность именно создания нескольких контейнеров, и чтобы они между собой взаимодействовали. Здесь у нас php-fpm, nginx, mysql, PhpMyAdmin и сам MODX. Но MODX пока не удалось запустить на полном автомате (мне лень было это копать без особой мотивации). Тем не менее, контейнер под него подготовлен, в том числе и устанавливается composer github.com/MODX-Club/docker-lnmp/blob/master/php-fpm/Dockerfile#L36
Только клонировать проект надо с субмодулями
git clone --recursive github.com/MODX-Club/docker-lnmp docker-modx
cd docker-modx
После этого проверяем, директория должна быть не пустой app/www/modx3
И вот чего не автоматизировал — это создание modx3/core/packages/core.transport.zip
По идее его должна быть возможность как-то билдить через CLI, но я с наскока не нашел. Если найдете, то в связке с общей установкой MODX через CLI можно полностью автоматизировать установку и запуск.
docs.modx.com/3.x/en/getting-started/installation/cli
Пока же приходится качать этот пакет с оффсайта и закидывать туда, иначе установка не может быть завершена.
Запуск
Копируем .env
copy .sample.env .env
Может затем отредактировать его и установить рет-пароль для мускула.
Для надежности сначала запускаем mysql и pma
docker-compose up -d --build mysql pma
Затем php-fpm
docker-compose up -d --build php-fpm
После запуска надо собрать MODX (я забыл это прописать в Dockerfile).
Заходим в контейнер php-fpm
docker exec -it modx-docker_php-fpm_1 bash (имя контейнера может отличаться, ищем актуальное docker ps или docker-compose ps).
Заходим в папку modx3 и выполняем
composer install
Ну и в конце nginx
Только хост подправить при необходимости: github.com/MODX-Club/docker-lnmp/blob/master/nginx/conf.d/modx3.local.conf
docker-compose up -d --build nginx
После запуска идет modx3.local/setup и устанавливаем.
Скажем так, я не сталкиваюсь с docker в своей повседневной работе и изучаю его, как и многие другие технологии в жалкое свободное время. И возникает такой эффект, что ты вроде разобрался с чем-то новым, но потом полгода ты ни разу не сталкивался, не применял и в итоге смотришь как баран на новые ворота)
Fi1osofВот по работе пример: ко мне обратился давний клиент, надо было на сайтемелочь поправить. Мне соответственно надо было развернуть сайт локально, внести изменения, их закоммитить и вылить в прод. Но прикол в том, что там сайт на php-5 крутится, и мускул тоже пятый, а локально у меня сильно более старшие версии и на них не запустилось. Что, переустанавливать ПО на локальной машине? Нет. Лучше вот так в докерах запустить и все. И если пересесть надо на другой проект, где совсем другие версии ПО используются, просто этот проект останавливаешь, другой запускаешь и все.
А вот относительно свежий пример из жизни, где докер сильно помог: помогаю товарищу с одним проектом. В итоге у меня все запускается, а у него нет. freecode.academy/topics/kak-debazhit-api-zaprosy-apollo
Посмотрели все основные моменты, ни в какую не запускается у него. В итоге я упаковал в докер и он хоть и не сразу освоил его, но за день запустился и все работает. Вот здесь обсуждение в задаче: freecode.academy/tasks/ckn290mjjnzp20730bgh37d8s
Fi1osofFi1osofВот на заметку проект интересный: shellops.io/
Ребята из Ирана делают GUI для управления серверами с докерами. Контейнеры создавать, мониторить и т.п. Скорее всего взлетят (сейчас они в Эстонию релокейнулись).
Но вообще, они юзают вот эту либу: github.com/apocas/docker-modem
Старая, но развивающаяся. На JS написана, управление контейнерами и т.п. Мы там еще просили за docker-compose, и чел написал совсем новую либу: github.com/apocas/dockerode-compose
Это очень перспективное направление. Можно будет не только свой codesandbox запустить, но и небольшой хостинг :)
На винде даже предзагрузка на PHP7.4 не работает. Так что, как ты сказал, must have!