侧边栏壁纸
博主头像
随心 博主等级

没有天赋,那就一直重复

  • 累计撰写 13 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

一台服务器用一个nginx代理两个tomcat容器

随心
2025-06-27 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

1、先把nginx配置拿到本地机器,方便后续修改。

docker run -d --name ng-tmp nginx ##启动一个临时ng拿配置。

docker ps

docker cp 5b40d60e6c74:/etc/nginx/ /shell/ng/

docker rm -f 5b40d60e6c74

2、开始启动三个容器,并且将ng配置映射本地,tomcat的index文件如果像映射本机也可选择第一步那样子。

docker run -d -p 8080:80 -v /shell/ng/nginx/:/etc/nginx/ --name fzjh nginx

docker run -d -p 8081:8080 --name web1 tomcat:8.5.3

docker run -d -p 8082:8080 --name web2 tomcat:8.5.3

3、新建网络,因为默认的 bridge 网络下容器间只能用 IP 通信,建议创建自定义网络。

docker network create my-web

docker network ls

docker network connect my-web web2

docker network connect my-web web1

docker network connect my-web fzjh

docker network inspect my-web ##可以看到已经加入网络的三个容器。

docker exec -it web1 ping web2 ##测试连通性

4、修改web1和web2的index文件

目录是/usr/local/tomcat/webapps/ROOT/index.jsp

这样测试后的时候能知道访问的是web1还是web2容器。

5、修改nginx配置并重新加载配置文件。

你会在nginx.conf标准配置看到这一段。

include /etc/nginx/conf.d/*.conf; # 会加载 conf.d 目录下的所有 .conf 文件

所以只需在 /shell/ng/nginx/conf.d/ 下添加负载均衡配置即可。

但是需要把/shell/ng/nginx/conf.d/下的默认default.conf文件给删除,或者MV,否则会影响你新建的配置文件。

docker exec -it 容器id mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak

因为你已经映射到了本地,其实可以直接本地修改的。

vim /shell/ng/nginx/conf.d/fzjh.conf

还有配置这里为什么用容器名而不用 IP?

因为Docker 容器 IP 可能变动,容器名在自定义网络中自动解析,更稳定。

# 定义上游服务器组(后端Tomcat集群)
upstream tomcat_servers {
    # 第一个Tomcat服务器地址
    # 要求:所有容器必须在同一Docker网络,才能通过容器名互通
    server web2:8080;

    # 第二个Tomcat服务器地址
    server web1:8080;

    # 可选参数示例: 仅个人使用参数可选可不选。
    # weight=5;       # 权重(默认1,值越高分配越多请求)
    # max_fails=3;    # 最大失败次数(超过后标记为不可用)
    # fail_timeout=30s; # 失败超时时间
    # backup;        # 标记为备用服务器(主服务器不可用时启用)
}
##突然不知道咋说了,其实这个文件能看懂的大概有一半的样子,有些许沉默。
# 定义Nginx的虚拟主机配置
server {
    # 监听80端口(HTTP默认端口) 启动的容器端口是80所以这里也是
    listen 80;

    # 服务器名称(可写域名、IP或通配符_)
    # localhost表示仅接受本地请求,生产环境建议改为实际域名
    server_name localhost;

    # 配置所有路径(/表示根路径及子路径)
    location / {
        # 将请求反向代理到上游服务器组tomcat_servers
        proxy_pass http://tomcat_servers;

        # 将原始请求的Host头(如域名)传递给后端
        # 防止后端因丢失Host头而无法正确处理虚拟主机
        proxy_set_header Host $host;

        # 将客户端的真实IP传递给后端(存储在X-Real-IP头中)
        # 后端服务可通过此头获取用户真实IP,而非Nginx服务器的IP
        proxy_set_header X-Real-IP $remote_addr;

    }

}

保存完毕配置以后重载配置文件。

docker exec -it 容器id nginx -s reload

然后再访问 Ip:8080就会看到两个tomcat的界面轮流显示了。

还有就是新建网络那里,可以先新建网络,然后启动容器的时候加入网络就可以了。

加上--network 新建的网络名 这个参数就可以了。

docker run -d --name 容器名--network 新建的网络名-p 本机端口:容器端口 镜像名

其实很简单的,半小时就搞定了。

以下是一些额外手段

设置 Docker 守护进程开机自启(大多数 Linux 系统默认已启用)

sudo systemctl enable docker

三个容器没有设置开机自启动,所有需要重新,设置,也可一开始启动容器的时候设置参数。

docker update --restart unless-stopped web1 web2 fzjh #执行后如下显示

# 应输出:

web1

web2

fzjh

docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' fzjh ##验证是否生效

# 应输出:unless-stopped

也可以在启动容器idea时候加上这个参数就可以了。

--restart unless-stopped

如果想取消开机自启动如下操作即可

docker update --restart no web1 web2 fzjh

0

评论区