在Docker Compose中为Laravel应用程序简化主机名

2023-06-01 00:00:00 应用程序 中为 简化

在使用 Docker 进行开发时,您可能会遇到奇怪的情况,特别是 docker compose,以及网络的完成方式。

我将 WSL2 与 Docker 桌面一起使用,让我的生活变得轻松,

最近不得不找出主机名的别名,以便容器可以在没有 IP 地址或服务名称的情况下相互引用,

即在使用 http 客户端向服务 a 发出请求时服务 B.

希望这会为人们提供一些启示,或者只是让 docker 更容易使用,这是一项伟大的开发技术。

ps: 
这不适用于生产或暂存用途。
仅用于开发目的


配置

我假设您有 3 个 Laravel 应用程序,并且 NGINX 是您的代理服务器(网络服务器)。

这意味着我们将使用 PHP-FPM,因为对您的服务的所有请求都是从 NGINX 传递到给定应用程序的 PHP-FPM 服务的代理。

 FPM 然后运行实际代码并将响应返回给 NGINX。


我们将添加一个假定的数据库服务,以便我们的 docker-compose 文件看起来完整。

我们将详细介绍撰写文件的每个部分,重点关注网络部分。


让我们假设我们有 3 个 Laravel 应用程序:

management/payroll/marketing 这三个。

services:
  management:
    build:
      context: .
    container_name: management
    image: laravel-example/management
    restart: unless-stopped
    tty: true
    working_dir: /var/www/management
    volumes:
      - ./:/var/www/management
    networks:
      - laravel-example
  payroll:
    build:
      context: ../payroll
    container_name: payroll
    image: laravel-example/payroll
    restart: unless-stopped
    tty: true
    working_dir: /var/www/payroll
    volumes:
      - ../payroll:/var/www/payroll
    networks:
      - laravel-example
  marketing:
    build:
      context: ../marketing
    container_name: marketing
    image: laravel-example/marketing
    restart: unless-stopped
    tty: true
    working_dir: /var/www/marketing
    volumes:
      - ../marketing:/var/www/marketing
    networks:
      - laravel-example
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - 80:80
      - 443:443
    volumes:
      - ../payroll:/var/www/payroll
      - ../marketing:/var/www/marketing
      - ./:/var/www/management
      - ./build/dev/nginx/conf:/etc/nginx/conf.d
      - ./build/dev/nginx/certs/:/etc/nginx/ssl
    networks:
      laravel-example:
        aliases:
          - payroll.bigcorp.test
          - marketing.bigcorp.test
          - management.bigcorp.test
    depends_on:
      - marketing
  mariadb:
    image: mariadb:10.2
    container_name: mariadb
    ports:
      - 33065:3306
    environment:
      MYSQL_ROOT_PASSWORD: "password"
      MYSQL_DATABASE: "your_db"
      MYSQL_USER: "root"
      MYSQL_PASSWORD: "password"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - laravel-mariadb:/var/lib/mysql
    networks:
      - laravel-example
    restart: on-failure
    healthcheck:
      test: ["CMD", "mysqladmin", "ping"]
networks:
  laravel-example:
    driver: bridge
    external: false
    name: laravel-example
volumes:
  laravel-mariadb:
    driver: local

yaml 文件可能看起来很大,但实际上很容易按服务分解服务并了解每个部分的作用。

我们对这篇文章的主要关注是了解主机名别名。

通常 docker 会根据其内部网络为服务分配一个 ip,因此在给定的构建或运行中,给定的服务永远不会有相同的 ip 地址。

服务可以通过名称相互“交谈”,因为 docker 会将服务名称解析为 IP 地址。

出现这种情况的地方是一个服务在 docker 网络中向另一个服务发出 http 请求。

调用将失败,因为主机名无法解析,当然没有 DNS 服务器。

为了解决这个问题,我们需要看两件事:

我们在撰写文件中的网络键说“让我创建一个名为 laravel-example 的网络,并使用网桥驱动程序,这不是外部(已经存在的网络)。


我们的每项服务都建立在这个网络中。

像 DNS 一样在 docker 中解析主机名的关键是我们 NGINX 服务中的网络键

networks:
      laravel-example:
        aliases:
          - payroll.bigcorp.test
          - marketing.bigcorp.test
          - management.bigcorp.test

基本上我们只是说,“将这些主机名中的任何一个解析为 NGINX 服务”。

这当然有效,因为对 NGINX 的所有请求都会传递到代理到 PHP-FPM 服务的服务器块。

我们可以在后面的文章中看看它是如何工作的。

希望这能以实用的方式为开发目的阐明 dockers 网络。


转:

https://dev.to/localpathcomp/simplifying-hostnames-in-docker-compose-for-laravel-apps-4f6

相关文章