
有一 MySql 容器和 PHP 容器
宿主机 Navicat 可以通过 127.0.0.1 链接
PHP 程序的 database.php 必须配置成 HOSTNAME=mysql (容器名),PHP 程序才能访问数据库
进入 PHP 容器,运行 php artisan 操作操作数据库是可以的 因为 php 容器好像可以通过 mysql 这个容器名访问到数据库
但是,宿主机也装有 PHP ,宿主机在项目下 php artisan 操作数据库就链接不到了,猜测因为宿主机的 php 找不到 mysql 这个 hostname 。
我怎么改配置或者怎么做可以让各方都可以成功访问到 mysql 呢? 每次都进容器 php artisan\php think 的很麻烦。
php: build: context: ./services/php args: PHP_VERSION: php:${PHP_VERSION}-fpm-alpine CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL} PHP_EXTENSIONS: ${PHP_EXTENSIONS} TZ: "$TZ" container_name: php ports: - "8200:8200" expose: - 9501 extra_hosts: - "www.site1.com:172.17.0.1" volumes: - ${SOURCE_DIR}:/www/:rw - ${PHP_PHP_CONF_FILE}:/usr/local/etc/php/php.ini:ro - ${PHP_FPM_CONF_FILE}:/usr/local/etc/php-fpm.d/www.conf:rw - ${PHP_LOG_DIR}:/var/log/php - ${DATA_DIR}/composer:/tmp/composer - ~/.ssh:/root/.ssh/ restart: always cap_add: - SYS_PTRACE networks: - default mysql: image: mysql:${MYSQL5_VERSION} container_name: mysql ports: - "${MYSQL5_HOST_PORT}:3306" volumes: - ${MYSQL5_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro - ${DATA_DIR}/mysql5:/var/lib/mysql/:rw restart: always networks: - default environment: MYSQL_ROOT_PASSWORD: "${MYSQL5_ROOT_PASSWORD}" TZ: "$TZ" 1 xzysaber 2023-12-26 16:41:02 +08:00 简单点的做法:在宿主机 hosts 里面配一个 127.0.0.1 mysql |
2 Mikawa 2023-12-26 17:53:24 +08:00 插眼,我一般是通过 env 来处理的,看看有没有别的好办法 |
3 NelsonZhao 2023-12-26 17:59:23 +08:00 把 mysql 的 3306 端口映射出来,所有地方访问都用宿主机的内网 ip ,192.168.1.110 之类的 |
4 javalaw2010 2023-12-26 17:59:35 +08:00 写容器/etc/hosts ,宿主机手动写 hosts,容器内外统一使用同一个域名进行访问,不过你这么玩儿是不符合最佳实践的,后面还有有路径的坑等着你。正规一点的做法是,你开个终端 docker compose php bash 丢那就完事了,或者像 laravel 的 sail 一样写一个外部脚本包装容器相关的命令。 |
5 simple2025 2023-12-26 18:22:34 +08:00 docker network host ? |
6 tlerbao OP @javalaw2010 你的意思是进入容器操作? sail 的脚本有地址吗,去看看怎么回事? |
7 hingle 2023-12-26 19:08:42 +08:00 不要进容器里。做法是用环境变量。 PHP 容器配置个环境变量比如 MYSQL_HOST=mysql ,在宿主机就用 MYSQL_HOST=127.0.0.1 |
9 yumusb 2023-12-26 20:49:24 +08:00 在容器 environment 设置一个 env ,然后 php 去获取这个 env ,如果能获取到则说明是容器内,使用 env ,否则使用 127.0.0.1 |
10 itechify PRO 宿主机和容器都可以 ping 通 docker 默认网关吧 172.17.0.1 吧,试试这个 IP |
11 SenLief 2023-12-27 00:39:06 +08:00 如果你是单机应用,直接把容器网络配置为 host 主机,这样无论是宿主机和容器,或者容器和容器都可以用 localhost 来链接。 |
12 whale 2023-12-27 08:51:18 +08:00 看着应该就是单 Docker 环境,编排的 YAML 文件,PHP 的部分加(参考 MySQL 部分),如: ```yaml environment: DB_HOST: "${MySQL_HOST}" ``` 然后 database.php 配置改成的 HOSTNAME=${DB_HOST},PHP 应该也可以调用环境变量,这样就不用每次进容器修改 宿主机访问 MYSQL 直接把容器端口暴漏出来,像 127.0.0.1:3306 就能访问 端口暴露以后并开通了网络策略,其他的服务器用宿主机的 IP:Prot 访问 MySQL |
13 javalaw2010 2023-12-27 10:16:04 +08:00 |
14 julyclyde 2024-01-01 20:57:03 +08:00 你要是没用 docker 是不是就没这些事了? |
16 julyclyde 2024-01-03 11:13:12 +08:00 |
19 tlerbao OP |