Подключитесь к MariaDB с локальным хостом из контейнера Docker - PullRequest
3 голосов
/ 13 марта 2019

Сначала я прочитал эти ссылки

Но как новичок в докере. Мне это не помогло.

Что нужно знать:

  • Да, Мне нужен localhost . Я работаю над приложением, которое взаимодействует непосредственно с базой данных. Это создает / удаляет пользовательские привилегии и разрешить некоторым пользователям доступ с ограниченными правами с удаленного доступ. При инициализации приложение удалит удаленный доступ по умолчанию для пользователя root и подделает и предоставит им полную привилегию на localhost.
  • Я использую docker-compose.yml , сгенерированный https://phpdocker.io
  • Ubuntu 18.10
  • Docker версия 18.09.3, сборка 774a1f4
  • docker-compose версия 1.21.0, сборка неизвестна
  • Я использую докер только для целей разработки. На производстве использую кузницу

. / Докер-compose.yml

###############################################################################
#                          Generated on phpdocker.io                          #
###############################################################################
version: "3.1"

services:

    mailhog:
      image: mailhog/mailhog:latest
      container_name: myapp-mailhog
      ports:
        - "8081:8025"

    redis:
      image: redis:alpine
      container_name: myapp-redis

    mariadb:
      image: mariadb:10.4
      container_name: myapp-mariadb
      working_dir: /application
      volumes:
        - .:/application
      environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=myapp
        - MYSQL_USER=forge
        - MYSQL_PASSWORD=forge
      ports:
        - "8083:3306"

    webserver:
      image: nginx:alpine
      container_name: myapp-webserver
      working_dir: /application
      volumes:
          - .:/application
          - ./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      ports:
       - "8080:80"

    php-fpm:
      build: phpdocker/php-fpm
      container_name: myapp-php-fpm
      working_dir: /application
      volumes:
        - .:/application
        - ./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/7.3/fpm/conf.d/99-overrides.ini

. / Phpdocker / Nginx / nginx.conf

server {
    listen 80 default;

    client_max_body_size 108M;

    access_log /var/log/nginx/application.access.log;


    root /application/public;
    index index.php;

    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }

}

. / Phpdocker / php-fpm / Dockerfile (слегка изменен, чтобы добавить mysql_client и не устанавливать git во второй команде RUN)

FROM phpdockerio/php73-fpm:latest
WORKDIR "/application"

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

# Install selected extensions and other stuff
RUN apt-get update \
    && apt-get -y --no-install-recommends install  \
        php7.3-mysql php-redis php7.3-sqlite3 php-xdebug php7.3-bcmath php7.3-bz2 php7.3-gd \
        git \
        mysql-client \
    && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

. / PHP-ини-overrides.ini

upload_max_filesize = 100M
post_max_size = 108M

Я пытался использовать network_mode: host, но веб-сервер останавливается с Exit 1

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Хорошо, но, как вы помните, localhost в mysql / mariadb означает доступ через локальный сокет unix.Существуют способы совместного использования этих контейнеров.

Посмотрите здесь Соединение между док-контейнерами через гнезда UNIX

1 голос
/ 13 марта 2019

@F.Maden дал мне верное направление. Я принял его ответ, но вот как я сделал это в деталях.

В основном он сказал, что мне нужно поделиться mysqld.sock между моими службами mariadb и php-fpm

  1. Первым шагом является совместное использование папки между двумя службами. Так как я уже есть /application, который содержит конфигурацию докера /application/phpdocker, я буду использовать этот.

  2. Мне пришлось создать собственный файл my.cnf для редактирования конфигурации конфигурации по умолчанию mariadb и добавить собственный путь к сокету:

. / Phpdocker / MariaDB / my.cnf

[mysql]
socket = /application/phpdocker/shared/mysqld.sock

[mysqld]
socket = /application/phpdocker/shared/mysqld.sock
  1. Затем мне пришлось поделиться файлом конфигурации с моим контейнером mariadb

. / Docker-compose.yml

  mariadb:
  image: mariadb:10.4
  container_name: myapp-mariadb
  working_dir: /application
  volumes:
    - .:/application
    - ./phpdocker/mariadb/my.cnf:/etc/mysql/my.cnf # notice this line
  environment:
    - MYSQL_ROOT_PASSWORD=root
    - MYSQL_DATABASE=myapp
    - MYSQL_USER=forge
    - MYSQL_PASSWORD=forge
  ports:
    - "8083:3306"
  1. Я создал папку ./phpdocker/shared с привилегиями 777, где mariadb сможет создавать mysqld.sock (я не смог запустить mariadb с 755. В моем случае это используется только на местный не на производстве, так что все в порядке)

С терминала

$ mkdir ./phpdocker/shared && chmod 777 ./phpdocker/shared

А теперь проверь это!

С терминала

$ docker-compose up -d --force-recreate --build
$ docker exec -it -u $(id -u):$(id -g) myapp-php-fpm /bin/bash

Однажды в контейнере

$ mysql -u root -p -h localhost --socket=/application/phpdocker/shared/mysqld.sock
$ mysql > select user();

+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...