Docker 运行 PHP 容器,在容器内无法通过外网地址(url)连接阿里云的服务器
时间: 2020-08-20来源:V2EX
前景提要
最近在学习 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 连,没任何问题...

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行