V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tlerbao
V2EX  ›  Docker

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

  •  
  •   tlerbao · 2023-12-26 16:35:12 +08:00 · 1537 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。

    描述

    有一 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"
    
    22 条回复    2024-01-05 16:30:40 +08:00
    xzysaber
        1
    xzysaber  
       2023-12-26 16:41:02 +08:00
    简单点的做法:在宿主机 hosts 里面配一个
    127.0.0.1 mysql
    Mikawa
        2
    Mikawa  
       2023-12-26 17:53:24 +08:00
    插眼,我一般是通过 env 来处理的,看看有没有别的好办法
    NelsonZhao
        3
    NelsonZhao  
       2023-12-26 17:59:23 +08:00
    把 mysql 的 3306 端口映射出来,所有地方访问都用宿主机的内网 ip ,192.168.1.110 之类的
    javalaw2010
        4
    javalaw2010  
       2023-12-26 17:59:35 +08:00
    写容器/etc/hosts ,宿主机手动写 hosts,容器内外统一使用同一个域名进行访问,不过你这么玩儿是不符合最佳实践的,后面还有有路径的坑等着你。正规一点的做法是,你开个终端 docker compose php bash 丢那就完事了,或者像 laravel 的 sail 一样写一个外部脚本包装容器相关的命令。
    chenqh
        5
    chenqh  
       2023-12-26 18:22:34 +08:00
    docker network host ?
    tlerbao
        6
    tlerbao  
    OP
       2023-12-26 19:00:37 +08:00
    @javalaw2010 你的意思是进入容器操作? sail 的脚本有地址吗,去看看怎么回事?
    hingle
        7
    hingle  
       2023-12-26 19:08:42 +08:00
    不要进容器里。做法是用环境变量。
    PHP 容器配置个环境变量比如 MYSQL_HOST=mysql ,在宿主机就用 MYSQL_HOST=127.0.0.1
    tlerbao
        8
    tlerbao  
    OP
       2023-12-26 19:29:32 +08:00
    @hingle 我每台明白您说的呢?
    yumusb
        9
    yumusb  
       2023-12-26 20:49:24 +08:00
    在容器 environment 设置一个 env ,然后 php 去获取这个 env ,如果能获取到则说明是容器内,使用 env ,否则使用 127.0.0.1
    oneisall8955
        10
    oneisall8955  
       2023-12-27 00:06:03 +08:00 via Android
    宿主机和容器都可以 ping 通 docker 默认网关吧 172.17.0.1 吧,试试这个 IP
    SenLief
        11
    SenLief  
       2023-12-27 00:39:06 +08:00
    如果你是单机应用,直接把容器网络配置为 host 主机,这样无论是宿主机和容器,或者容器和容器都可以用 localhost 来链接。
    whale
        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
    julyclyde
        14
    julyclyde  
       359 天前
    你要是没用 docker 是不是就没这些事了?
    tlerbao
        15
    tlerbao  
    OP
       358 天前
    @julyclyde 我要是不生来这世上好像都没有这些烦恼哈哈
    julyclyde
        16
    julyclyde  
       357 天前
    @tlerbao 看问题不易无限扩大化啊
    你遇到这问题本来是没啥问题的,单纯因为你用了 docker
    这之间存在因果关系和双射关系
    tlerbao
        17
    tlerbao  
    OP
       356 天前
    @julyclyde #16 不用 docker 用啥?
    julyclyde
        18
    julyclyde  
       356 天前
    @tlerbao 直接本地运行就行啦啊,没那么多破事需要解决
    tlerbao
        19
    tlerbao  
    OP
       355 天前
    @julyclyde #18 不用考虑线上线下尽可能环境统一的情况吗?不用考虑内存占用 维护性什么的吗?

    安装方便之类的哈哈。
    julyclyde
        20
    julyclyde  
       355 天前
    @tlerbao 你现在这基础知识的水平,谈这个还太早
    tlerbao
        21
    tlerbao  
    OP
       355 天前
    @julyclyde #20 被无情鄙视了吗?
    julyclyde
        22
    julyclyde  
       355 天前
    @tlerbao focus on 当前任务
    别把时间浪费在修理工具上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:28 · PVG 04:28 · LAX 12:28 · JFK 15:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.