про Docker

Для меня при изучении новой технологии всегда самое сложное это не синтаксис, не наборы команд, а понимание идеологии. Синтаксис всегда можно заучить или знать где подсмотреть, а вот понять «суть» удается не всегда.
И такая история у меня с докером. Не первый раз уже выделяю время, чтобы ознакомиться с технологией и понять ее, но пока удается плохо.
Кто подскажет?
— я правильно понимаю, что образ это набор слоев? И в основании КАЖДОГО образа должна идти операционная система? Ведь какое программное обеспечение мы не запускаем, оно прежде всего работает в ОС. Реальный пример. Пишу скрипт на пайтоне, одна строка — hello world. Создаю докер файл, чтобы потом по нему собрать контейнер моего супер приложения. Указываю что за основу взять образ python из докерхаба. Собираю свой образ. Вижу что он весит почти гигабайт. Значит хоть я и не указывал этого буквально, но взяв образ python я обязательно получил и все другие слои, вплоть до ОС?
— в докер файле указываю команду copy и настраиваю какую локальную директорию с кодом куда поместить внутри контейнера. Я правильно понимаю, что это означает что внутри контейнера всегда своя файловая система, не имеющая ничего общего с локальной? Да я понимаю, что можно примонтировать директорию, подключить volume но я не об этом. Тоесть при запуске любого контейнера в нем поднимается полноценный линукс со свойственной ему файловой системой и директориями?
— а как правильно быть, если приложению нужны например и python и php и ruby. Ведь если я получу все эти три образа с докерхаба, то каждый их них будет содержать кучу слоев и каждый будет запускаться в своей собственной операционной системе? Я правильно понимаю? Наверняка излагаю непонятно. Ну к примеру (только пока не касаемся докер композ, ведь он появился не сразу, насколько я знаю и изначально докером пользовались без него) мне нужно запустить веб приложение. Я получаю в докере образ nginx. Мне нужно чтобы часть скриптов обрабатывалась php5.6 а часть — php7.4. Я получаю еще два образа. Запускаю три этих образа и получаю три контейнера и в итоге получаю три совершенно изолированные операционные системы? У каждой внутри своя файловая система? Как им общаться то, ведь например в настройках сервера nginx нужно указать путь к сокету php-fpm а это возможно только если они работают в рамках одной операционной системы.
— и если мое предположение верно, что первым слоем у каждого образа должна идти операционная система, то как это работает для винды? К примеру мне нужен образ dot.net который работает на виндовс сервере. Но если убунта у нас бесплатна и может быть в любом образе, то как быть с платной операционной системой windows?
— образ докера это файл? Он может быть перенесен с сервера на сервер методом копирования и из него создать контейнер? или только через сервисы докерхаба, сначала пушить на докер хаб а потом забирать с докерхаба?
Александр Мельник
18 октября 2020, 01:08
modx.pro
851
0

Комментарии: 11

Александр Мельник
18 октября 2020, 09:50
0
или вот еще. Есть официальный образ от докера PHP.
Как можно знать, какие модули в нем установлены? Когда php работает не в контейнере, я в терминале своей ubuntu выполняю php -m и вижу список. А как получить доступ к терминалу контейнера в котором работает php?
    Александр Мельник
    18 октября 2020, 10:14
    0
    или еще — как при использовании контейнеров организовать на сервере несколько доменов? Постараюсь пояснить в чем вижу проблему. Когда веб сервер установлен классически и работает в операционной системе как процесс, он считывает свои конфиурационные файлы и видит, что если пришел запрос на такой-то домен, но нужно использовать одну директорию с сайтом, если на другой домен — другую. Но предположим я хочу так же иметь два сайта на сервере, с разными доменами, но чтобы каждый работал как отдельный контейнер. В одном контейнере своя ubuntu, nginx, php-fpm и прочее и во втором — свои. Контейнеры смотрят наружу только своими сетевыми интерфейсами, тоесть обратиться к ним можно только через порт, но никак не через урл. К примеру мы запустим один nginx на порту 8080, второй на 8081 и даже при запуске контейнера пробросим их наружу. Тогда в браузере по localhost:8080 будет один сайт а по localhost:8081 другой. Но мы же не можем заставлять пользователей указывать порты. И получается что до двуз сайтов не достучаться, единственный выход на сервере держать еше один прокси сервер, тот же nginx который будет проксировать запросы по конкретному домену на конкретный порт. Тоесть один nginx будет передавать запрос другому nginx внутрь контейнера. Ужас какой-то. Или я чего-то не понимаю?
      Александр Мельник
      18 октября 2020, 11:54
      0
      все больше влюбляюсь в редактор VSCode. Обнаружил, что он умеет подключаться к работающему контейнеру как через терминал, так и через сам редактор. Теперь мои сомнения рассеялись, я вижу что любой контейнер содержит в себе внутри полноценный линукс. Был создан образ на базе самого легковесного образа из докерхаб для node и все равно внутри контейнера разворачивается своя операционная система.

        Fi1osof
        12 апреля 2021, 09:25
        2
        +2
        Александр, если докером еще интересуетесь, можно с этим поиграться: github.com/MODX-Club/docker-lnmp
        Здесь все необходимое для запуска 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 и устанавливаем.
          Александр Мельник
          12 апреля 2021, 17:05
          0
          Спасибо за такой развернутый ответ. Ознакомлюсь.
          Скажем так, я не сталкиваюсь с docker в своей повседневной работе и изучаю его, как и многие другие технологии в жалкое свободное время. И возникает такой эффект, что ты вроде разобрался с чем-то новым, но потом полгода ты ни разу не сталкивался, не применял и в итоге смотришь как баран на новые ворота)
            Fi1osof
            12 апреля 2021, 18:34
            +3
            И возникает такой эффект, что ты вроде разобрался с чем-то новым, но потом полгода ты ни разу не сталкивался, не применял и в итоге смотришь как баран на новые ворота)
            Все так. Но docker — маст хэв. Это ведь не просто самостоятельная технология для какой-то конкретной задачи, это сейчас как фундамент. Освоить его — не много времени на самом деле. И команд там надо знать всего-лишь несколько. Но он потом помогает и новые технологии осваиватиь быстрее, и в работе тоже. Ведь когда что-то новое хочется пощупать, а оно требует для себя установку какого-то ПО, гораздо проще скачать и запустить готовый контейнер, чем скачивать и настраивать все самому.

            Вот по работе пример: ко мне обратился давний клиент, надо было на сайтемелочь поправить. Мне соответственно надо было развернуть сайт локально, внести изменения, их закоммитить и вылить в прод. Но прикол в том, что там сайт на php-5 крутится, и мускул тоже пятый, а локально у меня сильно более старшие версии и на них не запустилось. Что, переустанавливать ПО на локальной машине? Нет. Лучше вот так в докерах запустить и все. И если пересесть надо на другой проект, где совсем другие версии ПО используются, просто этот проект останавливаешь, другой запускаешь и все.

            А вот относительно свежий пример из жизни, где докер сильно помог: помогаю товарищу с одним проектом. В итоге у меня все запускается, а у него нет. freecode.academy/topics/kak-debazhit-api-zaprosy-apollo
            Посмотрели все основные моменты, ни в какую не запускается у него. В итоге я упаковал в докер и он хоть и не сразу освоил его, но за день запустился и все работает. Вот здесь обсуждение в задаче: freecode.academy/tasks/ckn290mjjnzp20730bgh37d8s
              Сергей Шлоков
              13 апреля 2021, 18:43
              0
              Но docker — маст хэв. Это ведь не просто самостоятельная технология для какой-то конкретной задачи, это сейчас как фундамент.
              Это да. Особенно для пользователей винды (таких как я). Даже Redis не поставишь.
                Fi1osof
                13 апреля 2021, 19:11
                0
                Я утверждать не могу, но вроде же на windows professional ставится докер. Не?
                  Сергей Шлоков
                  13 апреля 2021, 20:00
                  0
                  Ставится. Поэтому нужно осваивать, чтобы использовать все возможности разработки.
                    Fi1osof
                    13 апреля 2021, 20:24
                    0
                    Если ставится и есть возможность, то да, надо осваивать.

                    Вот на заметку проект интересный: shellops.io/
                    Ребята из Ирана делают GUI для управления серверами с докерами. Контейнеры создавать, мониторить и т.п. Скорее всего взлетят (сейчас они в Эстонию релокейнулись).

                    Но вообще, они юзают вот эту либу: github.com/apocas/docker-modem
                    Старая, но развивающаяся. На JS написана, управление контейнерами и т.п. Мы там еще просили за docker-compose, и чел написал совсем новую либу: github.com/apocas/dockerode-compose

                    Это очень перспективное направление. Можно будет не только свой codesandbox запустить, но и небольшой хостинг :)
                      Сергей Шлоков
                      13 апреля 2021, 21:24
                      +1
                      Мерси!
                      На винде даже предзагрузка на PHP7.4 не работает. Так что, как ты сказал, must have!
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          11