【问题标题】:Can Docker containers can be joined under one accessible hostname?可以在一个可访问的主机名下加入 Docker 容器吗?
【发布时间】:2021-01-25 06:15:48
【问题描述】:

我开始使用 Laravel 进行开发,从版本 8 开始,Laravel 开发环境附带了 docker 和一个名为 Sail (docker-compose) 的工具。

当我配置我的.env 文件时,我需要对 MySQL 容器进行 SSH 并获取其主机名,然后对 Mailhog 容器进行 SSH 并执行相同操作。 除此之外,当我想通过 TablePlus 之类的工具查看数据库时,我无法让它通过主机名访问 MySQL 容器。

我做了一些搜索,发现我可以添加hostname指令,但我不确定它是否不会干扰内部容器的通信。

我可以在我的情况下使用hostname 指令安全吗?有没有办法以一个主机名加入容器并使其可以从我的主机访问?

我正在为 MAC 运行 Docker Desktop - v20.10.2 docker-compose供参考

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            # - pgsql
            - redis
            # - selenium
    # selenium:
    #     image: 'selenium/standalone-chrome'
    #     volumes:
    #         - '/dev/shm:/dev/shm'
    #     networks:
    #         - sail
    mysql:
        hostname: 'beatsy-db'
        image: 'mysql:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
        healthcheck:
          test: ["CMD", "mysqladmin", "ping"]
#    pgsql:
#        image: postgres:13
#        ports:
#            - '${FORWARD_DB_PORT:-5432}:5432'
#        environment:
#            PGPASSWORD: '${DB_PASSWORD:-secret}'
#            POSTGRES_DB: '${DB_DATABASE}'
#            POSTGRES_USER: '${DB_USERNAME}'
#            POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}'
#        volumes:
#            - 'sailpostgresql:/var/lib/postgresql/data'
#        networks:
#            - sail
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
        healthcheck:
          test: ["CMD", "redis-cli", "ping"]
    # memcached:
    #     image: 'memcached:alpine'
    #     ports:
    #         - '11211:11211'
    #     networks:
    #         - sail
    mailhog:
        hostname: 'beatsy-mail'
        image: 'mailhog/mailhog:latest'
        ports:
            - '${FORWARD_MAILHOG_PORT:-1025}:1025'
            - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
#    sailpostgresql:
#        driver: local
    sailredis:
        driver: local

【问题讨论】:

  • hostname: 几乎什么都不做。这相当于在您的主机系统上运行sudo hostname stackoverflow.com:它会更改容器认为自己的名称,但不会影响其他任何东西如何连接到它。

标签: laravel docker docker-compose


【解决方案1】:

您的docker-compose.yml 中有多个服务:

  • laravel.test
  • mysql
  • redis

等等。其中每一个都是同一网络中容器的可解析名称。因此,不要使用 mysql 容器主机名,而是使用其服务名称(在您的情况下只是 mysql)。您不应该使用容器主机名,因为它们是随机生成的。

【讨论】:

  • 我发誓我确实尝试过使用服务名称,但它不起作用,现在它正在起作用。你知道我怎样才能让容器可以访问,以便像 TablePlus(MySQL 客户端)这样的工具可以访问它吗?
  • @Yehuda 看容器ports的配置,这是端口转发规则。左值是主机上的端口,右值是容器上的端口。因此,要使用主机上的工具访问 mysql,您需要连接到 localhost:${FORWARD_DB_PORT}(如果未设置该变量,则为 3306)。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2017-07-02
  • 1970-01-01
相关资源
最近更新 更多