Pull to refresh

Comments 40

1) Всегда думал что контейнеры это не виртуальные машины, а, ээмм… контейнеры?
2) Всегда думал что контейнер создается набором средств (namespace, cgroups, что там еще?) ядра linux (да, я знаю про WSLv1), а внутри контейнера просто юзерленд содержится.
Что бы не поседеть надо понимать суть вещей, я считаю.

Точно, кажется уже любой гайд по докеру начинается с "докер — не ВМ", и всё равно такое мнение берется откуда-то.
Плюс вредные советы вроде открытия контейнеров в сеть хоста, вместо создания отдельных docker network — одной для связи между фронтом и беком, и одной между беком и бд. В docker-compose это две строчки.

<Осторожно! Вредный совет!> в контейнер еще по ssh ходить можно)

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

там много ещё такого по тексту статьи.
Собственно автор 2262288@gmail.com Ивент-агентство Арлекино и этим всё сказано
Очень приятно, что Вы интересуетесь моими профессиональными успехами. Но завидовать надо скромнее, мне кажется. Также, приглашаю Вас посетить мой профессиональный сайт developer.xpendence.ru и на мою страницу в ВК, где Вы сможете поделиться своей историей успеха.

Интересно, спасибо. То есть, мы обрабатываем Promice в том же методе и возвращаем только готовый ответ, дождавшись его?

Ваш вариант:
const getResource = async () => {
        const res = await fetch(JSON_URL);

        return await res.json();
    };


И этот вариант:
const getResource1 = async () => {
        const res = await fetch('https://api.zaycev.fm/api/v1/channels');

        return res.json();
    };


Вернут одинаковые результаты.
Однако результат асинхронной функции уже завернут в Promise.resolve (не явно). Т.о. в первой функции дополнительный await накладывает небольшой оверхед — по сути делается таже самая работа 2а раза.
Да, действительно. Спасибо, поправил пример.
Пожалуйста, не пишите так: '2a'. Вы накладываете небольшой оверхед на числительное, — то же самое окончание, по сути, пишется два раза.

Окончание необходимо только для порядковых (второй как 2-й) числительных.
Ну хз, даже судя по нашим и соседям: Узкий глубокий специалист + devops = +20-30% к ЗП и большая любовь суппорта.
Также, можно положить все приложения в один образ и развернуть как один контейнер.

Это плохая практика, так делать не надо… Зависнет у Вас клиент на NodeJs, а перезагружать придется и бек тоже, лишние ресурсы на запуск бэка (который не требовалось перезагружать вообще), создание для себя лишних трудностей (и героическое их преодоление) когда возникнет потребность в балансировке нагрузки, из-за жесткой связи — один экземпляр клиента к одному экземпляру сервера.
Я не специалист в NodeJs(вообще), объясните кто ни будь, зачем он в этой схеме, какую задачу он должен решать? Из этой схемы мне на ум приходит:
— Серверный рендеринг страниц
— Раз взаимодействие с бэком на java идет за ним, то это некий Gateway, значит он несет в себе еще и функционал валидации запросов и наверно аутентификацию этих запросов.
Я ни в коем случае не придираюсь, и осознаю, что это просто пример, но это не пример из практики и никто так делать скорее всего не будет (правда ведь не будет?), а значит такую статью сложно осмыслить для практического применения теми людьми для которых эта статья написана.
В примере я разбираю React-приложение, стало быть, для того, чтобы развернуть React-приложение, да и любое приложение, которое рендерит фронт, нам нужно будет запустить его через npm. Очень сомневаюсь, что Вы не сталкивались с примерами из практики, когда фронт собирается отдельно на том же реакте, бэк и фронт лежат в разных микросервисах и они общаются через REST. Конечно, за исключением случаев, когда бэк на Java рендерит JSP, но, я надеюсь, Вы ведь не об этом?

На протяжении своей профессиональной деятельности я не раз сталкивался с таким подходом, вот и сейчас мы пишем приложение на докере с полутора десятками микросервисов, которые собираются, правда, через OpenShift (но это уже другая история), но внутри тот же докер. Если говорить о хакатонах, то подход, когда каждый пишет свой микросервис, а потом всё это собирается отдельно и общается через REST — вообще, на мой взгляд, самый рабочий.
В моей практике клиент собирается/упаковывается во время CI/CD с помощью webpack, формируется набор статических файлов которые помещаются в контейнер с вебсервером и ссылкой на эти файлы. С тем, что Вы сейчас пишите я согласен, но почему на схеме вы указываете взаимодействие NodeJs с Java сервером внутри контейнера или внутри виртуальной сети докера? Я понимаю это так, что кроме сборки клиента пользователю NodeJs принимает REST запросы от клиента и делегирует их выполнение через себя на java сервер.
Написав это, я подумал, что возможно у Вас очень большой клиент и Вы не хотите отдавать его весь сразу (много файлов, трафика и все такое) и нашли такой выход из ситуации как сборка налету.

У современных веб-фреймворков существует такая фича, как SSR — рендер на стороне сервера. Он может использоваться для ускорения загрузки страницы, для поддержки браузеров без javascript и для снятия проблем индексации поисковиками.


Поскольку эта штука исполняет клиентский javascript на стороне сервера, ей конечно же нужен рантайм. Например, nodejs.


Кто к кому должен при этом обращаться с запросами (нода к бакенду или бакенд к ноде) — не принципиально, возможны оба варианта.

Другими словами это пример не с SPA.

Почему же? Как раз для SPA серверный пререндер является стандартной оптимизацией.

Если бы на схеме API был опубликован для вызова из внешнего источника, то я бы увидел здесь SPA, на в данном случае, пользователь получает сформированные страницы с NodeJs, это не опровергает того факта, что со страницы могут идти REST запросы на NodeJs которые будут делегироваться java серверу. Однако подобный подход мне кажется спорным.
Вы все верно поняли, я тоже не вижу смысла отдавать статику нодой, а не бекендом, если не нужен ssr и всякие варианты с проксированием.
прочитав в заголовке про фуллстек, ожидал увидеть про docker-compose, но увы.
рекомендую в данной задаче попробовать именно его — тогда и запускать будет легче, и сеть можно будет легко настроить
Да, спасибо. Хотел включить ещё и docker-compose, и создание пользовательских сетей, но статья и так раздулась до каких-то нереальных размеров.
намек на продолжение (или даже серию статей)?
Думаю, есть смысл дополнить статью ещё одной, где можно будет раскрыть эти темы.
Меня всегда в таких случаях интересует, как человек пишет и отлаживает код. Для меня это всегда итеративный процесс, а тут получается, без привязки к IDE создали бекенд с профилем, где мы подключаемся к некой базе данных. Причём, БД не подняли ещё, а приложение уже запустили и отладили.

Я не специалист в контейнерах, но когда работал с Cloud Foundry ощутил все эти неудобства, когда приходилось прыгать между IDE, и поднимать то одно приложение локально, то другое, потом делать где-то изменения, потом подключаться к отладчикам, потом решал проблемы с CORS, если не подумал о них заранее… А в вашей статье (спасибо ещё раз), как-то всё просто. Вставили этот код, тот, запустили и всё работает.

Извините, но мне бы хотелось посмотреть на статью как разработчик организовывает свой рабочий процесс этого небольшого приложения. Вот это было бы интересно. Может быть у вас есть портянка скриптов для локальной разработки, о которой вы просто не сообщили :)
ну вот у меня почти похожий (джава+ангуляр) случай. Вся пачка проектов (всякие core, api1, api2 бекенда и фронтенд) открыта в одной единственной ИДЕ — IntelliJ IDEA, отладка там же локально
(ок, ng serve --poll 2000 — просто запущен в другом терминале), а в докер кладутся уже бинари (и поднимаются для тестов\продакшена у амазона)
База там поднята, я правда, не понял как))) Какая-то новая спрингбутовая магия.
Все в Интелиджи поднимется. Npm start для фронта и зеленый треугольничек для бэка. А профиля, он поэтому все под хостовой сетью и запустил в докере, чтоб с профилями и портами не трахаццо, наверно.
Да, рабочий процесс был очень интересен, учитывая, что в реакте я пока новичок, но если бы я взялся описывать ещё и его, статья была бы просто нечитаемой из-за своего размера :) Но сфокусироваться хотелось на докере, поэтому я и опустил все эти моменты :)
Вы всё разрабатывали в одной IDE, как описали ребята выше? Например, IntelliJ IDEA, или у вас было постоянное переключение между редакторами, консолью и прочее.
Всё написал в IDEA, образы собирал и коммитил во встроенном в IDEA терминале, а деплоил на удалённый сервер через терминал.
docker позволяет линковать локальные файлы внутрь контейнера. docker run -v /host/directory:/container/directory… таким образом вы сразу можете видеть изменения внутри контейнера

Это не очень хороший совет. Фишка в том, что если каталог /host/directory не создан, то докер его создаст сам с правами от рута. Ну, и далее начинается вакханалия. В теории — лучше пользоваться расширенным синтаксисом bind mount и подготавливать каталоги самому с нужными правами.
Ну, или как вариант — использовать volume для данных.

Девопс — это не специализация.
Контейнер — это не виртуальная машина.

Дальше даже читать не хочется.

Примерно аналогичные чувства. Но за что дальше зацепился взгляд — так это за EXPOSE в докерфайле. Его суть абсолютно не раскрыта, а именно — как правило — это тупо аннотация, вроде документации. По факту же у него есть два применения (docker run -P и ещё что-то аналогичное), в остальном — на прохождение пакетов и доступность портов между сервисами не влияет

Спасибо, что сообщили об этом.

Запускать приложение в режиме разработки для продакшена это сильно.
P.s. для продакшена в CRA придумали npm run build

Единственный адекватный человек, который это заметил.

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

Sign up to leave a comment.

Articles