Docker-Compose 结合nginx实现跨容器转发
开发环境
mac zsh docker-compose
~ docker-compose --version
docker-compose version 1.22.0, build f46880f
目录结构
docker-compose.yml
version: "3"
services:
web: # 服务的名称
image: nginx
volumes: # 文件夹映射
- /Users/cai/Documents/www:/usr/share/nginx/html:ro # 宿主:docker:只读 ,www目录
- ./config/web.conf:/etc/nginx/nginx.conf:ro # nginx配置文件
ports: # 端口转发 宿主:docker
- "8080:80"
- "8081:81"
# environment:
# - NGINX_HOST=foobar.com
# - NGINX_PORT=80
# command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
networks: ## 定义网络
nn: ## 加入的网络的名称
ipv4_address: 192.168.5.101 ## ipv4的ip地址
web8082:
image: nginx
volumes:
- /Users/cai/Documents/www/8082:/usr/share/nginx/html:ro
ports:
- "8082:80"
networks:
nn:
ipv4_address: 192.168.5.102
web8083:
image: nginx
volumes:
- /Users/cai/Documents/www/8083:/usr/share/nginx/html:ro
ports:
- "8083:80"
networks:
nn:
ipv4_address: 192.168.5.103
networks: ##定义网络组
nn: ## 网络组名称
driver: bridge ## 网络的模式
ipam: ## 配置网络
driver: default
config:
- subnet: 192.168.5.0/24 ## ip地址网络 这里宿主机一般会是该网段的 192.168.5.1,所以不要设置自网段为1
配置服务 配置网络
将服务加入同一个网络组,这样 docker 就可以在同一个网络组里了,由于 docker 的特性,每个容器会认为自己和另一个容器是局域网的关系
我这里做的是 nginx 转发
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
# proxy_pass http://web8081;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location = /300.html {
proxy_redirect off;
proxy_pass http://192.168.5.102/index.html; ## 备注1
}
location = /600.html {
proxy_redirect off;
proxy_pass http://192.168.5.103/index.html; ## 备注2
}
}
server{
listen 81;
server_name localhost;
location / {
root /usr/share/nginx/html/sub;
index index.html index.htm;
}
}
}
备注 1,备注 2 将 300.html 600.html 转发到 103 的 ip 地址 由于 docker 中 nginx 端口默认配置的是 80,所以 http 的端口转发没有端口号 8082 端口 对于 8080 端口默认服务器来讲 ip 地址是 102
启动
docker up
加 -d 的话就是后台运行, 直接运行可以看见日志
这里测试了一下 可以看到 服务器那边有日志
我们发的请求 8082 的服务器给出了反馈
后记
这里简单记录了下 docker 配合 nginx 达到两个隔离容器间的通信问题
同样的 这里如果用 mysql+服务器 app 程序 也可以达成通信的原理,无非就是换个 ip 地址和通过命令启动服务端程序的问题