跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Docker 运行 PHP 容器,在容器内无法通过外网地址(url)连接阿里云的服务器
未分類
21 7 月 2020

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

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

資深大佬 : lzj307077687 6

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

大佬有話說 (5)

  • 資深大佬 : byzf

    你先用 mysql 命令行直连一下, 不行就 dig 一下

  • 主 資深大佬 : lzj307077687

    @byzf #1 我刚另外运行了个 MySQL 容器使用 mysql 命令直连,也是跟 PHP 一样的情况:
    通过 ip 可以,但使用 url 就不行,同样是超时。
    但如果是直接安装的 MySQL 倒是没问题的
    现在能排除是 PHP 的问题,我看看是不是 DNS 的原因
    谢谢提醒~

  • 資深大佬 : GM

    进容器 shell 里 ping 一下看看,感觉大概率是 dns 问题

  • 主 資深大佬 : lzj307077687

    @GM 进了容器,不改任何配置 ping 阿里云的 MySQL 地址,能 ping 通。
    然后到 /etc/resolv.conf 把 DNS 改成 4 个 8 、4 个 114 、宿主机上的阿里云内部 DNS(100 开头)
    连阿里云 RDS MySQL 均超时

  • 主 資深大佬 : lzj307077687

    @GM @byzf 已解决 RDS 白名单问题
    健忘了~

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具