Andrey
ну так а где link то?
Yuri
Yuri
мы не понимаем
Alex
мне надо связать контейнеры между собой, пробросить так или иначе порты:
web к db и наоборот
web к nginx и наоборот
при этом 5432 на хосте занят
Yuri
links: db
Yuri
ports: "5433:5432"
Tadeusz
ну сделай сеть отдельную и занимай какие хочешь порты и линкуй контейнеры
Yuri
Tadeusz
я про это и говорю
Tadeusz
а-ля networks:
app-network:
driver: bridge
Andrey
да ничего там отдельно делать не надо, такое оно само
Tadeusz
само оно забиндить localhost на 5432 захочет (который занят)
Andrey
да не надо никуда ничего биндить
Tadeusz
ойвсе
Alex
ports: "5433:5432"
это же для web, правильно?
веб будет юзать 5433 порт у хоста (рассуждаю)
а как проброс сделать от контейнера бд на 5433 порт хоста?
если продублировать директиву в db-сервис, то вылетит ошибка, типа порт уже занят
Tadeusz
links не забудь
Alex
Кстати, про примеры
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
отсюда https://docs.docker.com/compose/networking/
Alex
И я не врубаюсь почему web должен ловить что-то на 8001 порте хоста, если это явно не объявлено
Alex
А
"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."
Yuri
Yuri
3 раз не буду объяснять. устал
Alex
ports: "5433:5432"
все, пазл сложился :)
я так и не понял почему вы порты указали
но вы правильно сказали - докер создает внутреннею сетку и этого вполне достаточно
все что мне нужно было сверх того понять, что этом случае db из сервиса/контейнера web будет доступна по адресу service_name(в моем случае - "db"):port
Alex
И в этом случае порты хоста вообще не задеваются никак, проброс идет по внутренней докер-сетке
Спасибо!
Yuri
manefesto
Посмотрел я вариант с использованием nginx ssl passthru
он возможен только для tcp
manefesto
ребята, подскажи мне разницу между docker 17 и 18
Roman
почитай чейнджлоги
manefesto
я хочу для себе понять какая версия является стабильной для прода
manefesto
а то есть понимание что допустим ubuntu 18.04 это LTS, а 18.10 нет
Roman
последняя)
Roman
в докере нет лтс
manefesto
буду знать
Artur
Всем привет, только начал изучать докер, есть вопрос:
Если БД на проде работает, и туда все данные закидываются и я захочу к примеру перенести приложение на другой сервер, файлы хранятся под системой контроля версии git. Мне нужно в git данные БД комитить или нет?
Artur
Просто докер же все данные БД хранит в папке приложения, вот этот момент непонятен мне пока.
.
Artur
CMy3u🐈
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
CMy3u🐈
Вопрос почему файлы из директории test не монтируются?
CMy3u🐈
Т.е. на хосте в директории test есть файлы, я монтирую в контейнер, но там файлы не отображаются
AstraSerg
Evgeniy
а как ты проверил что они не смонтировались?
CMy3u🐈
Ну вообщето они смонтировались, смотрел через inspect
CMy3u🐈
Но файлов там почему то нет
Dan
Итак. Есть контейнер с mariadb. Два волюма: собственно папка с базой, и папка для апдейтов.
В докерфайле entrypoint'ом указан баш-скрипт, принимающий параметром cmd — mysqld. В скрипте, соответственно, есть некоторая магия для инициализации db, и прочего мейнтейна.
Однако, там прописано основное условие — если if [ ! - "/var/lib/mysql" ]; then и так далее. И всё работает, если это первый запуск: база создаётся, все условия отрабатывают. Подключение через сокет, все дела.
А мне надо бы сделать вот что: если я запускаю контейнер, и вдруг в папке с обновлениями что-то есть, то прежде чем запускать сервис, надо бы импортировать эти записи в базу. Условия прописаны, всё срабатывает, но я не понимаю напрочь, почему он не хочет соединяться с сокетом. 2002 ошибка и всё тут. Ткните меня пожалуйста. Возможно, проблема не сколько в докере, сколько в баше или env, но я перепроверил все возможные вариации — к сокету не цепляет.
p.s. гугл вежливо и тактично молчит, потому что такого как делаю я — мало кто додумается делать. и предлагает перезагрузить сервис mysqld, тогда всё будет хорошо. Но...
Dan
Это не вопрос, это я хвастаюсь :)
Maxim
Итак. Есть контейнер с mariadb. Два волюма: собственно папка с базой, и папка для апдейтов.
В докерфайле entrypoint'ом указан баш-скрипт, принимающий параметром cmd — mysqld. В скрипте, соответственно, есть некоторая магия для инициализации db, и прочего мейнтейна.
Однако, там прописано основное условие — если if [ ! - "/var/lib/mysql" ]; then и так далее. И всё работает, если это первый запуск: база создаётся, все условия отрабатывают. Подключение через сокет, все дела.
А мне надо бы сделать вот что: если я запускаю контейнер, и вдруг в папке с обновлениями что-то есть, то прежде чем запускать сервис, надо бы импортировать эти записи в базу. Условия прописаны, всё срабатывает, но я не понимаю напрочь, почему он не хочет соединяться с сокетом. 2002 ошибка и всё тут. Ткните меня пожалуйста. Возможно, проблема не сколько в докере, сколько в баше или env, но я перепроверил все возможные вариации — к сокету не цепляет.
p.s. гугл вежливо и тактично молчит, потому что такого как делаю я — мало кто додумается делать. и предлагает перезагрузить сервис mysqld, тогда всё будет хорошо. Но...
А что за директория такая с обновлениями? Что это за обновления?
Dan
Maxim
manefesto
нет
manefesto
это по факту initdb
Dan
Dan
Собственно, проблему уже обнаружил, внимательность — наше всё. В баш-скрипте была неправильная последовательность. Сначала вызов, а потом определение переменной сокета :)
Maxim
это по факту initdb
initdb выполняется только раз при первом старте и только так и должно быть, все остальное должно применяться к рабочей бд
Grigory
Ребята, а есть возможность пробросить из docker-compose.yml переменную внутрь Dockerfile когда запускаешь docker-compose up --build ?
Dan
Maxim
Dan
А, да, можно через args кстати
Dan
В docker-compose указываешь списком, а в Dockerfile через директиву ARG
Dan
build:
context: .
args:
MYSQL_ROOT_PASSWORD: password
ENV: test
dockerfile:
ARG MYSQL_ROOT_PASSWORD
ARG ENV
ADD ${ENV}/data.xml /data/
Maxim
Grigory
А через env_file не получится никак?
Dan
Dan
Читайте документацию :)
Dan
Там всё есть
Grigory
Получилось, спасибо
Grigory
ARG APP_DOMAIN
ENV APP_DOMAIN=$APP_DOMAIN
Grigory
вот так доступны стали
Maxim
Grigory
Настроил запуск nginx с генерируемым конфигом из env, я счастлив
Maxim
Grigory
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
Grigory
разве? CMD запускается при старте же и подтягивает env при билде и простом запуске же
Alex
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
Grigory