我正在使用以下技术部署应用程序:(Laravel+MariaDB+phpMyAdmin)
在 dockerfile 中创建应用程序映像,并在 docker-compose 中在网络中编排所有服务,并通过 .env 中定义的环境变量(称为端口和密码)。
不幸的是,有些东西无法正常工作,因为您无权访问数据库,要检查使用的每个容器,但它们没有显示任何错误,并且当我有连接时尝试远程连接到数据库时,从一个容器 ping 到另一个容器也存在一个连接,即使在应用程序容器内到数据库也是如此。
.env
DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3307
DB_DATABASE=mysql
DB_USERNAME=root
DB_PASSWORD=
DB_ADMIN_PORT=8086
docker-compose.yml
version: '3'
services:
app:
build:
context: .
target: ${APP_ENV}
dockerfile: Dockerfile
container_name: app
ports:
- "${APP_PORT}:80"
volumes:
- /user/dir:/var/www/html
env_file:
- .env
networks:
- name_network
depends_on:
- database
database:
image: mariadb:10.5.6
container_name: appdb
ports:
- "${DB_PORT}:3306"
environment:
MYSQL_DATABASE: mysql
MYSQL_USER: root
MYSQL_ALLOW_EMPTY_PASSWORD: 1
volumes:
- db_data:/var/lib/mysql
env_file:
- .env
networks:
- name_network
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
ports:
- "${DB_ADMIN_PORT}:80"
environment:
PMA_HOST: database
PMA_PORT: ${DB_PORT}
env_file:
- .env
networks:
- name_network
networks:
networks:
name_network:
driver: bridge
volumes:
db_data:
Dockerfile
FROM php:8.2.4-apache AS production
ENV COMPOSER_ALLOW_SUPERUSER=1
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
zip \
unzip
RUN a2enmod rewrite
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql
COPY . /var/www/html
RUN chown -R www-data:www-data storage
RUN chown -R $USER:www-data /var/www/html/storage/
RUN composer clear-cache
RUN composer install --no-dev --ignore-platform-req=ext-zip --no-scripts
#RUN php artisan config:cache
EXPOSE 8085
CMD ["apache2-foreground"]
database.php
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'database'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'mysql'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
您正在使用端口“3307”(环境变量
DB_PORT
的值)进行连接,但您应该连接到端口“3306”,因为这是 MySQL/MariaDB 正在容器内侦听的端口。
在您的容器之外,该服务确实由您的端口 3307 暴露
# docker-compose.yaml
services:
database:
ports:
- "${DB_PORT}:3306"
我对您的配置的建议:
# .env
DB_PORT=3306
EXPOSE_DB_PORT=3307
# docker-compose.yaml
services:
database:
ports:
- "${EXPOSE_DB_PORT}:3306"
和你的
database.php
原样