【问题标题】:Docker - Ubuntu - Nginx - MariaDB - Connection refusedDocker - Ubuntu - Nginx - MariaDB - 连接被拒绝
【发布时间】:2017-05-20 16:43:59
【问题描述】:

我正在尝试使用 Docker - Ubuntu - Nginx - MariaDB 在 OSX 上设置一个 docker 容器来运行 Laravel 应用程序

我的 docker 设置是:

version: "2"
services:
  nginx:
      build:
          context: ./nginx
      ports:
          - "8080:80"
      volumes:
          - ./app:/var/app
  fpm:
      build:
          context: ./fpm
      volumes:
          - ./app:/var/app
      expose:
          - "9000"
      environment:
          - "DB_HOST=db"
          - "DB_DATABASE=laravel_db"
  db:
      image: mariadb
      ports:
          - "33061:3306"
      environment:
          - MYSQL_ROOT_PASSWORD=root
          - MYSQL_DATABASE=laravel_db
      volumes:
          - ./database:/var/lib/mysql

还有 2 个 docker 文件:

FROM nginx
ADD ./default.conf /etc/nginx/conf.d/
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
CMD service nginx start

FROM ubuntu:latest
RUN apt-get update && apt-get install -y software-properties-common language-pack-en-base \
    && LC_ALL=en_US.UTF-8 add-apt-repository -y ppa:ondrej/php \
    && apt-get update \
    && apt-get install -y php7.0 php7.0-fpm php7.0-mysql mcrypt php7.0-gd curl \
       php7.0-curl php-redis php7.0-mbstring sendmail supervisor \
    && mkdir /run/php \
    && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

RUN sed -i -e 's/listen = \/run\/php\/php7.0-fpm.sock/listen = 0.0.0.0:9000/g' /etc/php/7.0/fpm/pool.d/www.conf \
    && sed -i -e 's/;daemonize = yes/daemonize = no/g' /etc/php/7.0/fpm/php-fpm.conf

WORKDIR /var/app

EXPOSE 9000

CMD ["/usr/bin/supervisord"]

到目前为止一切顺利。我可以以 localhost:8080 身份访问 Laravel App 主页,并使用 Sequel Pro 访问 MySQL DB。

但是当访问需要DB查询的Laravel路由时,返回“连接被拒绝”

然后我创建一个原始 PHP 文件来进行数据库连接测试:

$link = mysqli_connect('127.0.0.1', 'root', 'root', 'laravel_db', 33061);
if(!$link) {
    die('failed to connect to the server: ' . mysqli_connect_error());
}

我也收到连接被拒绝错误。

我尝试使用 127.0.0.1 和 localhost 但没有希望。

试图用谷歌搜索它,但大多数答案都是关于端口未发布...

谢谢

【问题讨论】:

  • 你能试试$link = mysqli_connect('db', 'root', 'root', 'laravel_db', 33061);吗?
  • 不,我使用的正是该代码,但连接被拒绝

标签: php mysql ubuntu nginx docker


【解决方案1】:

使用docker-compose时需要使用link指令连接各种docker容器。即,如果您想让 docker 容器 A 与 docker 容器 B 通信,则需要将它们“链接”

docker-compose documentation on links

【讨论】:

  • 我在nginx 服务中添加了links,但仍然被拒绝连接。尝试过:链接:fpm 或 db
  • 看起来您使用的是 docker-compose v2,所以它实际上不是“链接指令”。你会想要使用“depends_on:db”或任何你想连接的东西。关键是主机将是“db”(或任何容器名称),它不会是“localhost”/127.0.0.1
  • 我将其替换为depends_on: - db - fpm,但仍然如此。我需要在docker-composer up -d 之前重建或做一些事情吗?
  • 你不需要重建镜像; docker-compose 只是设置和运行容器。您的问题很可能是您连接到 localhost 而不是 db (来自您的代码 $link = mysqli_connect('127.0.0.1', 'root', 'root', 'laravel_db', 33061);)。主机名将是db;它不会是127.0.0.1。在容器中,您应该执行getent hosts db,您应该会看到一个私有 IP 地址。如果您看到此私有 IP 地址,则表示您当前的容器已链接到 db 容器。如果您没有看到地址,则表示容器未链接。
  • 我可以看到db的IP地址,但仍然无法连接。我尝试了 dbhost:db、localhost、127.0.0.1 甚至是 db 私有 IP 地址。还是不行
猜你喜欢
  • 2020-04-24
  • 2021-06-27
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
相关资源
最近更新 更多