最近在学习 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 连,没任何问题...
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.