最近在学习 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 |