有一 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
chenqh 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
oneisall8955 2023-12-27 00:06:03 +08:00 via Android
宿主机和容器都可以 ping 通 docker 默认网关吧 172.17.0.1 吧,试试这个 IP
|
11
SenLief 2023-12-27 00:39:06 +08:00
如果你是单机应用,直接把容器网络配置为 host 主机,这样无论是宿主机和容器,或者容器和容器都可以用 localhost 来链接。
|
12
whale 364 天前
看着应该就是单 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 |
14
julyclyde 359 天前
你要是没用 docker 是不是就没这些事了?
|