我对MariaDB配置和Docker非常陌生。以下是一点背景:我需要更新Laravel 5网站到10.x,但Laravel 10.x所需的php 8.2不能直接在官方仓库中获得。我试着按照这个tutorial on installing php 8.2 on Debian 11和它的工作,但后来我不能使用phpmyadmin了。
这就是为什么我退回到保持不动我的本地工作“apache / php 7.4 / mariadb / phpmyadmin”安装与现有的数据库和使用Docker容器,将提供一个准备使用php 8.2环境。
所以我用这个Dockerfile(位于我的Laravel 10.0项目中)生成了一个php 8.2的镜像:
FROM php:8.2-apache
# Set working directory
WORKDIR /var/www/html
#This command installs both the PDO and PDO MySQL extensions. They are required for Laravel to communicate with the MariaDB database.
RUN docker-php-ext-install pdo pdo_mysql
# Copy your Laravel project files into the container
COPY . /var/www/html
# Install any required dependencies, e.g., composer
RUN apt-get update && apt-get install -y git zip unzip && rm -rf /var/lib/apt/lists/*
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install Laravel dependencies
RUN composer install
### USELESS (see @Danblack answer below https://stackoverflow.com/a/77005054/6351897) ###
# Expose the port
# EXPOSE 80
# Start Apache server
# CMD ["apache2-foreground"]
我用sudo docker run --rm -it --name php_container -v $(pwd):/var/www/html -p 8000:8000 php8-2_laravel10_image php artisan serve --host=0.0.0.0 --port=8000
运行了它
所以欢迎页面可以显示,但我总是得到“Mysql连接拒绝”。我做了一个test.php(其实chatGPT给了我一个电梯)其内容如下所示:
<?php
$host = '172.17.0.1'; // Docker bridge network IP
#$host = "localhost";
$port = 3306; // MySQL port
$your_db_name = "awesomeDB";
$your_db_username = "user";
$your_db_password = "password";
try {
$conn = new PDO("mysql:host=$host;port=$port;dbname=$your_db_name", $your_db_username, $your_db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully!";
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
我用docker exec -it php_container php test.php
在容器中运行了这个脚本。
然而我不明白的是,docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' php_container
返回“172.17.0.2“,这是我在(Debian)主机mysql中按照以下指令授予的:mysql -u root -p
后接GRANT ALL PRIVILEGES ON *.* TO 'user'@'172.17.0.2' IDENTIFIED BY 'password';
和FLUSH PRIVILEGES
你会注意到我授权了172.17.0.2,而test.php中的主机是172.17.0.1(如果我在test.php中使用.2,那么我会得到“连接拒绝”)。
此外,我可以成功ping两个IP(172.17.0.1和.2),而docker container ps
只显示一个容器正在运行。
因此,尽管通过主机172.17.0.1(在test.php中)和授予的IP 172.17.0.2(在MariaDB特权中),容器可以访问debian主机数据库,但我不明白为什么ot工作。此外,我不确定能够复制所有这些技巧后,在维护周期的网站。
最后,有人能解释一下为什么具有与主机MariaDB服务允许的IP不同的面向IP(来自网关的IP)的容器可以访问数据库吗?
还有为什么尽管主机上的ifconfig
在inet 172.17.0.1上报告docker0
,我仍然能够ping 172.17.0.2(只能从容器内访问,而不能从主机访问)?
希望这是足够清楚,以获得帮助:-)!
1条答案
按热度按时间ldioqlga1#
MariaDB授权是用户连接的地方。
172.17.0.1 到172.17.0.2是Docker创建的点对点链接,允许容器与主机通信。主机看到来自172.17.0.2的流量,容器IP和容器看到主机为172.17.0.1。IP双向通信需要两个IP的路由和可见性。
php是php连接的地方。这些应该是不同的,因为PHP不在MariaDB容器上。
注意:请停止将
FLUSH PRIVILEGES
与GRANT
和CREATE USER
语句一起使用,这是不必要的。同样在复制时,你不需要为php容器设置EXPOSE或CMD,因为默认情况下它是从原始容器派生的。