【问题标题】:Connect to MariaDB with localhost from Docker container从 Docker 容器使用 localhost 连接到 MariaDB
【发布时间】:2019-03-13 12:53:59
【问题描述】:

首先我确实阅读了这些链接

但是作为 docker 的初学者。它没有帮助我。

你需要知道的:

  • 是的,我需要本地主机。我正在开发一个可以交互的应用程序 直接用数据库。它创建/删除用户权限和 允许某些用户以有限的权限从远程访问 使用权。初始化后,应用程序将放弃对 root 和 forge 用户的默认远程访问权限,并授予他们对 localhost 的完全权限。
  • 我正在使用由https://phpdocker.io 生成的 docker-compose.yml
  • Ubuntu 18.10
  • Docker 版本 18.09.3,构建 774a1f4
  • docker-compose 版本 1.21.0,构建未知
  • 我仅将 docker 用于开发目的。在生产中我使用forge

./docker-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 并且不在第二个 RUN 命令中安装 git)

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-ini-overrides.ini

upload_max_filesize = 100M
post_max_size = 108M

我尝试使用network_mode: host,但它使网络服务器以Exit 1 停止

【问题讨论】:

  • 必须localhost的约束从何而来?
  • 那么您的意思是您需要通过本地 unix 套接字访问 mysql 并且不允许访问真正的 TCP/IP?猜猜这就是 localhost 在 MariaDB 中的含义
  • @DavidMaze PHP(Laravel 项目)我正在处理作为设置数据库的迁移文件。它执行创建root@localhostforge@localhost、删除root@% 和撤销/授予forge@% 权限的SQL,在应用程序生命周期中,它将创建、删除用户等。我们放弃对@987654337 的访问权限的原因@ 是因为您的客户需要对某些视图进行可读的远程访问。但我们不希望远程访问具有高权限的用户。
  • @F.Madsen 从 webserver 我需要使用 mysql -u root -h localhost -pmysql -u forge -h localhost -p 连接到 mariadb

标签: php mysql docker docker-compose


【解决方案1】:

好的,但请记住,mysql/mariadb 中的 localhost 表示通过本地 unix 套接字访问。有多种方法可以在容器之间共享这些。

看看这里Connection between docker containers via UNIX sockets

【讨论】:

  • 谢谢!但是它如何与 docker-compose 一起工作?这是我尝试过的:docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock busybox 在另一个终端中:docker-compose up -d 然后docker exec -it -u $(id -u):$(id -g) myapp-php-fpm /bin/bash 最后在容器中mysql -u root -h localhost -p 但我得到了ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
  • 我还尝试用/var/run/mysqld/mysqld.sock:/var/mysqld/mysqld.sock 替换/var/run/docker.sock:/var/run/docker.sock,但没有成功。 (对不起,我对docker一点都不熟悉)
  • 那么这并不容易......基本上你需要在本地主机上创建一个文件夹来保存套接字文件。然后将此文件夹安装在 mariadb 和 Web 容器中。这将在 compose yml 文件的“volumes:”部分中。这样做,您将有效地在本地文件系统上创建数据库套接字。还要确保套接字上的权限是正确的。
  • 我让它工作!非常感谢你!我将就我是如何做到的做一个额外的答案。
  • 太好了,如果你对泊鲸好,那就太好了:)
【解决方案2】:

@F.Maden 给了我正确的方向。我接受了他的回答,但我是这样详细说明的。

他基本上说过,我需要在我的服务 ma​​riadbphp-fpm

之间共享 mysqld.sock
  1. 第一步是在两个服务之间共享一个文件夹。既然我已经 有包含 docker 配置 /application/phpdocker/application,我将重用这个。

  2. 我必须创建一个自定义 my.cnf 文件来编辑默认 ma​​riadb 配置配置并添加自定义套接字路径:

./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 (我无法使用 755 启动 mariadb。在我的情况下,这仅用于在本地而不是在生产中,所以没关系)

从终端

$ 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 |
+----------------+

【讨论】:

  • 伟大而清晰的描述。您可以通过创建一个 unix 组来避免 777 权限问题,例如。具有特定 GID 的 dockergrp。 X 。然后在所有镜像中执行相同的操作,并确保在容器中创建的用户被授予具有 GID X 的组。unix/linux 是特殊的,它不关心组的名称,只关心 GID。现在770就够了。同一组通常可用于所有运行的容器。
  • @F.Madsen 感谢您的提示!我一定会做到的。我已经在 docker 上学到了这个问题,现在你已经在回答我的下一个问题了。再次,非常感谢!
【解决方案3】:

如果与 DB 的连接问题仍然存在:

我们可以查询 IP DB 容器有什么:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name>

我们将收到容器 IP(例如:172.21.0.3);

在此之后,我们可以将此 IP 放入连接“主机”部分。

享受吧!

参考How can I access my docker maria db?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多