Docker 运行 PHP 容器,在容器内无法通过外网地址(url)连接阿里云的服务器

2020-07-16 11:37:59 +08:00
 lzj307077687

最近在学习 Docker,尝试在 PHP 的 Laravel 项目的根目录增加一个 docker 文件夹,文件夹内结构如下

├── composer
├── docker-compose.yml
├── Dockerfile
└── nginx
    └── conf.d
        ├── demo.conf
        └── ssl
            ├── ssl.key
            └── ssl.pem

Dockerfile

FROM nginx:latest AS stage-nginx

FROM php:7.1-fpm AS stage-php

WORKDIR /usr/local/bin

COPY composer .

RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini \
    && apt-get update \
    && apt update ; yes "" |apt install git \
    && apt-get install -y \
        zip \
        unzip \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
        libxslt1-dev \
    && rm -r /var/lib/apt/lists/* \
    && ./docker-php-ext-install pdo_mysql \
    && ./docker-php-ext-install mysqli \
    && ./docker-php-ext-install bcmath \
    && ./docker-php-ext-install mbstring \
    && ./docker-php-ext-install opcache \
    && ./docker-php-ext-install xsl \
    && ./docker-php-ext-install pcntl \
    && ./docker-php-ext-install -j$(nproc) iconv \
    && ./docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && ./docker-php-ext-install -j$(nproc) gd \
    && pecl install igbinary \
    && docker-php-ext-enable igbinary \
    && yes "" |pecl install lzf \
    && docker-php-ext-enable lzf \
    && yes "" |pecl install redis-4.0.1 \
    && docker-php-ext-enable redis


docker-compose.yml

version: "3.4"

services:

  nginx-t:
    build:
      context: .
      target: stage-nginx
    volumes:
      - ../:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    ports:
      - "80:80"
      - "443:443"
    networks:
      net-t:
        ipv4_address: 172.18.0.2

  php-t:
    build:
      context: .
      target: stage-php
    volumes:
      - ../:/var/www/html
    ports:
      - "9000:9000"
    networks:
      net-t:
        ipv4_address: 172.18.0.3

networks:
   net-t:
      ipam:
         config:
         - subnet: 172.18.0.0/20
      driver: "bridge"

原本 Docker 是带上了 MySQL 的,项目在使用本地 Docker 的 MySQL 时跑起来一切正常。
但考虑到真实环境下一般不会用本机装 MySQL,可能会远程连阿里云等第三方的数据库。
故把项目配置文件的数据库改成阿里云 RDS 的 MySQL,数据库用户什么的均已创建并分配好相应权限。
但阿里云数据库用的是一个 url 来进行连接:

xx-xxxxxxxxxxxx.mysql.rds.aliyuncs.com

但在进入容器(docker-compose exec container_name /bin/bash),使用 php artisan 命令做数据表迁移或其他涉及数据库的命令时,会长时间无响应。
在 CLI 模式下用 POD 连数据库的话也是无响应,不同使用 artisan 的是到一定时间会报超时,可能 artisan 在不断重试,或者重试次数较多,我都是等 5 分钟左右就关掉。

php -r "new PDO('mysql:host=0.0.0.0;dbname=db_name', 'username', 'pwd');"

接下里我尝试在另一台服务器上装了个 mysql,同样的创建数据库、用户,分配权限,开 3306 端口,改项目配置。
但这次是直接用的服务器 ip 连,没任何问题...

2183 次点击
所在节点    Docker
5 条回复
byzf
2020-07-16 13:55:49 +08:00
你先用 mysql 命令行直连一下, 不行就 dig 一下
lzj307077687
2020-07-16 14:08:49 +08:00
@byzf #1 我刚另外运行了个 MySQL 容器使用 mysql 命令直连,也是跟 PHP 一样的情况:
通过 ip 可以,但使用 url 就不行,同样是超时。
但如果是直接安装的 MySQL 倒是没问题的
现在能排除是 PHP 的问题,我看看是不是 DNS 的原因
谢谢提醒~
GM
2020-07-16 14:30:11 +08:00
进容器 shell 里 ping 一下看看,感觉大概率是 dns 问题
lzj307077687
2020-07-16 15:09:31 +08:00
@GM 进了容器,不改任何配置 ping 阿里云的 MySQL 地址,能 ping 通。
然后到 /etc/resolv.conf 把 DNS 改成 4 个 8 、4 个 114 、宿主机上的阿里云内部 DNS(100 开头)
连阿里云 RDS MySQL 均超时
lzj307077687
2020-07-16 15:32:51 +08:00
@GM @byzf 已解决 RDS 白名单问题
健忘了~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690525

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX