Docker 大佬进,关于容器访问的相关问题

136 天前
 tlerbao

描述

有一 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"
1342 次点击
所在节点    Docker
22 条回复
xzysaber
136 天前
简单点的做法:在宿主机 hosts 里面配一个
127.0.0.1 mysql
Mikawa
136 天前
插眼,我一般是通过 env 来处理的,看看有没有别的好办法
NelsonZhao
136 天前
把 mysql 的 3306 端口映射出来,所有地方访问都用宿主机的内网 ip ,192.168.1.110 之类的
javalaw2010
136 天前
写容器/etc/hosts ,宿主机手动写 hosts,容器内外统一使用同一个域名进行访问,不过你这么玩儿是不符合最佳实践的,后面还有有路径的坑等着你。正规一点的做法是,你开个终端 docker compose php bash 丢那就完事了,或者像 laravel 的 sail 一样写一个外部脚本包装容器相关的命令。
chenqh
136 天前
docker network host ?
tlerbao
136 天前
@javalaw2010 你的意思是进入容器操作? sail 的脚本有地址吗,去看看怎么回事?
hingle
136 天前
不要进容器里。做法是用环境变量。
PHP 容器配置个环境变量比如 MYSQL_HOST=mysql ,在宿主机就用 MYSQL_HOST=127.0.0.1
tlerbao
136 天前
@hingle 我每台明白您说的呢?
yumusb
136 天前
在容器 environment 设置一个 env ,然后 php 去获取这个 env ,如果能获取到则说明是容器内,使用 env ,否则使用 127.0.0.1
oneisall8955
135 天前
宿主机和容器都可以 ping 通 docker 默认网关吧 172.17.0.1 吧,试试这个 IP
SenLief
135 天前
如果你是单机应用,直接把容器网络配置为 host 主机,这样无论是宿主机和容器,或者容器和容器都可以用 localhost 来链接。
whale
135 天前
看着应该就是单 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
javalaw2010
135 天前
julyclyde
130 天前
你要是没用 docker 是不是就没这些事了?
tlerbao
129 天前
@julyclyde 我要是不生来这世上好像都没有这些烦恼哈哈
julyclyde
128 天前
@tlerbao 看问题不易无限扩大化啊
你遇到这问题本来是没啥问题的,单纯因为你用了 docker
这之间存在因果关系和双射关系
tlerbao
127 天前
@julyclyde #16 不用 docker 用啥?
julyclyde
126 天前
@tlerbao 直接本地运行就行啦啊,没那么多破事需要解决
tlerbao
126 天前
@julyclyde #18 不用考虑线上线下尽可能环境统一的情况吗?不用考虑内存占用 维护性什么的吗?

安装方便之类的哈哈。
julyclyde
126 天前
@tlerbao 你现在这基础知识的水平,谈这个还太早

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1003561

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX