Ответы пользователя по тегу Docker
  • Несколько вопросов по развертывании докер контейнеров на сервере?

    @mureevms
    1. Образ и контейнер это разные сущности:
    Образ - это сущность, которая образуется после команды docker build, затем которая может быть помещена в регистри или в докер хаб. Можно провести аналогию с ISO образом ОС.
    Контейнер - это сущность, которая образуется после команды docker run. Т.е. контейнер - это определенным образом запущенный образ. Можно из одного образа запустить множество контейнеров

    Если поднимаетмся несколько контейнеров, то каждый из них является контейнером все зависимости от связи между ними, поскольку они сами по себе являются отдельными сущностями, которые можно нстроить так, что будут представлять из себя одно приложение с разными компонентами.

    контейнер !== образ, а контейнер === сервисы, где сервис === образ

    Контейнер != образ, факт.
    Контейнер может быть сервисом, а может и не быть, все зависит от того, что внутри.
    Сервис != образ. В данном случае нет понятия сервиса, это что-то внутри контейнера. Если там демон, принимающий запросы - это сервис. В широком смысле образ это образ и он ничему не равен.
    2. Как будет удобно, не принципиально. Но раз уж есть compose, то через него будет удобнее
    3. Нет причин не хранить docker-compose.yml в репе. Главное, чтобы в нем не было секретов. Все "ненужное" должно быть вынесено в переменные. Далее, как и сказал Дмитрий, надо правильно доставить это на прод
    Ответ написан
    Комментировать
  • Как правильно запустить контейнер от имени другого пользователя?

    @mureevms
    Его надо запускать от имени elkf_adm (uid=1002, gid=1002)

    Его не надо запускать от этого имени. Системный пользователь не при чем. Все дело в правах на файлы в файловой системе.

    Смотря на сборку этого имаджа видно, что в 11 и 13 строках создается группа filebeat с GID 1000 и пользователь filebeat с UID 1000. Еще раз обращаю внимание, это не относится к системному пользователю, которй запускает контейнер, это пользователь внутри контейнера. В 12-й строке создаются каталоги и назначается владельцем root:filebeat, т.е. пользователь root и группа filebeat. Ранее при создани пользователя уже видели, что пользователь filebeat добавляется в группу filebeat. И в 14 строке указывается пользователь от которого будет запускаться сам демон. А раз демон работает от него, то и права на файлы у него должны быть.

    Добавление user: "1002:1002" не поможет, потому что внутри контейнера нет пользователя с такими ID.

    Решить можно рекурсивной сменой владельца chown 0:1000 /path/ -R по каталогам, которые биндятся к контейнеру
    Ответ написан
  • Почему APP не подключается к контейнеру с Postgres?

    @mureevms
    container_name: postgres-db

    В коннекшн стринг приложения в качестве хоста БД надо указывать имя контейнера, т.е. self.HOST = 'dbpostgres-db'
    Ответ написан
    Комментировать
  • Как подклчиться к mongo в docker?

    @mureevms
    Если коннектит происходит из другого контейнера, надо коннектиться по имени контейрена, т.е. так:
    wait mongoose.connect(`mongodb://mongo:27017/${DB_NAME}`)
    Ответ написан
    Комментировать
  • Почему не запускается docker образ через gitlab ci?

    @mureevms
    Если у вас тип executor это docker, то что находится в script выполняется в контейнере, поднятом из image. Соответственно, вы пытаетесь сделать Docker-in-Docker. Осуждаю, поскольку сильно специфично и если вы не знаете для чего именно оно вам надо, значит не надо. Выберите shell как тип экзекьютора и скриптуйте командами непосредственно из системы без дополнительной прослойки
    Ответ написан
    7 комментариев
  • Docker compose меняет группу на 999 и выдает ошибку Permission denied?

    @mureevms
    999 - это UID пользователя postgres внутри контейнера. При инициализации БД, владельцем каталога /var/lib/postgresql/ назначается пользователь postgres. Когда вы маппите этот каталог в текущий (это следет из volumes), то конечно все рекурсивно будет принадлежать 999 UID'у. Это логичное и ожидаемое поведение.
    Чтобы решить можно изменить базовый образ, что запарно. Другие варианты:
    - назначить пользователю, работающему с этим каталогом, 999 UID в материнской системе
    - создать группу с 999 GID'ом и добавить пользователя в эту группу.

    А еще лучше просто не лазить туда. Если все же требуется, повышать привелегии до рута. Или же созать подкаталог и маппить в него, чтобы текущий не аффектился
    Ответ написан
    1 комментарий
  • Почему создание образа Docker зависает на стадии docker build?

    @mureevms
    Красным по черному же пижет, что
    Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist


    Это проблема Centos, потому что он всё. Починить можно, но не в докере, смысла не имеет. Соберите на живом дистре тоже самое
    Ответ написан
    5 комментариев
  • Почему не работает node сервер внутри контейнера Docker?

    @mureevms
    Как запускаете контейнер?
    EXPOSE 8000 не открывает порт, а указывает запускающему не забыть это сделать.
    Используйте ключ при запуске для открытия порта -p 8000:8000
    Ответ написан
    Комментировать
  • Как следить за статусом контейнеров?

    @mureevms
    Написать скрипт, который чекает в цикле время работы каждого контейнера и если он меньше 5 минут, слать письмо/веб хук/что -то еще, скрипт поместить в крон на выполнение каждые 4 минуты
    Ответ написан
    Комментировать
  • Как организовать доступ по доменным именам к разным проектам к vps?

    @mureevms
    Направление мысли верное, но детали не совсем.

    1. По домену все так.
    2. Домен надо делегировать на DNS хостинг. Поэтому не покупайте домен в nicru, они оборзели уже давно и хотят за это деньги. Купите на 2домен.ру или где еще, где бесплатный DNS хостинг.
    3. Да, создаете в админке DNS доменные имена третьего уровня (A записи) и в качестве дестинейшн указываете IP адрес VPC.
    4,5. Можно и в докере, даже удобнее будет. Тем самым будете указывать proxy_pass по имени контейнера приложения, иначе столкнетесь с тем, что при пересоздании контейнеров придется менять адреса в конфиге nginx, т.е. porject1.domain.ru -> porject1_container_name:1000

    Совершенно не изврат, это верный подход.
    Ответ написан
    2 комментария
  • Какой подход правильный в описании docker-compose?

    @mureevms
    1. Всегда лучше делать явно, чем не явно. Это упростит работу другим и себе же, когда пройдет полгода.
    2. Это как минимум удобно. Контейнер всегда называется одинаково, вместо дурацких автоматических названий. Опять же, пройдет полгода, вы сами читаете конфиг компоуза и видите контейнер не пойми как называется, надо будет догадаться, что имя не назначено. Зачем усложнять?
    3. По ситуации, нет верного ответа
    4. Относительные пути тру. А вот абсолютные зло. При относительных путях вам надо просто перенести каталог на новый сервер и все запустится. Абсолютные придется править, а это усложнение.
    Ответ написан
    2 комментария
  • Почему docker-compose игнорирует директиву user?

    @mureevms
    Как именно проверяете?
    Какой UID имеет пользователь momo в контейнере? Вангую, что первый вывод без пользователя у вас в хост системе, поскольку в ней нет пользователя с таким UIDом. А UID пользователя momo в контейнере == 1002

    Каждый раз делать chown на хосте под вымышленного пользователя как-то странно. Это похоже на баг.

    Все имена пользователей сделаны для удобства человека, система оперирует UIDом. Chown тоже умеет указывать UID, а не username: chown -R 1002:1002 /target
    Ответ написан
    7 комментариев
  • Как правильно объявить сохранение артефакта с томами Docker?

    @mureevms
    Предположение 1:
    > Uploading artifacts... found 1 matching files and directories

    Он нашел одно совпадение. Быть может это именно каталог ${CI_PROJECT_DIR}/tmp/var/www/app, в котором не обнаружил файл artifact-$CI_JOB_NAME-$CI_COMMIT_REF_NAME. Для решения попробовать указать вместо вашего варианта, так. Не понятно как и какой файл создается в этом каталоге, вы этого не показывает, вероятно он просто не подходит под шаблон.
    artifacts:
        when: always
        paths:
          - "${CI_PROJECT_DIR}/tmp/var/www/app/*" # именно в кавычках


    Предположение 2:
    Раннер запускается от своего пользователя, а файл создается от пользователя, под которым запускается процесс в контейнере, как правило, это рут, поэтому имеет смысл попробовать перед docker-compose дать 777 права на этот каталог:
    script:
        - chmod 777 ${CI_PROJECT_DIR}/tmp/var/www/app


    Предположение 3:
    Маловероятно, вы же проверили, но на всякий случай проверьте еще раз, смущает частое упоминание /var/www/app в разных вариациях и не уверен, что это один и тот же каталог для хоста и контейнера. Например, ${CI_PROJECT_DIR}/tmp/var/www/app каталог для раннера это не одно и тоже, что и для контейнера.

    И последнее:
    Вы монтируете каталог /var/www/app, а создаете ${CI_PROJECT_DIR}/tmp/var/www/app
    Ответ написан
    6 комментариев
  • Docker, Django, Nginx, Gunicorn, иногда отображается ошибка 502 Bad gateway, как исправить?

    @mureevms
    У вас web:8000 перестает отвечать. Смотрите на него, может он падает. Ну и логи смотрите. Вангую, что там будет сообщение типа, что web:8000 недоступен.
    Ответ написан
  • Можно ли с контейнера достучаться до localhost?

    @mureevms
    Для контейнера localhost это и есть сам контейнер, поэтому да, можно ).
    Для обращения к материнской системе надо использовать шлюз контейнера по умолчанию.
    Можно найти двумя способами, первый это узнать адрес на интерфейсе dockerX:
    $ ip a | grep docker
    5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
        inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

    Или в контейнере сделать ip r
    $ sudo docker exec -it php-fpm sh
    / # ip r | grep default
    default via 172.18.0.1 dev eth0

    Где 172.17.0.1 и есть нужный IP адрес к которому надо обращаться из контейнера.
    Ответ написан
    Комментировать
  • Как работает Dockerfile из 2-х образов?

    @mureevms
    FROM node:13 as node
    WORKDIR /app
    COPY package.json /app/
    COPY package-lock.json /app/
    COPY docker-additions/.npmrc /app/
    RUN npm install
    COPY ./ /app/
    RUN npm run config
    RUN npm run build

    В этом месте он использует контейнер с базовым образом node:13 для билда приложения.

    FROM nginx:1.18.0-alpine
    COPY --from=node /app/dist/ /usr/share/nginx/html
    COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf

    Тут используется nginx:1.18.0-alpine как базовый образ и копируется то, что набилдилось в предыдущем контейнере в контейнер с веб сервером.

    Этакий CI для Докера. Это удобно.

    1. Присваивается имя для слоя из которого потом копируются файлы в строке COPY --from=node /app/dist/ /usr/share/nginx/html
    2. На первом FROM происходит сборка. Если использовать один, то придется или ставить nginx в первый, или же nodejs во второй. А так это просто промежуточный слой.
    Ответ написан
    1 комментарий
  • Как организовать совместную работу Docker и Git?

    @mureevms
    А можно ли установить Git (а может, он уже установлен?) прямо в образ, и оттуда управлять версиями?

    Можно, но это заведомо плохой подход.

    Напрашивается решение, установить на машину и Docker и Git. Оно очевидно, с ним все ясно.

    Я бы так и сделал. И это правильный подход.

    Если хотите подробностей, уточните вопрос.
    Ответ написан
    1 комментарий
  • Почему я получаю ошибку?

    @mureevms
    Директива FROM node:latest означает, что берется последняя версия базового образа на момент сборки. Предположение в том, что при сборке на новом сервере версия node более новая, в которой могли измениться названия пакетов или синтаксис ключей.
    Ответ написан
    Комментировать
  • Как сделать путь к папке универсальным?

    @mureevms
    %USERPROFILE%

    А вообще, вот список виндовых переменных окружения
    Ответ написан
    Комментировать