
最近在学习 Docker,尝试在 PHP 的 Laravel 项目的根目录增加一个 docker 文件夹,文件夹内结构如下
├── composer ├── docker-compose.yml ├── Dockerfile └── nginx └── conf.d ├── demo.conf └── ssl ├── ssl.key └── ssl.pem 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 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 byzf 2020-07-16 13:55:49 +08:00 你先用 mysql 命令行直连一下, 不行就 dig 一下 |
2 lzj307077687 OP @byzf #1 我刚另外运行了个 MySQL 容器使用 mysql 命令直连,也是跟 PHP 一样的情况: 通过 ip 可以,但使用 url 就不行,同样是超时。 但如果是直接安装的 MySQL 倒是没问题的 现在能排除是 PHP 的问题,我看看是不是 DNS 的原因 谢谢提醒~ |
3 GM 2020-07-16 14:30:11 +08:00 进容器 shell 里 ping 一下看看,感觉大概率是 dns 问题 |
4 lzj307077687 OP @GM 进了容器,不改任何配置 ping 阿里云的 MySQL 地址,能 ping 通。 然后到 /etc/resolv.conf 把 DNS 改成 4 个 8 、4 个 114 、宿主机上的阿里云内部 DNS(100 开头) 连阿里云 RDS MySQL 均超时 |
5 lzj307077687 OP |