V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lzj307077687
V2EX  ›  Docker

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

  •  
  •   lzj307077687 · 2020-07-16 11:37:59 +08:00 · 2178 次点击
    这是一个创建于 1589 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习 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 连,没任何问题...

    第 1 条附言  ·  2020-07-16 15:31:56 +08:00
    已解决:
    跟 DNS 无关,RDS 白名单问题。
    我都忘了有这设置,然后进去还能看到自己两年前设置过的记录....
    5 条回复    2020-07-16 15:32:51 +08:00
    byzf
        1
    byzf  
       2020-07-16 13:55:49 +08:00
    你先用 mysql 命令行直连一下, 不行就 dig 一下
    lzj307077687
        2
    lzj307077687  
    OP
       2020-07-16 14:08:49 +08:00
    @byzf #1 我刚另外运行了个 MySQL 容器使用 mysql 命令直连,也是跟 PHP 一样的情况:
    通过 ip 可以,但使用 url 就不行,同样是超时。
    但如果是直接安装的 MySQL 倒是没问题的
    现在能排除是 PHP 的问题,我看看是不是 DNS 的原因
    谢谢提醒~
    GM
        3
    GM  
       2020-07-16 14:30:11 +08:00
    进容器 shell 里 ping 一下看看,感觉大概率是 dns 问题
    lzj307077687
        4
    lzj307077687  
    OP
       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
        5
    lzj307077687  
    OP
       2020-07-16 15:32:51 +08:00
    @GM @byzf 已解决 RDS 白名单问题
    健忘了~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1716 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.