实现Nginx容器内部代理其他容器,我们以Nginx代理Tomcat为例
第一步:创建Docker网络
网络名称指定为:my_net
网段指定为:172.30.1.xxx
网关指定为:172.30.1.1
docker network create --driver bridge --subnet 172.30.1.0/24 --gateway 172.30.1.1 my_net
第二步:在docker compose中添加网络
services同级指定:
networks:
my_net:
external: true
容器下指定:
networks:
my_net:
ipv4_address: 172.30.1.xxx
第三步:创建 docker compose 以及nginx.conf
Tomcat:
version: "3"
services:
tomcat:
image: tomcat:9.0
container_name: tomcat
stdin_open: true
tty: true
restart: always
privileged: true
networks:
my_net:
ipv4_address: 172.30.1.8
networks:
my_net:
external: true
由于是单纯作为演示,tomcat就不做过多的配置了
值得注意的是,我们的tomcat容器的内部并没有做端口的映射,只是指定了IP地址为:172.30.1.8
Nginx:
version: "3"
services:
nginx:
image: nginx
container_name: nginx
stdin_open: true
tty: true
restart: always
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
privileged: true
networks:
my_net:
ipv4_address: 172.30.1.3
networks:
my_net:
external: true
nginx.conf:
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_max_body_size 50m;
server{
listen 80;
server_name com.wind;
location / {
proxy_pass http://172.30.1.8:8080/;
}
}
}
在nginx容器中,我们映射了80端口
172.30.1.8是我们tomcat容器内部的IP,所以配置文件中,我们把80端口映射到这个地址:http://172.30.1.8:8080/
当然,我们也可以使用容器的名称:http://tomcat:8080/
第四步:防火墙设置
我们把tomcat的8080端口关闭,把Nginx的80端口打开
firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
第五步:测试
浏览器中输入:http://IP地址:80/index.html
看到这个结果就表示,我们nginx在内部已经通过Docker的网络访问到了Tomcat容器,已经完成了容器之间的通讯