Andrey
ну так а где link то?
Yuri
мы не понимаем
Alex
мне надо связать контейнеры между собой, пробросить так или иначе порты: web к db и наоборот web к nginx и наоборот при этом 5432 на хосте занят
Yuri
links: db
Yuri
ports: "5433:5432"
Tadeusz
ну сделай сеть отдельную и занимай какие хочешь порты и линкуй контейнеры
Yuri
ну сделай сеть отдельную и занимай какие хочешь порты и линкуй контейнеры
какую сеть? ничего что докер сам делает сеть внутри compose?
Tadeusz
я про это и говорю
Tadeusz
а-ля networks: app-network: driver: bridge
Andrey
да ничего там отдельно делать не надо, такое оно само
Tadeusz
само оно забиндить localhost на 5432 захочет (который занят)
Andrey
да не надо никуда ничего биндить
Tadeusz
ойвсе
Alex
ports: "5433:5432"
это же для web, правильно? веб будет юзать 5433 порт у хоста (рассуждаю) а как проброс сделать от контейнера бд на 5433 порт хоста? если продублировать директиву в db-сервис, то вылетит ошибка, типа порт уже занят
Alex
а-ля networks: app-network: driver: bridge
спасибо, почитаю, глядишь и все получится организовать
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
3 раз не буду объяснять. устал
Alex
ports: "5433:5432"
все, пазл сложился :) я так и не понял почему вы порты указали но вы правильно сказали - докер создает внутреннею сетку и этого вполне достаточно все что мне нужно было сверх того понять, что этом случае db из сервиса/контейнера web будет доступна по адресу service_name(в моем случае - "db"):port
Alex
И в этом случае порты хоста вообще не задеваются никак, проброс идет по внутренней докер-сетке Спасибо!
manefesto
Посмотрел я вариант с использованием nginx ssl passthru он возможен только для tcp
manefesto
ребята, подскажи мне разницу между docker 17 и 18
Roman
ребята, подскажи мне разницу между docker 17 и 18
в 18 есть новые фичи и пофикшены баги не знаю чего ты ожидаешь в ответ на такой вопрос)
Roman
почитай чейнджлоги
manefesto
я хочу для себе понять какая версия является стабильной для прода
manefesto
а то есть понимание что допустим ubuntu 18.04 это LTS, а 18.10 нет
Roman
последняя)
Roman
в докере нет лтс
manefesto
буду знать
Artur
Всем привет, только начал изучать докер, есть вопрос: Если БД на проде работает, и туда все данные закидываются и я захочу к примеру перенести приложение на другой сервер, файлы хранятся под системой контроля версии git. Мне нужно в git данные БД комитить или нет?
Artur
Просто докер же все данные БД хранит в папке приложения, вот этот момент непонятен мне пока.
.
Всем привет, только начал изучать докер, есть вопрос: Если БД на проде работает, и туда все данные закидываются и я захочу к примеру перенести приложение на другой сервер, файлы хранятся под системой контроля версии git. Мне нужно в git данные БД комитить или нет?
БД в гите не храни, по дефолту все данные контейнера стираются, поэтому нужен volume. Если он смонтирован в папку проекта, то исключи его через .gitignore При переносе проекта копируешь тот волюм на новую машину в то же место (в папке проекта)
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
Т.е. на хосте в директории test есть файлы, я монтирую в контейнер, но там файлы не отображаются
Покажите find . в директории с докеркомпоз файлом, если не секрет.
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
А что за директория такая с обновлениями? Что это за обновления?
Патчи для базы. Набор sql файлов со всякими ALTER TABLE :)
Maxim
Патчи для базы. Набор sql файлов со всякими ALTER TABLE :)
А разве это не должно применяться к работающей бд?
manefesto
нет
manefesto
это по факту initdb
Dan
Собственно, проблему уже обнаружил, внимательность — наше всё. В баш-скрипте была неправильная последовательность. Сначала вызов, а потом определение переменной сокета :)
Maxim
это по факту initdb
initdb выполняется только раз при первом старте и только так и должно быть, все остальное должно применяться к рабочей бд
Grigory
Ребята, а есть возможность пробросить из docker-compose.yml переменную внутрь Dockerfile когда запускаешь docker-compose up --build ?
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
build: context: . args: MYSQL_ROOT_PASSWORD: password ENV: test dockerfile: ARG MYSQL_ROOT_PASSWORD ARG ENV ADD ${ENV}/data.xml /data/
Так точно. Только старайтесь не использовать ENV в названиях atgs и env
Grigory
А через env_file не получится никак?
Dan
Читайте документацию :)
Dan
Там всё есть
Grigory
Получилось, спасибо
Maxim
А через env_file не получится никак?
Через env_file переменные будут доступны только в контейнере, для Dockerfile используйте args они доступны при build
Grigory
ARG APP_DOMAIN ENV APP_DOMAIN=$APP_DOMAIN
Grigory
вот так доступны стали
Maxim
ARG APP_DOMAIN ENV APP_DOMAIN=$APP_DOMAIN
Вот это уже то что нужно!
Grigory
Настроил запуск nginx с генерируемым конфигом из env, я счастлив
Maxim
Настроил запуск nginx с генерируемым конфигом из env, я счастлив
кидай пример как передаются параметры в конфиг
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; ...
Grigory
разве? CMD запускается при старте же и подтягивает env при билде и простом запуске же
Maxim
разве? CMD запускается при старте же и подтягивает env при билде и простом запуске же
не проще ли держать Dockerfile без этих кастомизаций и вынести этот функционал в docker-compose? Например вот так
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
не проще ли держать Dockerfile без этих кастомизаций и вынести этот функционал в docker-compose? Например вот так
А потом запускать docker-compose с хостовыми переменными окружения? Зачем? если есть .env файл