tlerbao
V2EX  ›  Docker

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

  •  
  •   tlerbao · Dec 26, 2023 · 2561 views
    This topic created in 1048 days ago, the information mentioned may be changed or developed.

    描述

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

    安装方便之类的哈哈。
    julyclyde
    julyclyde
    Jan 5, 2024
    20
    @tlerbao 你现在这基础知识的水平,谈这个还太早
    tlerbao
    tlerbao
    OP
    Jan 5, 2024
    21
    @julyclyde #20 被无情鄙视了吗?
    julyclyde
    julyclyde
    Jan 5, 2024
    22
    @tlerbao focus on 当前任务
    别把时间浪费在修理工具上
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   699 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 17:52 · PVG 01:52 · LAX 09:52 · JFK 12:52
    ♥ Do have faith in what you're doing.