无法连接mysql和php
有这个灯码头设置(我是一种码头新手): docker compose.yml无法连接mysql和php,php,mysql,docker,lamp,Php,Mysql,Docker,Lamp,有这个灯码头设置(我是一种码头新手): docker compose.yml version: '2' services: webserver: build: . ports: - "8080:80" - "443:443" volumes: - ./:/var/www/html links: - db db: image: mysql:5.6 ports: - "3306:33
version: '2'
services:
webserver:
build: .
ports:
- "8080:80"
- "443:443"
volumes:
- ./:/var/www/html
links:
- db
db:
image: mysql:5.6
ports:
- "3306:3306"
volumes:
- /var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=adminpasswd
- MYSQL_DATABASE=se_racken_dev
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- "88:80"
links:
- db:db
Dockerfile
FROM php:5.6-apache
RUN apt-get update -y && apt-get install -y libpng-dev curl libcurl4-openssl-dev
RUN docker-php-ext-install pdo pdo_mysql gd curl
RUN a2enmod rewrite
RUN service apache2 restart
只是无法让我当地的环境发挥作用
从localhost:8088获取此错误消息:
SQLSTATE[HY000][2002]没有这样的文件或目录
如何配置docker设置以克服此连接问题
这里有一些提示:
我是否需要安装vim并执行上面的建议,或者我可以在docker文件中解决它?在
webserver
图像上,您应该定义连接值,例如数据库的主机名、数据库名称、用户名和密码
您可以指定一个.env
文件,如中所示
在您的情况下,应该是:
DB_HOSTNAME=db:/var/run/mysqld/mysqld.sock
DB_USER=root
DB_PASSWORD=somepassword
DB_NAME=se_racken_dev
然后在您的Dockerfile
中指定:
FROM php:5.6-apache
ENV MYSQL_HOSTNAME="localhost"
ENV MYSQL_PASSWORD=""
ENV MYSQL_USERNAME="root"
ENV MYSQL_DATABASE_NAME=""
RUN apt-get update -y && apt-get install -y libpng-dev curl libcurl4-openssl-dev
RUN docker-php-ext-install pdo pdo_mysql gd curl
RUN a2enmod rewrite
RUN service apache2 restart
然后修改您的docker compose.yml
,如下所示:
version: '2'
services:
webserver:
build: .
ports:
- "8080:80"
- "443:443"
volumes:
- ./:/var/www/html
links:
- db
environment:
- MYSQL_HOSTNAME=$DB_HOSTNAME
- MYSQL_PASSWORD=$DB_USER
- MYSQL_USERNAME=$DB_PASSWORD
- MYSQL_DATABASE_NAME=$DB_NAME
db:
image: mysql:5.6
ports:
- "3306:3306"
volumes:
- /var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=$DB_PASSWORD
- MYSQL_DATABASE=$DB_NAME
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- "88:80"
links:
- db:db
然后可以使用php的getenv
从指定的环境变量中检索值。例如,在您的例子中,getenv('MYSQL\u DATABASE\u NAME')
将以字符串形式检索值“se\u racken\u dev”。因此,您需要修改数据库配置文件,以便使用上述函数mewned正确检索数据库连接凭据
一种简单的记忆方法是,无论您在Docker文件中通过
ENV
指定了什么,您都可以通过getenv
在webserver
image上检索。您应该定义连接值,例如数据库的主机名、数据库名称、用户名和密码
您可以指定一个.env
文件,如中所示
在您的情况下,应该是:
DB_HOSTNAME=db:/var/run/mysqld/mysqld.sock
DB_USER=root
DB_PASSWORD=somepassword
DB_NAME=se_racken_dev
然后在您的Dockerfile
中指定:
FROM php:5.6-apache
ENV MYSQL_HOSTNAME="localhost"
ENV MYSQL_PASSWORD=""
ENV MYSQL_USERNAME="root"
ENV MYSQL_DATABASE_NAME=""
RUN apt-get update -y && apt-get install -y libpng-dev curl libcurl4-openssl-dev
RUN docker-php-ext-install pdo pdo_mysql gd curl
RUN a2enmod rewrite
RUN service apache2 restart
然后修改您的docker compose.yml
,如下所示:
version: '2'
services:
webserver:
build: .
ports:
- "8080:80"
- "443:443"
volumes:
- ./:/var/www/html
links:
- db
environment:
- MYSQL_HOSTNAME=$DB_HOSTNAME
- MYSQL_PASSWORD=$DB_USER
- MYSQL_USERNAME=$DB_PASSWORD
- MYSQL_DATABASE_NAME=$DB_NAME
db:
image: mysql:5.6
ports:
- "3306:3306"
volumes:
- /var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=$DB_PASSWORD
- MYSQL_DATABASE=$DB_NAME
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- "88:80"
links:
- db:db
然后可以使用php的getenv
从指定的环境变量中检索值。例如,在您的例子中,getenv('MYSQL\u DATABASE\u NAME')
将以字符串形式检索值“se\u racken\u dev”。因此,您需要修改数据库配置文件,以便使用上述函数mewned正确检索数据库连接凭据
一个简单的记忆方法是,无论您在docker文件中通过
ENV
指定什么,您都可以通过getenv
检索MySQL卷中是否缺少斜杠?您是否检查了docker日志?我想您有权限问题。您有services.webserver.volumes:./:/var/www/html
,它定义了绑定装载卷,因此您目录中的内容将在容器中以/var/www/html的形式提供。默认情况下,代码将作为root用户在容器中运行。但是apachehttp服务器有一个不同的用户。因此,您需要为Apache HTTP服务器用户编写一个chown
脚本,使其具有对您的/var/www/html
的读取权限。请检查,以便在Dockerfile中添加一些额外的运行行。MySQL卷中是否缺少斜杠?是否检查了docker日志?我认为您有权限问题。您有services.webserver.volumes:./:/var/www/html
,它定义了绑定装载卷,因此您目录中的内容将在容器中以/var/www/html的形式提供。默认情况下,代码将作为root用户在容器中运行。但是apachehttp服务器有一个不同的用户。因此,您需要为Apache HTTP服务器用户编写一个chown
脚本,使其具有对您的/var/www/html
的读取权限。选中此项可以在Dockerfile中添加一些额外的运行行。