
Sergey
01.04.2019
06:10:16

Roman
01.04.2019
07:29:50

Alex
02.04.2019
08:23:38
Привет!
Подскажите пожалуйста, как в docker-compose связать сервис и БД, если дефолтный порт 5432 занят уже другой БД?

Nibbler
02.04.2019
08:24:21

Google

Andrey
02.04.2019
08:25:06
дефолтный порт чего? контейнерам не обязательно, а то и вредно на портв хоста обращаться

Alex
02.04.2019
08:25:46
Угу, теорию понимаю
Но не знаю как на практике реализовать в docker-compose правильный проброс портов
я совсем начинающий :)

Andrey
02.04.2019
08:27:16
так в любом первом примере с парой контейнеров эта задача описана, ну показывайте уж тогда что на... там у вас, глядишь кто не заленится

Alex
02.04.2019
08:31:56

Andrey
02.04.2019
08:33:23
ну так а где link то?

Nibbler
02.04.2019
08:34:07
мы не понимаем

Alex
02.04.2019
08:35:13
мне надо связать контейнеры между собой, пробросить так или иначе порты:
web к db и наоборот
web к nginx и наоборот
при этом 5432 на хосте занят

Nibbler
02.04.2019
08:35:59
links: db
ports: "5433:5432"

Artem
02.04.2019
08:37:30
ну сделай сеть отдельную и занимай какие хочешь порты и линкуй контейнеры

Nibbler
02.04.2019
08:37:51

Artem
02.04.2019
08:38:05
я про это и говорю

Google

Artem
02.04.2019
08:38:37
а-ля networks:
app-network:
driver: bridge

Andrey
02.04.2019
08:39:06
да ничего там отдельно делать не надо, такое оно само

Artem
02.04.2019
08:39:46
само оно забиндить localhost на 5432 захочет (который занят)

Andrey
02.04.2019
08:40:27
да не надо никуда ничего биндить

Artem
02.04.2019
08:42:03
ойвсе

Alex
02.04.2019
08:42:52
ports: "5433:5432"
это же для web, правильно?
веб будет юзать 5433 порт у хоста (рассуждаю)
а как проброс сделать от контейнера бд на 5433 порт хоста?
если продублировать директиву в db-сервис, то вылетит ошибка, типа порт уже занят

Artem
02.04.2019
08:43:41
links не забудь

Alex
02.04.2019
08:44:25
Кстати, про примеры
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
отсюда https://docs.docker.com/compose/networking/
И я не врубаюсь почему web должен ловить что-то на 8001 порте хоста, если это явно не объявлено
А
"Within the web container, your connection string to db would look like postgres://db:5432, and from the host machine, the connection string would look like postgres://{DOCKER_IP}:8001."

Nibbler
02.04.2019
09:25:48
3 раз не буду объяснять. устал

Alex
02.04.2019
09:50:58
ports: "5433:5432"
все, пазл сложился :)
я так и не понял почему вы порты указали
но вы правильно сказали - докер создает внутреннею сетку и этого вполне достаточно
все что мне нужно было сверх того понять, что этом случае db из сервиса/контейнера web будет доступна по адресу service_name(в моем случае - "db"):port
И в этом случае порты хоста вообще не задеваются никак, проброс идет по внутренней докер-сетке
Спасибо!

Nibbler
02.04.2019
09:57:11

Maksim
02.04.2019
10:46:24
Посмотрел я вариант с использованием nginx ssl passthru
он возможен только для tcp

daysandbox_bot
02.04.2019
22:52:06
Removed msg from Артем Pen. Reason: new user + external link

Maksim
03.04.2019
09:00:17
ребята, подскажи мне разницу между docker 17 и 18

Roman
03.04.2019
09:04:28

Google

Roman
03.04.2019
09:04:31
почитай чейнджлоги

Maksim
03.04.2019
09:04:53
я хочу для себе понять какая версия является стабильной для прода
а то есть понимание что допустим ubuntu 18.04 это LTS, а 18.10 нет

Roman
03.04.2019
09:05:27
последняя)
в докере нет лтс

Maksim
03.04.2019
09:05:47
буду знать

Artur
03.04.2019
10:08:25
Всем привет, только начал изучать докер, есть вопрос:
Если БД на проде работает, и туда все данные закидываются и я захочу к примеру перенести приложение на другой сервер, файлы хранятся под системой контроля версии git. Мне нужно в git данные БД комитить или нет?
Просто докер же все данные БД хранит в папке приложения, вот этот момент непонятен мне пока.

Erich
03.04.2019
10:26:03

Artur
03.04.2019
11:13:50

;)
03.04.2019
19:51:26
version: '3.7'
services:
node1:
image: base:image
volumes:
- "./test:/test"
working_dir: /test
node2:
image: base:image2
volumes:
- "./:/mnt"
depends_on:
- node1
working_dir: /mnt
stdin_open: true
Вопрос почему файлы из директории test не монтируются?

;)
03.04.2019
19:52:33
Т.е. на хосте в директории test есть файлы, я монтирую в контейнер, но там файлы не отображаются

AstraSerg
03.04.2019
20:23:57

Evgeniy
03.04.2019
20:26:05
а как ты проверил что они не смонтировались?

;)
03.04.2019
20:35:08
Ну вообщето они смонтировались, смотрел через inspect
Но файлов там почему то нет


Dan
04.04.2019
08:12:39
Итак. Есть контейнер с mariadb. Два волюма: собственно папка с базой, и папка для апдейтов.
В докерфайле entrypoint'ом указан баш-скрипт, принимающий параметром cmd — mysqld. В скрипте, соответственно, есть некоторая магия для инициализации db, и прочего мейнтейна.
Однако, там прописано основное условие — если if [ ! - "/var/lib/mysql" ]; then и так далее. И всё работает, если это первый запуск: база создаётся, все условия отрабатывают. Подключение через сокет, все дела.
А мне надо бы сделать вот что: если я запускаю контейнер, и вдруг в папке с обновлениями что-то есть, то прежде чем запускать сервис, надо бы импортировать эти записи в базу. Условия прописаны, всё срабатывает, но я не понимаю напрочь, почему он не хочет соединяться с сокетом. 2002 ошибка и всё тут. Ткните меня пожалуйста. Возможно, проблема не сколько в докере, сколько в баше или env, но я перепроверил все возможные вариации — к сокету не цепляет.
p.s. гугл вежливо и тактично молчит, потому что такого как делаю я — мало кто додумается делать. и предлагает перезагрузить сервис mysqld, тогда всё будет хорошо. Но...
Это не вопрос, это я хвастаюсь :)


Maxim
04.04.2019
09:48:40
Итак. Есть контейнер с mariadb. Два волюма: собственно папка с базой, и папка для апдейтов.
В докерфайле entrypoint'ом указан баш-скрипт, принимающий параметром cmd — mysqld. В скрипте, соответственно, есть некоторая магия для инициализации db, и прочего мейнтейна.
Однако, там прописано основное условие — если if [ ! - "/var/lib/mysql" ]; then и так далее. И всё работает, если это первый запуск: база создаётся, все условия отрабатывают. Подключение через сокет, все дела.
А мне надо бы сделать вот что: если я запускаю контейнер, и вдруг в папке с обновлениями что-то есть, то прежде чем запускать сервис, надо бы импортировать эти записи в базу. Условия прописаны, всё срабатывает, но я не понимаю напрочь, почему он не хочет соединяться с сокетом. 2002 ошибка и всё тут. Ткните меня пожалуйста. Возможно, проблема не сколько в докере, сколько в баше или env, но я перепроверил все возможные вариации — к сокету не цепляет.
p.s. гугл вежливо и тактично молчит, потому что такого как делаю я — мало кто додумается делать. и предлагает перезагрузить сервис mysqld, тогда всё будет хорошо. Но...
А что за директория такая с обновлениями? Что это за обновления?

Google

Dan
04.04.2019
09:54:52

Maxim
04.04.2019
09:57:41

Admin
ERROR: S client not available

Maksim
04.04.2019
09:57:53
нет
это по факту initdb

Dan
04.04.2019
09:59:12
Собственно, проблему уже обнаружил, внимательность — наше всё. В баш-скрипте была неправильная последовательность. Сначала вызов, а потом определение переменной сокета :)

Maxim
04.04.2019
10:00:51
это по факту initdb
initdb выполняется только раз при первом старте и только так и должно быть, все остальное должно применяться к рабочей бд

Grigory
04.04.2019
10:56:41
Ребята, а есть возможность пробросить из docker-compose.yml переменную внутрь Dockerfile когда запускаешь docker-compose up --build ?

Dan
04.04.2019
10:59:42

Maxim
04.04.2019
10:59:48

Dan
04.04.2019
11:00:26
А, да, можно через args кстати
В docker-compose указываешь списком, а в Dockerfile через директиву ARG
build:
context: .
args:
MYSQL_ROOT_PASSWORD: password
ENV: test
dockerfile:
ARG MYSQL_ROOT_PASSWORD
ARG ENV
ADD ${ENV}/data.xml /data/

Maxim
04.04.2019
11:04:30

Grigory
04.04.2019
11:05:10
А через env_file не получится никак?

Dan
04.04.2019
11:06:29
Читайте документацию :)
Там всё есть

Grigory
04.04.2019
11:07:26
Получилось, спасибо

Google

Maxim
04.04.2019
11:09:13

Grigory
04.04.2019
11:09:31
ARG APP_DOMAIN
ENV APP_DOMAIN=$APP_DOMAIN
вот так доступны стали

Maxim
04.04.2019
11:21:41

Grigory
04.04.2019
11:23:05
Настроил запуск nginx с генерируемым конфигом из env, я счастлив

Maxim
04.04.2019
12:13:49

Grigory
04.04.2019
12:17:46
docker-compose.yml
web:
image: docker.test/vokamut/nginx:latest
restart: always
depends_on:
- app
links:
- app
volumes:
- ${PWD}/certs:/etc/nginx/ssl
ports:
- 80:80
- 443:443
networks:
- docker-net
env_file: .env.prod
Dockerfile:
FROM nginx:1.15-alpine
RUN apk --no-cache add gettext
COPY docker/vhost.conf /etc/nginx/nginx.conf.template
COPY public /var/www/public
ARG APP_DOMAIN
ENV APP_DOMAIN=$APP_DOMAIN
CMD ["/bin/sh", "-c", "/usr/bin/envsubst '$$APP_DOMAIN' < /etc/nginx/nginx.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"]
vhost.conf
server {
server_name ${APP_DOMAIN};
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/nginx/ssl/${APP_DOMAIN}.crt;
ssl_certificate_key /etc/nginx/ssl/${APP_DOMAIN}.key;
...

Maxim
04.04.2019
12:18:57

Grigory
04.04.2019
12:20:07
разве? CMD запускается при старте же и подтягивает env при билде и простом запуске же


Alex
04.04.2019
12:23:48
docker-compose.yml
web:
image: docker.test/vokamut/nginx:latest
restart: always
depends_on:
- app
links:
- app
volumes:
- ${PWD}/certs:/etc/nginx/ssl
ports:
- 80:80
- 443:443
networks:
- docker-net
env_file: .env.prod
Dockerfile:
FROM nginx:1.15-alpine
RUN apk --no-cache add gettext
COPY docker/vhost.conf /etc/nginx/nginx.conf.template
COPY public /var/www/public
ARG APP_DOMAIN
ENV APP_DOMAIN=$APP_DOMAIN
CMD ["/bin/sh", "-c", "/usr/bin/envsubst '$$APP_DOMAIN' < /etc/nginx/nginx.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"]
vhost.conf
server {
server_name ${APP_DOMAIN};
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/nginx/ssl/${APP_DOMAIN}.crt;
ssl_certificate_key /etc/nginx/ssl/${APP_DOMAIN}.key;
...
О, расскажите пожалуйста про ключи подробнее, я как раз возился сегодня;
Запустил, но срок у ключа - несколько месяцев
Находил гайд:
https://medium.com/@pentacent/nginx-and-lets-encrypt-with-docker-in-less-than-5-minutes-b4b8a60d3a71
Он всем хорош, кроме одного момента, о котором автор написал:
При запуске nginx требует сгенеренный ключ, его как бы еще нет
И типа надо самому вначале любой ключ подставить либо заюзать скриптик автора гайда, что как по мне и то херня, и то херня


Grigory
04.04.2019
12:24:33
А потом запускать docker-compose с хостовыми переменными окружения?
Зачем? если есть .env файл