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
Aion
как мне например разделить проект таким образом, чтобы 20 разработчиков могли независимо пилить 20 разных его кусочков
Hикoлaй
на сайт это ложится ровно точно так же
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
Мне почему то всегда казалось что собирать код и какой нибудь fpm в одном контейнере это зло. Видимо я не прав
Hикoлaй
так критично экономить на легком nginx? может лучше использовать nginx везде, но собирать контейнер на alpine вместо например ubuntu?
Andrey
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 и в цикле пытается установить расширение
Oleh
Alexander
без команды все хорошо
но как установить расширение?
Oleh
Oleg
Sergey
пуст в том смысле, что там нет вообще ничего, или нет nginx-бэка и фронта?
Alexander
Oleg
нету nginx бэка и фронта
Sergey
хм... может конечно это тупость, вроде в докерфайле есть необходимые инструкции, но возможно надо для nginx явно указать порт expose 80?
Oleh
в конфиге же написано
zip
Ок, перефразирую. Расширение к чему ты пыташься установить. У тебя докер не может выполнить в контейнере твой command.
Alexander
к php
Oleg
Sergey
тогда надо логи трэфика
Oleh
к php
sudo: apt-get update && apt-get install php-zip ?!
Oleg
ничо нету
Sergey
дебаг включен в конфиге?
Oleg
неа
Oleg
ща включу
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": ""
Oleh
Sergey
@flomsk хм, а контейнер с nginx здоров?
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
и в дашборде теперь просто вкладка 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
обращайся, чем смогу - помогу