nginx的docker版本代理: 最近在使用docker搭建php开发环境的时候,使用到了jwilder/nginx-proxy 镜像,查了看了相关的文档之后,发现这个镜像服务还是很牛逼的
官网: https://hub.docker.com/r/jwilder/nginx-proxy/
Docker 的自动化 Nginx 反向代理:
http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/
关于使用jwilder/nginx-proxy的一些细节记录:
1.本质上来说jwilder/nginx-proxy是一个nginx代理,可用来代理任何服务,像redis nginx es等
2.配置的时候需要配置一个VIRTUAL_HOST,用来定义该服务的虚拟主机地址
3.示例分析,假如有如下docker-compsoe.yml 的部分配置
mailcatcher:
restart: always
image: schickling/mailcatcher
container_name: "${APP_NAME}-mailcatcher"
environment:
VIRTUAL_HOST: "${MAIL_HOST}"
VIRTUAL_PORT: 1080
ports:
- "${MAIL_PORT}:1080"
- "${MAIL_SMTP_PORT}:1025"
networks:
- network-internal
mailcatcher 服务配置说明:
1>. restart: always
容器在停止后会自动重启。
常用于开发环境,确保服务始终运行。
2>. image: schickling/mailcatcher
使用 Docker 镜像 schickling/mailcatcher。
这个镜像提供了一个轻量级的邮件捕获服务,可以通过 Web 界面查看邮件。
3>. container_name: "${APP_NAME}-mailcatcher"
定义容器名称。
使用环境变量 ${APP_NAME} 动态设置容器的名称,方便区分不同应用。
4>. environment
配置环境变量:
VIRTUAL_HOST:定义该服务的虚拟主机地址,用 ${MAIL_HOST} 动态设置。
VIRTUAL_PORT:定义该服务的虚拟主机端口(HTTP),默认映射到 1080 端口,用于访问 MailCatcher 的 Web 界面。
5>. ports
映射容器内部端口到主机端口:
${MAIL_PORT}:1080:将 MailCatcher 的 Web 界面端口(1080)映射到主机端口 ${MAIL_PORT},方便浏览器访问。
${MAIL_SMTP_PORT}:1025:将 SMTP 端口(1025)映射到主机端口 ${MAIL_SMTP_PORT},供应用程序发送邮件。
6>. networks
指定使用的 Docker 网络:
network-internal:将 MailCatcher 服务连接到 network-internal 网络,供其他服务(如应用容器)通过内部网络访问。
7>注意事项,如果定义了VIRTUAL_PORT和ports,那么一定要把VIRTUAL_PORT和ports里的对内端口配置一致,比如这里都是1080,如果不一致的话,
ports下的对内端口会覆盖VIRTUAL_PORT的端口,那么导致用过代理访问不生效,但是通过ports访问的生效。
可以只配置VIRTUAL_HOST和VIRTUAL_PORT,而不配置ports,那么只能通过代理访问,反之,如果只配置了ports和VIRTUAL_HOST,那么只能通过VIRTUAL_HOST加port直接访问。
对于网络 network-internal 这个需要和代理服务配置一致,用于代理服务和服务的通信,一般会给代理配置多个network,比如:
networks:
network-front:
network-internal:
我发现代理默认会使用network-front对外提供访问,实际上对于代理服务和具体的服务可以使用一个network就可以了,比如这里的network-internal,给代理服务取多个的目的,
我想应该是做个区分,一个对外一个对内,其实使用的时候,可以只配置一个。
8>对于里面的环境变量,可以在和docker-compose.yml文件同级目录下定义一个.env,比如:
APP_NAME=myapp
MAIL_HOST=mail.local
MAIL_PORT=1081
MAIL_SMTP_PORT=1026
9>.相关命令
//查看创建的网络
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
c4005c2f14bb bridge bridge local
517c59df10ca docker_network-front bridge local
4223ab92f098 docker_network-internal bridge local
分析:
自动创建网络:
docker_network-front 和 docker_network-internal 都是由 Docker Compose 根据你的 docker-compose.yml 文件自动创建的桥接网络。
它们的命名规则是:<项目名>_<网络名>,这里的项目名是 docker,可能是你运行 docker-compose 时所在目录的名称或通过 -p 参数指定的项目名称。
默认网络作用域:
这些网络的作用域是 local,即它们仅限于当前 Docker 主机中使用。
桥接模式:
这两个网络的驱动是 bridge,表示它们是 Docker 的桥接网络(默认网络类型)。
//删除网络
$ docker network rm docker_network-front docker_network-internal
//网络和哪些容器相连
$docker network inspect network-front
$docker network inspect network-internal
//查看容器的网络连接
$docker inspect <nginx-proxy-container-name>
