以docker的网络管理,容器的ip设置为基础知识实现nginx负载均衡
查看所有docker网络
docker network ls /* network id name driver scope b832b168ca9a bridge bridge local 373be82d3a6a  posetest_default bridge local a360425082c4 host host local 154f600f0e90 none null local */ // posetest_default 是上一篇介pose时,dockerpose.yml文件所在的目录名, // 所以,用dockerpose创建的容器会默认创建一个以目录名为网络名的网络,并且是dridge(桥接)类型
指定容器ip地址
官网文档地址:
继续编写上一篇《12.使用dockerpose容器编排工具》文章中的dockerpose.yml
version: "3" services: web1: container_name: web1 image: "centos:httpd" ports: - "8080:80" privileged: true volumes: - "/app/www/web1/:/var/www/html/"  mand: ['/usr/sbin/init'] networks: nginx-lsb: ipv4_address: 192.169.0.3 web2: container_name: web2 image: "centos:httpd" ports: - "8081:80" privileged: true volumes: - "/app/www/web2/:/var/www/html/"  mand: ['/usr/sbin/init'] networks: nginx-lsb: ipv4_address: 192.169.0.2 networks: nginx-lsb: driver: bridge ipam: config: - subnet: 192.169.0.0/16
使用dockerpose启动容器
dockerpose up -d
查看容器是否启动,并确认是否创建了网络 nginx-lsb
// 可以查看当前dockerpose.yml配置的容器组里的容器状态 dockerpose ps docker network ls /* network id name driver scope b832b168ca9a bridge bridge local 373be82d3a6a  posetest_default bridge local de6f5b8df1c8  posetest_nginx-lsb bridge local a360425082c4 host host local 154f600f0e90 none null local */ // 创建了nginx-lsb网络,命名是容器组项目的 文件名开头_网络名
查看网络 nginx-lsb的详情
docker network inspect posetest_nginx-lsb
// 详情里面可以看到使用这个网络的每个容器的ip
如:
/*
...
"containers": {
"039aa860ef04f20a7566fdc943fb4398a61d2ad6dd3e373b17c86ac778af89e3": {
"name": "web2",
"endpointid": "1bc206661179e65999015f132c2889d3d4365b8d42b8a89cf9c260016fedd5ee",
"macaddress": "02:42:c0:a9:00:02",
"ipv4address": "192.169.0.2/16",
"ipv6address": ""
},
"437ad7a07da8e46c0abaf845c4b08425338009fbe972bde69478cf47c75c315b": {
"name": "web1",
"endpointid": "5a36e602a5364ee9ad06e9816d09e3966d56ebf06b9394ebc25b8bcee9546607",
"macaddress": "02:42:c0:a9:00:03",
"ipv4address": "192.169.0.3/16",
"ipv6address": ""
}
},
...
*/使用 env_file环境文件:
简单可以理解为:在dockerpose.yml中定义变量,引用在外部.env文件中进行变量定义
官方文档地址:
// 还是posetest目录中定义个 .env文件,用来存放变量
web1_addr=192.169.0.2
web2_addr=192.169.0.3
// 修改dockerpose.yml文件,加入变量定义
version: "3"
services:
web1:
container_name: web1
image: "centos:httpd"
ports:
- "8080:80"
privileged: true
volumes:
- "/app/www/web1/:/var/www/html/"
 mand: ['/usr/sbin/init']
networks:
nginx-lsb:
ipv4_address: ${web1_addr}
web2:
container_name: web2
image: "centos:httpd"
ports:
- "8081:80"
privileged: true
volumes:
- "/app/www/web2/:/var/www/html/"
 mand: ['/usr/sbin/init']
networks:
nginx-lsb:
ipv4_address: ${web2_addr}
networks:
nginx-lsb:
driver: bridge
ipam:
config:
- subnet: 192.169.0.0/16重新启posetest项目,并查看网络详情,确认容器ip是否设置成功
// 重新启posetest项目 dockerpose up -d // 查看网络详情 docker network inspect posetest_nginx-lsb
posetest项目中添加一台nginx服务器作为负载均衡服务器
// 在.env文件里添加一个变量 nginx_lsb
web1_addr=192.169.0.2
web2_addr=192.169.0.3
nginx_lsb=192.169.0.100
// 修改dockerpose.yml文件,加入变量定义
version: "3"
services:
nginx-lsb:
container_name: nginx-lsb
image: "centos:nginx"
ports:
- "8000:80"
privileged: true
volumes:
- "/app/nginx/nginx.conf:/etc/nginx/nginx.conf"
networks:
nginx-lsb:
ipv4_address: ${nginx_lsb}
web1:
container_name: web1
image: "centos:httpd"
ports:
- "8080:80"
privileged: true
volumes:
- "/app/www/web1/:/var/www/html/"
 mand: ['/usr/sbin/init']
networks:
nginx-lsb:
ipv4_address: ${web1_addr}
web2:
container_name: web2
image: "centos:httpd"
ports:
- "8081:80"
privileged: true
volumes:
- "/app/www/web2/:/var/www/html/"
 mand: ['/usr/sbin/init']
networks:
nginx-lsb:
ipv4_address: ${web2_addr}
networks:
nginx-lsb:
driver: bridge
ipam:
config:
- subnet: 192.169.0.0/16
// 重新启posetest项目
dockerpose up -d修改nginx.conf配置文件,配置负载均衡
upstream mydocker {
server 192.169.0.2;
server 192.169.0.3;
}
server {
listen 80;
server_name mydocker;
location / {
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_buffering off;
proxy_pass mydocker;
}
}重新启动nginx-lsb,加载配置文件
dockerposer restart nginx-lsb
访问 服务器ip地址:8000,测试服务器负载均衡!









