tlerbao
V2EX  ›  Docker

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

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

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