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
评论区