当前位置: 首页 > 知识库问答 >
问题:

从Docker容器使用localhost连接到MariaDB

司徒墨竹
2023-03-14

首先我看了这些链接

  • 从localhost连接到Docker MySQL容器?

但作为docker的初学者。这对我没有帮助。

您需要知道的是:

  • 是的,我需要localhost。我正在开发一个直接与数据库交互的应用程序。它创建/删除用户权限,并允许一些用户从远程访问以有限的权限访问。初始化时,应用程序将删除默认的远程访问根和伪造用户,并授予他们对localhost的完全权限。
  • 我用的是https://phpdocker.io生成的docker-compose.yml
  • Ubuntu 18.10
  • Docker版本18.09.3,构建774a1f4
  • docker-comment版本1.21.0,构建未知
  • 我使用docker只是为了开发目的。在生产上,我使用锻造

./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_客户端,而不是在第二次运行命令时安装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\u模式:host,但它会使Web服务器在退出1时停止

共有2个答案

简成仁
2023-03-14

@马登给了我正确的方向。我接受了他的回答,但下面是我如何详细回答的。

他基本上说过,我需要在我的服务mariadb和php fpm之间共享mysqld.sock

>

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

./phpdocker/mariadb/my.cnf

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

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

./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"

从终点站

$ 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 |
+----------------+
融伯寅
2023-03-14

好的,但是请记住,localhost在mysql/mariadb中意味着通过本地unix套接字访问。容器之间有共享这些的方法

看看这里通过UNIX套接字连接docker容器

 类似资料:
  • 问题内容: 我在本地主机上运行mysql,可以通过运行以下命令进行连接: 我还使用以下命令运行了Docker容器: 我想从docker容器访问Mysql数据库。所以我也从docker容器输入: 但这给了我错误: 我究竟做错了什么?端口似乎是正确的。 编辑1在码头工人的 输出: 问题答案: 即使将MySQL配置为侦听所有接口,然后从容器通过非环回IP访问MySQL,您仍可能会发现Docker的路由,

  • 我已经使用docker工具箱在视窗机器上安装了docker。我也在我的视窗机器上安装了mysql,服务器运行在端口3306上(localhost-127.0.0.1-在docker机器之外)。我在一个名为“micra-workq-svc”的docker网络内部的docker容器中运行一个冲刺启动应用程序,我希望在docker内部运行的应用程序连接到本地主机。我花了几个小时在谷歌上搜索,没有一个链接

  • 问题内容: 有某些功能,例如不带https的JavaScript服务工作者,仅可在localhost上运行,但是当我使用在docker- machine上运行的docker-compose在docker容器内运行我的应用程序时,我需要使用我从那里得到的地址 有没有办法映射到该IP? 问题答案: 您可以向前添加VirtualBox端口,以将Docker主机上的端口映射到本地计算机。 假设您的dock

  • 我想在一个容器中运行 RabbitMQ,在另一个容器中运行工作进程。工作进程需要访问 RabbitMQ。 我希望这些通过进行管理。 这是我的<代码>docker compose。迄今为止,yml文件: 所以我暴露了RabbitMQ端口。工作进程使用以下URL访问RabbitMQ: 这是他们在官方教程中使用的,但是已被替换为,因为容器应该可以使用与容器名称相同的主机名来发现: 默认情况下,“合成”会

  • 问题内容: 所以我想连接到我在主机上运行的mongodb(DO Drop,Ubuntu 16.04)。它在localhost 的默认端口上运行。 然后,我使用mup将我的Meteor应用程序部署在我的DO Drop上,该DO Drop使用docker在容器内运行Meteor应用程序。到目前为止,一切都很好。使用标准连接URL将应用程序连接到mongodb。现在我有以下问题: 显然不能在docker

  • 我正在尝试从另一个码头工人容器连接到 kafka docker 容器。但它没有连接。 为了运行kafka和zookeeper,我使用了docker compose文件: 容器docker compose 17138956372294708100 _ kafkatest . producer _ 1和docker compose 17138956372294708100 _ kafkatest .