【发布时间】:2019-08-19 19:18:03
【问题描述】:
我使用 Mac OSX 和 MAMP。 我想为 web 项目制作一个 Docker 容器,因为它使用 php 5.5 版本,我不想对我的 MAMP 进行更改。 所以这里是 docker-compose.yml
version: '2'
services:
www:
build: "./docker/apache"
volumes:
- .:/var/www
- ./docker/silexx.conf:/etc/apache2/sites-enabled/silexx.conf
working_dir: "/var/www"
command : "bash -c 'source /etc/apache2/envvars; apache2 -DFOREGROUND'"
ports:
- 80:80
links:
- mysql
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'silexx_dev'
MYSQL_ROOT_PASSWORD: 'root'
ports:
- 3306:3306
pma:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
restart: always
ports:
- 8080:80
volumes:
- /sessions
这是 Dockerfile:
FROM debian:jessie
RUN apt-get update
RUN apt-get install -y --force-yes apt-transport-https apache2 php5 php5-cli libicu-dev php5-gd php5-curl php5-mysql php5-memcached php5-intl php5-json php5-mcrypt curl sudo
RUN a2enmod rewrite
# install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN apt-get install -y --force-yes make git locales gcc g++
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen
ENV LC_ALL en_US.UTF-8
RUN rm /etc/apache2/sites-*/*
COPY default /etc/apache2/sites-available/default.conf
RUN a2ensite default
CMD "source /etc/apache2/envvars && apache2 -DFOREGROUND"
ENV LANG en_US.UTF-8
CMD "/etc/init.d/mysql start"
# forward request and error logs to docker log collector
RUN ln -sf /proc/1/fd/1 /var/log/apache2/access.log
RUN ln -sf /proc/1/fd/2 /var/log/apache2/error.log
EXPOSE 80
我做了一个小虚拟主机:
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/var/www/core/"
ServerName demo.silexx.local
ServerAlias demo.silexx.local
#ErrorLog "logs/silexx.com-error_log"
#CustomLog "logs/silexx.com-access_log" common
</VirtualHost>
然后我让 docker-compose up,我生成我的容器。
当我去控制台并 mysql -h localhost -P 3306 --protocol=tcp -u root -proot
效果很好!
但在我的导航器中出现 2002 错误... SQLSTATE[HY000] [2002] 无法通过socket '/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2)
但是我已经修改了我的凭据...
define('DB_HOST', 'localhost');
define('DB_INTRANET', 'silexx_dev');
define('DB_INTRANET_UTI', 'root');
define('DB_INTRANET_PWD', 'root');
$oPDO = new PDO ('mysql:host=' . DB_HOST . ';dbname=' . DB_INTRANET, DB_INTRANET_UTI, DB_INTRANET_PWD);
$oPDO -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
老实说,我不明白... :s 请问你有什么想法吗?
谢谢。
【问题讨论】:
-
有时
localhost不起作用但define('DB_HOST', '127.0.0.1');(stackoverflow.com/questions/31413728/…) -
@Nigel 你应该看看解决的答案:在这里,inside 一个容器,主机名必须是链接容器的名称。在容器之外,
localhost和127.0.0.1的含义相同,因为现在几乎每个现代操作系统都将localhost别名为127.0.0.1。 -
@AlexRock,因为 OP 在 docker-compose.yml 中向主机公开 3306,这应该允许您通过主机进行连接。同样至于区别 - stackoverflow.com/a/31414252/1213708 - 并且错误表明它正在尝试使用
'/var/run/mysqld/mysqld.sock'那么这将表明这是问题所在。 -
对不起@Nigel 但亚历克斯是对的,那么我的容器就可以了。
-
不,它不起作用。
标签: php mysql apache docker dockerfile