在Docker Compose中为Laravel应用程序简化主机名
在使用 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
相关文章