使用 Traefik、Nginx 和 Laravel 配置 Docker
Configuring Docker with Traefik, Nginx and Laravel
我正在尝试弄清楚如何为开发和以后的部署设置一个简单的堆栈。我想利用 Docker 在容器中作为面向反向代理的 public 服务 Traefik,然后根据需要与仅用于服务静态前端文件的 Nginx 容器进行交互(HTML, CSS, JS) 和一个运行 Laravel 的后端 PHP 容器(我有意为这个项目解耦前端和 API)。
我正在尽最大努力通过所有视频和书面教程来学习,但事情很快变得复杂(至少对于我没有经验的大脑来说是这样)并且有点不知所措。我有一个星期的最后期限来完成这个项目,我强烈考虑暂时完全放弃 Docker,因为我担心我会把整个时间都花在乱搞配置而不是实际编码上!
首先,我有一个简单的 docker-compose,我已验证至少可以正确运行以下配置:
version: '3'
services:
reverse-proxy:
image: traefik
command: --api --docker # Enables Web UI and tells Traefik to listen to Docker.
ports:
- "80:80" # HTTP Port
- "8080:8080" # Web UI
volumes:
- /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events.
现在,我需要弄清楚如何有效地连接 Nginx 和 PHP/Laravel。
首先,不要让自己承受学习新事物的压力。因为如果你这样做,学习新东西就不会再舒服了。利用您的技术知识完成工作。当你完成后,你意识到你还有 1/2 天的时间到你的最后期限,尝试通过包括新技术来超额交付。这样您就不会搞砸最后期限,也不会因为我们的新技术或配置而感到压力。
您在下面看到的配置不完整,也未经过功能测试。为了给你一个起点,我只是从我的 3 个主要项目中复制了大部分内容。 Traefik as-is 可能很难正确设置。
version: '3'
# Instantiate your own configuration with a Dockerfile!
# This way you can build somewhere and just deploy your container
# anywhere without the need to copy files around.
services:
# traefik as reverse-proxy
traefik:
build:
context: .
dockerfile: ./Dockerfile-for-traefik # including traefik.toml
command: --docker
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# this file you'll have to create manually `touch acme.json && chmod 600 acme.json`
- /home/docker/volumes/traefik/acme.json:/opt/traefik/acme.jso
networks:
- overlay
ports:
- 80:80
- 443:443
nginx:
build:
context: .
dockerfile: ./Dockerfile-for-nginx
networks:
- overlay
depends_on:
- laravel
volumes:
# you can copy your assets to production with
# `tar -c -C ./myassets . | docker cp - myfolder_nginx_1:/var/www/assets`
# there are many other ways to achieve this!
- assets:/var/www/assets
# define your application + whatever it needs to run
# important:
# - "build:" will search for a Dockerfile in the directory you're specifying
laravel:
build: ./path/to/laravel/app
environment:
MYSQL_ROOT_PASSWORD: password
ENVIRONMENT: development
MYSQL_DATABASE: your_database
MYSQL_USER: your_database_user
networks:
- overlay
links:
- mysql
volumes:
# this path is for development
- ./path/to/laravel/app:/app
# you need a database, right?
mysql:
image: mysql:5
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: your_database
MYSQL_USER: your_database_user
networks:
- overlay
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
assets:
networks:
overlay:
我正在尝试弄清楚如何为开发和以后的部署设置一个简单的堆栈。我想利用 Docker 在容器中作为面向反向代理的 public 服务 Traefik,然后根据需要与仅用于服务静态前端文件的 Nginx 容器进行交互(HTML, CSS, JS) 和一个运行 Laravel 的后端 PHP 容器(我有意为这个项目解耦前端和 API)。
我正在尽最大努力通过所有视频和书面教程来学习,但事情很快变得复杂(至少对于我没有经验的大脑来说是这样)并且有点不知所措。我有一个星期的最后期限来完成这个项目,我强烈考虑暂时完全放弃 Docker,因为我担心我会把整个时间都花在乱搞配置而不是实际编码上!
首先,我有一个简单的 docker-compose,我已验证至少可以正确运行以下配置:
version: '3'
services:
reverse-proxy:
image: traefik
command: --api --docker # Enables Web UI and tells Traefik to listen to Docker.
ports:
- "80:80" # HTTP Port
- "8080:8080" # Web UI
volumes:
- /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events.
现在,我需要弄清楚如何有效地连接 Nginx 和 PHP/Laravel。
首先,不要让自己承受学习新事物的压力。因为如果你这样做,学习新东西就不会再舒服了。利用您的技术知识完成工作。当你完成后,你意识到你还有 1/2 天的时间到你的最后期限,尝试通过包括新技术来超额交付。这样您就不会搞砸最后期限,也不会因为我们的新技术或配置而感到压力。
您在下面看到的配置不完整,也未经过功能测试。为了给你一个起点,我只是从我的 3 个主要项目中复制了大部分内容。 Traefik as-is 可能很难正确设置。
version: '3'
# Instantiate your own configuration with a Dockerfile!
# This way you can build somewhere and just deploy your container
# anywhere without the need to copy files around.
services:
# traefik as reverse-proxy
traefik:
build:
context: .
dockerfile: ./Dockerfile-for-traefik # including traefik.toml
command: --docker
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# this file you'll have to create manually `touch acme.json && chmod 600 acme.json`
- /home/docker/volumes/traefik/acme.json:/opt/traefik/acme.jso
networks:
- overlay
ports:
- 80:80
- 443:443
nginx:
build:
context: .
dockerfile: ./Dockerfile-for-nginx
networks:
- overlay
depends_on:
- laravel
volumes:
# you can copy your assets to production with
# `tar -c -C ./myassets . | docker cp - myfolder_nginx_1:/var/www/assets`
# there are many other ways to achieve this!
- assets:/var/www/assets
# define your application + whatever it needs to run
# important:
# - "build:" will search for a Dockerfile in the directory you're specifying
laravel:
build: ./path/to/laravel/app
environment:
MYSQL_ROOT_PASSWORD: password
ENVIRONMENT: development
MYSQL_DATABASE: your_database
MYSQL_USER: your_database_user
networks:
- overlay
links:
- mysql
volumes:
# this path is for development
- ./path/to/laravel/app:/app
# you need a database, right?
mysql:
image: mysql:5
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: your_database
MYSQL_USER: your_database_user
networks:
- overlay
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
assets:
networks:
overlay: