Задать вопрос
Ответы пользователя по тегу Docker
  • Как составить SQLite Dockerfile?

    @dronmaxman
    VoIP Administrator
    FROM alpine
    RUN apk add --no-cache sqlite
    WORKDIR /db
    COPY . .
    RUN sqlite3 /db/example.db "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER);"
    CMD ["sqlite3", "/db/example.db"]
    Ответ написан
    Комментировать
  • Почему не запускается Docker на гостевом аккаунте Windows?

    @dronmaxman
    VoIP Administrator
    https://docs.docker.com/desktop/install/windows-in...

    If your administrator account is different to your user account, you must add the user to the docker-users group:

    Run Computer Management as an administrator.
    Navigate to Local Users and Groups > Groups > docker-users.
    Right-click to add the user to the group.
    Sign out and sign back in for the changes to take effect.
    Ответ написан
    5 комментариев
  • Я добавил правило в DOCKER-USER которое дает доступ к портам только 1 айпи, но теперь из контейнеров нельзя выйти в интернет. Как поправить?

    @dronmaxman
    VoIP Administrator
    sudo iptables -I DOCKER-USER -i ens3 ! -s IP/24 -j DROP

    Дава расшифруем что ты написа: блокировать ВСЕ что зашло через интерфейс ens3 кроме одной подсети. В результате твои контейнеры отправляют запросы, а ответы блокируются этим правилом.

    Надо указать порт, пример для web сервера
    sudo iptables -I DOCKER-USER -i ens3  ! -s IP/24 -p tcp -m tcp --dport 80 -j DROP
    Ответ написан
    5 комментариев
  • Почему сервис не запускается в контейнере докер?

    @dronmaxman
    VoIP Administrator
    main_queue:
        build:
          context: .
          dockerfile: Dockerfile
        command: 'php artisan queue:work'
        depends_on:
          - main_db 
        networks:
          - mm-network
        environment:
          - DB_CONNECTION=${DB_CONNECTION}
          - DB_HOST=${DB_HOST}
          - DB_PORT=${DB_PORT}
          - DB_DATABASE=${DB_DATABASE}
          - DB_USERNAME=${DB_USERNAME}
          - DB_PASSWORD=${DB_PASSWORD}


    или

    main_queue:
        build:
          context: .
          dockerfile: Dockerfile
        command: 'php artisan queue:work'
        depends_on:
          - main_db 
        networks:
          - mm-network
        env_file:
          - .env
    Ответ написан
  • Стоит ли менять Docker на Proxmox?

    @dronmaxman
    VoIP Administrator
    Для твоей текущей конфигурации proxmox добави пару плюсов в виде снимков, клонирование, бекап на уровне всей виртуальной машинки, возможность запускать windows. При правильном подборе железа можно пробросить GPU или еще какой-то девайс и попробовать какой-то изврат. В целом это хороший опыт.
    Ответ написан
    Комментировать
  • Как в docker сохранить данные имеющиеся в контейнере?

    @dronmaxman
    VoIP Administrator
    Есть два подхода, использовать внутренний volumes

    version: '3.6'
    services:
      smtp:
        image: exim4:v1
        container_name: smtp
        ports:
          - 2025:25
        volumes:
          - exim4_config:/etc/exim4
          - exim4_mail:/var/mail
          - exim4_logs:/var/log/exim
        restart: unless-stopped
        networks:
          - localnet
    
    
    volumes:
      exim4_config:
      exim4_mail:
      exim4_logs:


    или запустить контейнер руками и сгенерировать конфиг, и пользоваться твои compose

    docker run -it --rm \
      -v /opt/exim4/smtpsender04/config:/etc/exim4 \
      -v /opt/exim4/smtpsender04/mail:/var/mail ʼ
      exim4:v1 /bin/bash -c "exim -bP >/etc/exim4/exim.conf"
    Ответ написан
    3 комментария
  • Какие настройки необходимы для маршрутизации подключения с хостовой машины в VPN docker?

    @dronmaxman
    VoIP Administrator
    Запусти контейнер как --net=host, включи маскарад на интерфейсе VPN и жизнь станет проще.
    Ответ написан
    Комментировать
  • Как настроить Docker, чтобы composer создавал папку vendor?

    @dronmaxman
    VoIP Administrator
    volumes:
    - .:/var/www/html/git


    Этой командой ты перетираеш содержимое /var/www/html/git. Это ужастная практика делать именно вот так "- .:/" без указания каталога источника.

    Хороший пример https://github.com/codefresh-contrib/php-composer-...
    Ответ написан
    1 комментарий
  • Настройка docker и proxy для возможноси отправки запроса через curl между контейнерами. Возможно ли это?

    @dronmaxman
    VoIP Administrator
    Часто эту задачу решают через external network.

    Создаеш еще одну сеть через CLI
    docker create network net-private

    Потом добавляеш ее в docker-compose.yml как внешнюю, потом в томже компопозе добавляеш ее к сервису которые должны между собой взаимодействовать.

    После всех манипуляций контейнеры будут видеть друг-друга по именам.

    Вот пример двух композов, приложение с базой и pgadmin. Pgadmin это вебка для управления базой, что бы они могли взаимодействовать мы объединяем их в одну сеть net-private.
    version: '3.8'
    
    services:
      pgadmin:
        image: dpage/pgadmin4
        restart: unless-stopped
        environment:
          PGADMIN_DEFAULT_EMAIL: "admin@example.com"  # замініть на свою email-адресу
          PGADMIN_DEFAULT_PASSWORD: "qwerty12345"  # замініть на свій пароль
        ports:
          - "5050:80"
        networks:
          - net-private
    
    networks:
      net-private:
        external: true


    version: '3.8'
    
    services:
      web:
        image: my/app
        restart: unless-stopped
        ports:
          - "80:80"
        volumes:
            - ./data:/mnt/data
      database:
        image: db/psql
        restart: unless-stopped
        networks:
          - net-private
    
    
    networks:
       net-private:
        external: true
    Ответ написан
    Комментировать
  • Какой docker compose использовать и почему их два?

    @dronmaxman
    VoIP Administrator
    docker compose - новая версия
    docker-compose - больше не развивается, поддерживает для совместимости
    Ответ написан
    1 комментарий
  • Как обновлять сертификаты в Docker Compose для Nginx с автоматическим перезапуском контейнера?

    @dronmaxman
    VoIP Administrator
    nginx:
      container_name: nginx_container
      image: nginx
      ports:
        - 80:80
        - 443:443
      networks:
        - private
        - public
      restart: always
      volumes:
        - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
        - ./nginx/conf.d/:/etc/nginx/conf.d/:ro
        - ./certbot/www:/var/www/certbot/:ro
        - ./certbot/conf/:/etc/nginx/ssl/:ro
      command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
    
    certbot:
      image: certbot/certbot
      volumes:
        - ./certbot/www/:/var/www/certbot/:rw
        - ./certbot/conf/:/etc/letsencrypt/:rw
      entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
    Ответ написан
    6 комментариев
  • Как подключить Django к MongoDB?

    @dronmaxman
    VoIP Administrator
    Типичная проблема не понимания работы сети в docker.

    - "27019:27017"

    Объявил из вне порт 27019 для подключения, но при этом в настроках джанго указал подключаться к внутреннему ресурсу mongo который не слушает порт 27019. Они и так в одной сети по дефолту, монго вообще не обязательно объявлять порты.

    Укажи порт MONGO_DB_PORT: "27017"
    Ответ написан
  • Как сделать домен с SSL вместо IP для WG-Easy (реп. DigneZzZ/dwg)?

    @dronmaxman
    VoIP Administrator
    Не забудь поменять MYEMAIL@gmail.com на свой.
    version: "3"
    services:
      traefik:
        image: "traefik:v2.10"
        container_name: "traefik"
        command:
          #- "--log.level=DEBUG"
          - "--api.insecure=true"
          - "--providers.docker=true"
          - "--providers.docker.exposedbydefault=false"
          - "--entrypoints.web.address=:80"
          - "--entrypoints.websecure.address=:443"
          - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
          - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
          #- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
          - "--certificatesresolvers.myresolver.acme.email=MYEMAIL@gmail.com"
          - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
        ports:
          - "80:80"
          - "443:443"
    #      - "8080:8080"
        volumes:
          - "./letsencrypt:/letsencrypt"
          - "/var/run/docker.sock:/var/run/docker.sock:ro"
        networks:
          private_network:
            ipv4_address: 10.2.0.120
    
      unbound:
        image: "mvance/unbound:1.17.0"
        container_name: unbound
        restart: unless-stopped
        hostname: "unbound"
        volumes:
          - "./unbound:/opt/unbound/etc/unbound/"
        networks:
          private_network:
            ipv4_address: 10.2.0.200
    
      wg-easy:
        depends_on: [unbound, adguardhome]
        environment:
          - WG_HOST=MYHOST_IP
          - PASSWORD=openode
          - WG_PORT=51820
          - WG_DEFAULT_ADDRESS=10.10.10.x
          - WG_DEFAULT_DNS=10.2.0.100
          - WG_ALLOWED_IPS=10.2.0.0/24, 0.0.0.0/0, ::/0
          - WG_PERSISTENT_KEEPALIVE=25
          - WG_MTU=1280
        #image: ditek/wg-easy
        image: weejewel/wg-easy
        container_name: wg-easy
        volumes:
          - .:/etc/wireguard
        ports:
          - "51820:51820/udp"
    #      - "51821:51821/tcp"
        restart: unless-stopped
        cap_add:
          - NET_ADMIN
          - SYS_MODULE
        sysctls:
          - net.ipv4.ip_forward=1
          - net.ipv4.conf.all.src_valid_mark=1
        dns:
          - 10.2.0.100
          - 10.2.0.200
        networks:
          private_network:
            ipv4_address: 10.2.0.3
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.vpn.rule=Host(`vpn.site.com`)"
          - "traefik.http.routers.vpn.entrypoints=websecure"
          - 'traefik.http.routers.vpn.tls=true'
          - "traefik.http.routers.vpn.tls.certresolver=myresolver"
          - "traefik.http.services.vpn.loadbalancer.server.port=51821"
    
      adguardhome:
        depends_on: [unbound]
        image: adguard/adguardhome
        container_name: adguardhome
        restart: unless-stopped
        environment:
          - TZ=America/Los_Angeles
        volumes:
          - ./work:/opt/adguardhome/work
          - ./conf:/opt/adguardhome/conf
        networks:
          private_network:
            ipv4_address: 10.2.0.100
    
    networks:
      private_network:
        ipam:
          driver: default
          config:
            - subnet: 10.2.0.0/24
    Ответ написан
  • Докер и прочие контейнеризаторы - для доставки контента или также для разработки?

    @dronmaxman
    VoIP Administrator
    >Или все же это инструмент в первую очередь для доставки контента?
    Докер упрощает процесс доставки контента, но это не едиственный его плюс. Он позволяет быстро создать,воссоздать,повторить аналогичное окружение и зависимости которые необходимы твоему приложению в любом (почти) месте где есть поддержка docker.

    > но билдить каждый раз после внесения изменений в код - что я от этого выиграю?
    Ты не правильно используеш докер, если есть необходимость пересобирать контейнер при каждом изменении. Докер это окружение в котором работает твое приложение.

    > Как с этим дела в реальной жизни, на реальном среднестатистическом проекте?
    Повсеместно испольуется. Следующий шаг развития докер это k8s, а это mainstream. Если ты умееш работать с докером, то освоить k8s уже намного проще.

    Если сильно упростить то контейнер докер это виртуальная машина на linux внутри которой крутиться одно приложение. В идеологии докера каждое приложение должно быть в отдельном контейнере - mysql,redis,php.

    Докер позволяет обойти проблему зависимостей.

    Помню когда первый раз столкнулся с docker, это была система анализа логов от ruckus. По своей структуре это был centos на котором было запущено 8-9 контейнеров docker. Таким подходом ruckus как минимум решил для себя проблему установки обновлений, тебе не надо ставить обновления на саму ОС, тебе достаточно обновить контейнер. Если контейнер не запустился, то просто откати его. Все библиотеки и зависимости внутри контейнеров. Это настолько упростило процесс разработки и доставки обновлений, что сложно и представить.
    Ответ написан
    Комментировать
  • Как настроить Traefik, чтобы не отваливалась БД?

    @dronmaxman
    VoIP Administrator
    Traefik по умолчанию трогает все контейнеры. Поэтому стоит явно указать что бы он не трогал этот контейнер.

    labels:
       - "traefik.enable=false"
    Ответ написан
    1 комментарий
  • Как можно указать доменное имя для контейнера в докере?

    @dronmaxman
    VoIP Administrator
    Создаешь сеть docker, подключаешь контейнера в одну сеть, при подключении указываешь alias (mysite.local) для контейнера который как раз и будет доменным именем.

    docker docker network create <имя сети>
    docker network connect --alias nginx.local <имя сети> container-nginx
    docker network connect --alias apache.local <имя сети> container-apache
    docker network connect --alias mysite.local <имя сети> container-mysql


    Пора уже использовать docker-compose.
    Ответ написан
    Комментировать
  • Почему Nginx из докер композа не видит соседний контейнер?

    @dronmaxman
    VoIP Administrator
    docker run --restart unless-stopped -p 5001:5050 -d --name api --network nginx-proxy-man projsharp-api:2023_04_02__19_52_17


    Зачем ты порт вытаскиваешь, если все равно подключаешь его в одну сеть nginx-proxy-man, -p можно убрать.

    Поправить nginx конфиг
    
     location /api/ {
                    proxy_pass              http://api:5050/api/;
        }
    Ответ написан
    Комментировать
  • Почему контейнер не видит SSL-сертификат?

    @dronmaxman
    VoIP Administrator
    Рабочий пример.

    app.run(host='0.0.0.0', port=8095, debug=False)
    
    
    services:
      app:
        command: python wsgi_docker.py
    nginx:
        volumes:
          - ./file_setting/fullchain.pem:/etc/nginx/fullchain.pem
          - ./file_setting/privkey.pem:/etc/nginx/privkey.pem
        build: ./nginx
        container_name: t_nginx
        restart: always
        ports:
            - 80:95
            - 443:96
        depends_on:
          - app
    
    
    server {
        listen 95;
        server_name my_domain.ru www.my_domain.ru;
        return 301 https://$host$request_uri;
    }
    server {
        listen 96 ssl;
        server_name my_domain.ru www.my_domain.ru;
    
        ssl_certificate fullchain.pem;
        ssl_certificate_key privkey.pem;
        location / {
            proxy_pass "http://app:8095/";
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
    }


    > Получается, что нельзя на одном домене поднять несколько докеров с SSL(раз 443 дам 1му докеру)?
    Архитектура такая. Тебе нужен nginx, не важно как он будет запущен (docker или localhost), nginx будет держать сертификат и слушать порты 80 и 443. Т.к. у тебя домен один и порт тоже, то трафик надо рулить url.

    services:
      app1:
        command: python wsgi_docker.py
     app2:
        command: python wsgi_docker.py
     app3:
        command: python wsgi_docker.py
       nginx:
          ports:
            - 80:95
            - 443:96
         
    server {
        listen 96 ssl;
         server_name my_domain.ru www.my_domain.ru;
       
        ssl_certificate fullchain.pem;
        ssl_certificate_key privkey.pem;
    
    location /app1 {
            proxy_pass "http://app1:8095/";
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
    location /app2 {
            proxy_pass "http://app2:8095/";
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
    location /app3 {
            proxy_pass "http://app3:8095/";
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
    }


    Стучаться соответственно на

    https://domain.ru/app1
    https://domain.ru/app2
    https://domain.ru/app3
    Ответ написан
    Комментировать