Aion
но не сайт
Hикoлaй
Ребят, всем привет. Скажите, а как по канонам докера собирать php сайтики? По сути какие есть компоненты: 1) PHP код бека 2) html/css/js и вот это вот всё для фронта 3) php-fpm 4) nginx 5) База Исходя из логики 1 процесс 1 контейнер, мне надо: 1) Volume для кода 2) Контейнер с php-fpm 3) Контейнер с nginx 4) Контейнер с базой И вроде как все логично, но не редко вижу когда php суют вместе с кодом в один контейнер. А иногда еще и базу к ним селят. Хотелось бы мнения послушать.
я вот тоже неверно сначала трактовал "1 процесс = 1 контейнер", пытался распихать php-fpm, nginx, app в разные контейнеры Но суть в том что я собираю сразу несколько микросервисов. api-gateway |--service1 |--service2 |--service3 |--serviceN Пытаясь собрать все это с минимально атомарной единицей, думал что меня заберут в дурку. В итоге допер что 1 целый микросервис , это 1 контейнер, чтобы он мог работать полностью автономно. Фронт так же отдельно как самодостаточный сервис. Наверно в архитектуре тут надо придерживатся такой логики: Строить микросервисы так, чтобы удалив любой, все остальные могли продолжать работать.
Aion
как мне например разделить проект таким образом, чтобы 20 разработчиков могли независимо пилить 20 разных его кусочков
Hикoлaй
на сайт это ложится ровно точно так же
Hикoлaй
как мне например разделить проект таким образом, чтобы 20 разработчиков могли независимо пилить 20 разных его кусочков
1) бить на микросервисы? (появляется дополнительная работа: поддержка разных версий, сборки и т.п.) 2) просто использовать систему контроля версий?
Andrey
По такой логике я пихожу к выводу что нужно 2 контейнера: 1) nginx + собранный фронт 2) nginx + phpfpm + собранный бек база не в счет. Но это ж нужно будет тогда сверху накрывать еще одним nginx чтобы раскидывать запросы между фронтом и беком. Получится 3 отдельных nginx. Это разве ок?
Hикoлaй
да
Aion
нет
Hикoлaй
))
Aion
php-fpm без nginx отдельный образ
Hикoлaй
принцип ларадока?
Andrey
php-fpm без nginx отдельный образ
А ну да, логично в принципе, экономим один nginx.
Andrey
Мне почему то всегда казалось что собирать код и какой нибудь fpm в одном контейнере это зло. Видимо я не прав
Hикoлaй
так критично экономить на легком nginx? может лучше использовать nginx везде, но собирать контейнер на alpine вместо например ubuntu?
Andrey
Хотя если включить зануда mode, то можно сказать что в некоторых ситуациях пачка nginx может вносить существенную задержку. Но не будем об этом сейчас, это оффтоп дикий
Oleg
Ребзя, помогите с траефиком
Oleg
не залетают чтото туда хосты
Oleg
вот композ траефика version: '3' services: traefik: image: traefik:1.5-alpine restart: always container_name: traefik networks: - proxy ports: - "80:80" - "443:443" - "8080:8080" labels: - traefik.frontend.rule=Host:test-traefik.example.com - traefik.port=8080 volumes: - ./traefik:/etc/traefik/ - /var/run/docker.sock:/var/run/docker.sock networks: proxy: external: true
Oleg
все ок поднимается, вижу веб на 8080
Oleg
вот поднимаю тестовый нджинкс version: '3' networks: proxy: external: true services: nginx-test: image: nginxdemos/hello restart: always container_name: nginx-test networks: - proxy labels: - traefik.backend=nginx-test - traefik.frontend.rule=Host:tests.example.com - traefik.docker.network=proxy - traefik.port=80
Oleg
ну и как бы он не заходит
Oleg
дашборд пуст
Kamil
А в третьей версии можно установку пакетов добавлять в компоуз?
Alexander
народ, а где я продалбываюсь? php: image: php:7.0-fpm restart: always ports: - 9000:9000 command: docker-php-ext-install zip volumes: - ./:/code но в итоге вываливается с exit code 1 и в цикле пытается установить расширение
Alexander
без команды все хорошо но как установить расширение?
Sergey
дашборд пуст
дашборд трэфика?
Oleh
без команды все хорошо но как установить расширение?
Какое расширение ты пытаешься установить?
Sergey
пуст в том смысле, что там нет вообще ничего, или нет nginx-бэка и фронта?
Oleg
нету nginx бэка и фронта
Sergey
хм... может конечно это тупость, вроде в докерфайле есть необходимые инструкции, но возможно надо для nginx явно указать порт expose 80?
Oleh
в конфиге же написано zip
Ок, перефразирую. Расширение к чему ты пыташься установить. У тебя докер не может выполнить в контейнере твой command.
Alexander
к php
Sergey
тогда надо логи трэфика
Oleh
к php
sudo: apt-get update && apt-get install php-zip ?!
Oleg
тогда надо логи трэфика
root@tests:/home/ubuntu# docker logs traefik root@tests:/home/ubuntu#
Oleg
ничо нету
Sergey
дебаг включен в конфиге?
Oleg
неа
Oleg
ща включу
Alexander
sudo: apt-get update && apt-get install php-zip ?!
со стандартными образами docker для php не работал, как понимаю? там явно указано как надо устанавливать расширения
Oleg
дебаг включен в конфиге?
включил, перезапустил тестовый nginx
Oleg
в логе только time="2018-02-14T12:23:43Z" level=debug msg="Basic auth success..."
Oleg
оба хоста вижу в одной сети "Containers": { "838989a60cbeb40a6f880a4c4abe5916f6603657e2cc2bc2bea9e33a866cfdaa": { "Name": "nginx-test", "EndpointID": "22db346a8fd23be488e4ec060f7dd47f061471d304b7ca4ae9ae990073440e0d", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" }, "e59b695b5e4f4e3cd04f31a583f2299768423e4b23e8323162ce0cf417f2f05f": { "Name": "traefik", "EndpointID": "840c694e758ed94800a3011d57658dbef1df14ac615ce7b37ef964c51efd1e4f", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": ""
Sergey
@flomsk хм, а контейнер с nginx здоров?
Alexander
Не работал, но что мешает проверить мой вариант?)
опыт 🙂 потому что установка расширений происходит через docker-php-ext-install
Oleg
Sergey да, ща отдельно запустил, есть подозрение на версию траефик
Sergey
у меня та же версия трэфика, работает без нареканий
Oleg
хм
Sergey
точнее, у меня traefik:alpine, но они вроде идентичны
Oleg
вот TOML logLevel = "DEBUG" defaultEntryPoints = ["http", "https"] [web] address = ":8080" [web.auth.basic] users = ["admin:ххх"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [acme] email = "an@example.org" storage = "acme.json" entryPoint = "https" onHostRule = true onDemand = false
Sergey
хм
Sergey
докер раздела нет?
Sergey
[docker] endpoint = "unix:///var/run/docker.sock" domain = "docker.localhost" watch = true exposedbydefault = false
Oleg
😱😱😱
Oleg
чорт
Oleg
щас написал в логе time="2018-02-14T12:34:50Z" level=debug msg="Provider event received {Status:start ID:77a8c63b0ac10f568b5a177bd86df2e1d13f8f59fe77bfc18cf2837213da4ae0 From:nginxdemos/hello Type:container Action:start Actor:{ID:77a8c63b0ac10f568b5a177bd86df2e1d13f8f59fe77bfc18cf2837213da4ae0 Attributes:map[com.docker.compose.container-number:1 com.docker.compose.version:1.19.0 name:nginx-test traefik.backend:nginx-test traefik.docker.network:proxy traefik.frontend.rule:Host:tests.example.comcom.docker.compose.config-hash:67dd78ff0369169022fb3ea17d106fc5b24ffd4c1523df8df9e6165828edf58e com.docker.compose.oneoff:False com.docker.compose.project:ubuntu com.docker.compose.service:nginx-test image:nginxdemos/hello maintainer:NGINX Docker Maintainers <docker-maint@nginx.com> traefik.port:80]} Scope:local Time:1518611690 TimeNano:1518611690240045879}" time="2018-02-14T12:34:50Z" level=debug msg="Filtering disabled container /nginx-test" time="2018-02-14T12:34:50Z" level=debug msg="Filtering disabled container /traefik"
Oleg
и в дашборде теперь просто вкладка docker но там ничгео нет
Sergey
в лейблы к сервисам
Sergey
- "traefik.enable=true"
Sergey
выше же в конфе по дефолту все запрещено экспозить через трэфик
Oleg
спасибо!
Alexander
php: image: php:7.0-fpm restart: always ports: - 9000:9000 command: bash -c "apt-get update && apt-get install -y zlib1g-dev && docker-php-ext-install zip && php-fpm" volumes: - ./:/code если кому вдруг понадобится )
Sergey
@flomsk заработало?
Oleg
ага
Sergey
ну и славно
Oleg
тока чот не хочет подтягивать ssl пишет acme: Could not determine solvers
Oleg
ну ща нагуглю
Sergey
если желаешь lets encrypt-сертификаты получить, то добавь строки томл
Sergey
caServer = "https://acme-staging.api.letsencrypt.org/directory" [acme.httpChallenge] entryPoint = "http"
Sergey
а то мигом лимиты исчерпаешь
Sergey
а так хоть потестишь
Oleg
спасибо тебе добрый человек Sergey :)
Sergey
обращайся, чем смогу - помогу