问下docker里面请求127.0.0.1:8080是会先到宿主机,再到docker里面,还是直接在docker里面查找?

情况是这样的:
我在centos里面安装了一个docker,我docker是用的ubuntu,在ubuntu里面安装了nginx,mysql,php环境,
我把网站需要的软件都放在一个docker里面,主要是我感觉分开在多个docker里面,会导致网站速度很慢,执行过程中需要不断在不同docker里面。
现在我在一个网站里面想要获取另一个网站的数据。这两个网站都在docker里面
一个监听80端口,一个监听8080端口
现在我想问下当我 curl 127.0.0.1:8080 时,是直接到docker里面找8080端口吗,还是需要通过宿主机,再进到8080端口?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

在容器内就是走的内部

9个月前 评论
donggan (楼主) 9个月前
讨论数量: 13

直接访问的宿主机端口,不做docker 端口配置是访问不到docker服务的

9个月前 评论
donggan (楼主) 9个月前
deatil (作者) 9个月前
donggan (楼主) 9个月前
deatil (作者) 9个月前
陈先生

127.0.0.1->宿主机->宿主机调度到对应端口->docker->容器->返回

9个月前 评论
donggan (楼主) 9个月前
donggan (楼主) 9个月前
sanders

根据楼主的帖子内容判断,容器里面执行 curl http://127.0.0.1:8080 会直接访问本容器内监听这个端口的服务,但应该不是楼主希望的那个样子,楼主想做的是夸容器访问其他的服务。

如果是使用 docker compose 进行管理将会较方便的将两个容器加到同一个虚拟网络中,然后通过 docker-runtime 自己提供的 dns 使用服务名字在本地虚拟网络中进行访问。

我用 sail 生成的 docker-compose.yml 举个例子:

version: '3'
services:
    laravel.test: # 这是个 http 的服务名
        build:
            context: ./vendor/laravel/sail/runtimes/8.2
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.2/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
    mysql: # 这里就是 mysql 的服务名
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
        networks:
            - sail
        healthcheck:
            test:
                - CMD
                - mysqladmin
                - ping
                - '-p${DB_PASSWORD}'
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sail-mysql:
        driver: local

服务启动后 laravel.test 会使用 supervisor 拉起 php artisan serve 提供 http 服务,而这个服务要依赖于数据库服务,数据库部署在另一个容器,服务名为 mysql 这时由于在相同的虚拟网络中,则可以直接通过 mysql 当做 host 进行访问,所以你看 .env 默认写成:

DB_HOST=mysql
9个月前 评论
donggan (楼主) 9个月前

在容器内就是走的内部

9个月前 评论
donggan (楼主) 9个月前

可以在部署容器的时候使用 --network=host 参数,让容器和宿主机共享网络,前提是能保证网络环境的安全下

9个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!