Docker 大佬进,关于容器访问的相关问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tlerbao
V2EX    Docker

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

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

    描述

    有一 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 一样写一个外部脚本包装容器相关的命令。
    simple2025
        5
    simple2025  
       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
    itechify
        10
    itechify  
    PRO
       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  
       2023-12-27 08:51:18 +08:00
    看着应该就是单 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
        13
    javalaw2010  
       2023-12-27 10:16:04 +08:00
    julyclyde
        14
    julyclyde  
       2024-01-01 20:57:03 +08:00
    你要是没用 docker 是不是就没这些事了?
    tlerbao
        15
    tlerbao  
    OP
       2024-01-02 20:17:35 +08:00
    @julyclyde 我要是不生来这世上好像都没有这些烦恼哈哈
    julyclyde
        16
    julyclyde  
       2024-01-03 11:13:12 +08:00
    @tlerbao 看问题不易无限扩大化啊
    你遇到这问题本来是没啥问题的,单纯因为你用了 docker
    这之间存在因果关系和双射关系
    tlerbao
        17
    tlerbao  
    OP
       2024-01-04 17:13:38 +08:00
    @julyclyde #16 不用 docker 用啥?
    julyclyde
        18
    julyclyde  
       2024-01-04 21:34:52 +08:00
    @tlerbao 直接本地运行就行啦啊,没那么多破事需要解决
    tlerbao
        19
    tlerbao  
    OP
       2024-01-05 16:26:46 +08:00
    @julyclyde #18 不用考虑线上线下尽可能环境统一的情况吗?不用考虑内存占用 维护性什么的吗?

    安装方便之类的哈哈。
    julyclyde
        20
    julyclyde  
       2024-01-05 16:27:55 +08:00
    @tlerbao 你现在这基础知识的水平,谈这个还太早
    tlerbao
        21
    tlerbao  
    OP
       2024-01-05 16:29:36 +08:00
    @julyclyde #20 被无情鄙视了吗?
    julyclyde
        22
    julyclyde  
       2024-01-05 16:30:40 +08:00
    @tlerbao focus on 当前任务
    别把时间浪费在修理工具上
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5231 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 140ms UTC 09:17 PVG 17:17 LAX 01:17 JFK 04:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86