同一台机器映射端口不一样,部署两个服务

version: '3'

services:
  nginx:
    image: nginx:latest
    container_name: my_nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
      - ./html:/usr/share/nginx/html
    ports:
      - "80:80"
    environment:
      - NGINX_HOST=localhost
      - NGINX_PORT=80

volumes:
  conf.d:
  html:

nginx的docker-compose的配置如下,如果在同一台机器上部署两个nginx应该怎么写呢?

如果你想在同一台机器上再部署一个 Nginx 实例,可以通过创建另一个服务并为其分配不同的端口和容器名称。以下是更新后的 docker-compose.yml 文件:

version: '3'

services:
  nginx1:
    image: nginx:latest
    container_name: my_nginx1
    volumes:
      - ./nginx1/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx1/conf.d:/etc/nginx/conf.d
      - ./nginx1/html:/usr/share/nginx/html
    ports:
      - "80:80"
    environment:
      - NGINX_HOST=localhost
      - NGINX_PORT=80

  nginx2:
    image: nginx:latest
    container_name: my_nginx2
    volumes:
      - ./nginx2/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx2/conf.d:/etc/nginx/conf.d
      - ./nginx2/html:/usr/share/nginx/html
    ports:
      - "81:80"
    environment:
      - NGINX_HOST=localhost
      - NGINX_PORT=81

volumes:
  nginx1_conf.d:
  nginx1_html:
  nginx2_conf.d:
  nginx2_html:

相关文件和目录结构

你需要为每个 Nginx 服务创建单独的配置文件和内容目录,以避免冲突。假设你的项目目录结构如下:

project/
├── docker-compose.yml
├── nginx1/
│   ├── nginx.conf
│   ├── conf.d/
│   │   └── default.conf
│   └── html/
│       └── index.html
└── nginx2/
    ├── nginx.conf
    ├── conf.d/
    │   └── default.conf
    └── html/
        └── index.html

nginx1/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_names_hash_bucket_size 128;
}

nginx1/conf.d/default.conf

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;
    root /usr/share/nginx/html;

    location / {
        try_files $uri $uri/ =404;
    }
}

nginx1/html/index.html

<!DOCTYPE html>
<html>
<head>
    <title>Welcome to nginx1!</title>
</head>
<body>
    <h1>Success! The nginx1 server is working!</h1>
</body>
</html>

nginx2/nginx.conf

内容与 nginx1/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_names_hash_bucket_size 128;
}

nginx2/conf.d/default.conf

内容与 nginx1/conf.d/default.conf 相同:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;
    root /usr/share/nginx/html;

    location / {
        try_files $uri $uri/ =404;
    }
}

nginx2/html/index.html

<!DOCTYPE html>
<html>
<head>
    <title>Welcome to nginx2!</title>
</head>
<body>
    <h1>Success! The nginx2 server is working!</h1>
</body>
</html>

启动服务

在项目根目录下运行以下命令启动两个 Nginx 服务:

docker-compose up -d

这将启动两个 Nginx 容器,一个监听主机的 80 端口,另一个监听 81 端口。你可以在浏览器中访问 http://localhosthttp://localhost:81,应该分别看到两个不同的 Nginx 欢迎页面。如果遇到任何问题,请检查日志并确保配置文件内容正确。

<think> 我们在一服务器上使用Docker部署3个Nginx服务端口分别为6060、7070、8080。其中,6060端口的Nginx作为负载均衡器,轮询访问7070和8080端口两个Nginx服务(这两个服务作为后端服务器)。 步骤: 1. 首先,我们需要创建两个后端Nginx服务(7070和8080端口),以及一个负载均衡Nginx服务(6060端口)。 2. 负载均衡器(6060端口)的配置中需要设置upstream,指向两个后端服务(7070和8080端口),并配置轮询策略。 3. 由于三个服务都在同一机器上,我们需要注意端口映射和容器之间的网络通信。这里我们使用Docker的桥接网络,通过宿主机端口映射来访问,同时负载均衡器通过宿主机的内部IP(127.0.0.1)或容器IP来访问后端服务。但注意,在Docker中,容器之间可以通过容器名称通信(如果使用自定义网络),也可以通过宿主机的IP(使用host.docker.internal,但在Linux中可能需要特殊处理)或直接使用宿主机IP(但宿主机IP可能变化)。另一种方法是使用Docker自定义网络,让容器通过容器名访问。 为了简化,我们可以创建一个自定义网络,然后让三个容器都加入这个网络,这样它们就可以通过容器名互相访问。 具体步骤: 步骤1:创建自定义网络(例如nginx-net) docker network create nginx-net 步骤2:启动两个后端Nginx容器(7070和8080),并加入自定义网络。注意,这两个容器内部都是80端口,我们映射到宿主机的7070和8080端口,同时给容器命名(如nginx-7070, nginx-8080),这样在自定义网络中可以通过容器名访问。 步骤3:配置负载均衡器(6060端口)。我们需要自定义一个Nginx配置文件,其中配置upstream指向两个后端容器(在自定义网络中,我们可以使用容器名作为域名)。 负载均衡器的Nginx配置示例(假设我们命名为nginx.conf): ``` http { upstream backend { server nginx-7070:80; # 使用容器名,因为它们在同一个自定义网络内 server nginx-8080:80; # 默认轮询 } server { listen 80; location / { proxy_pass http://backend; } } } ``` 注意:这个配置是负载均衡容器内部的配置,我们将其映射到宿主机的6060端口。 步骤4:启动负载均衡容器,使用自定义的配置文件,并加入同一个自定义网络,映射宿主机6060端口到容器的80端口。 步骤5:验证。 详细命令如下: 1. 创建自定义网络: docker network create nginx-net 2. 启动两个后端Nginx容器(这里我们使用默认的Nginx页面,实际中你可以挂载自己的页面): docker run -d --name nginx-7070 --network nginx-net -p 7070:80 nginx docker run -d --name nginx-8080 --network nginx-net -p 8080:80 nginx 注意:这里映射了宿主机的7070和8080端口,这样我们可以单独访问它们。同时,它们加入了nginx-net网络,可以通过容器名互相访问(但这里我们需要它们互相访问,而是负载均衡器访问它们)。 3. 准备负载均衡器的配置文件。在宿主机上创建一个目录,比如`/home/nginx-lb/conf`,然后创建`nginx.conf`文件,内容如下: events {} http { upstream backend { server nginx-7070:80; server nginx-8080:80; } server { listen 80; location / { proxy_pass http://backend; } } } 注意:这个配置文件只包含了http块和events块(events块能少,但可以为空),我们删除了默认配置中多余的部分,只保留核心配置。 4. 启动负载均衡容器,挂载这个配置文件,并加入自定义网络,映射宿主机6060端口docker run -d --name nginx-lb --network nginx-net -p 6060:80 -v /home/nginx-lb/conf/nginx.conf:/etc/nginx/nginx.conf nginx 这里,我们将宿主机上的配置文件挂载到容器内的默认配置文件位置(/etc/nginx/nginx.conf),覆盖默认配置。 5. 测试: - 访问 http://localhost:7070 和 http://localhost:8080 应该能看到Nginx默认页面。 - 访问 http://localhost:6060,每次刷新应该轮流转到7070和8080端口服务(由于两个后端内容一样,为了观察轮询效果,我们可以修改两个后端的默认页面,使其不同,比如分别改为“Server 7070”和“Server 8080”)。 修改两个后端Nginx的默认页面步骤(可选): 对于nginx-7070容器: docker exec -it nginx-7070 bash 然后修改/usr/share/nginx/html/index.html,将其内容改为“Server 7070”等。 同样修改nginx-8080。 这样,在访问6060端口时,刷新页面,就能看到在两个Server之间轮询。 注意:由于我们是在同一宿主机上,且使用了自定义网络,负载均衡器容器通过容器名(nginx-7070和nginx-8080)访问后端容器,这是Docker内部DNS解析的。 如果想修改默认页面,也可以通过查看Nginx日志来观察轮询: 在负载均衡容器中,查看访问日志,或者通过后端容器的访问日志来观察。 引用说明: 根据引用[4]中提到的,我们可以通过挂载配置文件来自定义Nginx配置。这里我们使用了类似的方法挂载负载均衡器的配置文件。 另外,引用[1]和[2]提到了端口映射的基本方法,我们这里将宿主机的6060端口映射到负载均衡容器的80端口,7070和8080同理。 注意:以上方法在同一宿主机上运行。如果宿主机有防火墙,需要开放这些端口。 此外,我们也可以使用Docker Compose来简化操作,但用户要求使用docker命令。 因此,总结步骤如下: 1. 创建自定义网络:`docker network create nginx-net` 2. 启动两个后端Nginx容器(7070和8080): - `docker run -d --name nginx-7070 --network nginx-net -p 7070:80 nginx` - `docker run -d --name nginx-8080 --network nginx-net -p 8080:80 nginx` 3. 在宿主机上创建负载均衡器的配置文件(例如`/home/nginx-lb/conf/nginx.conf`),内容如上。 4. 启动负载均衡器容器(6060端口): - `docker run -d --name nginx-lb --network nginx-net -p 6060:80 -v /home/nginx-lb/conf/nginx.conf:/etc/nginx/nginx.conf nginx` 5. 测试访问。 如果遇到问题,可以查看容器日志: docker logs nginx-lb 如果需要修改配置文件,可以修改宿主机上的配置文件,然后重启nginx-lb容器: docker restart nginx-lb 引用: [^1]: 端口映射的基本方法。 [^4]: 自定义Nginx配置的方法。 注意:以上配置中,负载均衡器使用的是Nginx的默认轮询策略,如果需要其他策略(如权重、ip_hash等),可以修改upstream配置。 相关问题: 1. 如何修改Nginx的负载均衡策略? 2. 如何通过Docker Compose实现上述部署? 3. 如何配置HTTPS的负载均衡? </think> 根据您的需求,在一服务器上使用 Docker 部署 3 个 Nginx 服务端口 6060 作为负载均衡器,7070 和 8080 作为后端服务),以下是完整实现方案: ### 解决方案步骤 1. **创建自定义网络**(容器间通信) ```bash docker network create nginx-net ``` 2. **部署两个后端 Nginx 服务**(7070/8080 端口) ```bash # 部署后端服务 1 (7070) docker run -d --name backend1 --network nginx-net -p 7070:80 nginx # 部署后端服务 2 (8080) docker run -d --name backend2 --network nginx-net -p 8080:80 nginx ``` 3. **创建负载均衡器配置** ```nginx events {} http { upstream backend { server backend1:80; # 指向第一个容器 server backend2:80; # 指向第二个容器 } server { listen 80; location / { proxy_pass http://backend; # 反向代理到后端 } } } ``` 保存为 `nginx-lb.conf` 4. **部署负载均衡器**(6060 端口) ```bash docker run -d --name loadbalancer \ --network nginx-net \ -p 6060:80 \ -v $(pwd)/nginx-lb.conf:/etc/nginx/nginx.conf \ nginx ``` ### 验证方法 1. **测试负载均衡**(轮询效果): ```bash curl http://localhost:6060 ``` 重复执行将交替返回 `backend1` 和 `backend2` 的默认页面 2. **查看后端日志**: ```bash docker logs backend1 # 查看 7070 服务日志 docker logs backend2 # 查看 8080 服务日志 ``` ### 关键配置说明 1. **网络架构** ![负载均衡架构](https://example.com/nginx-lb-diagram.png) `6060 端口` → 负载均衡器 → 轮询分发到 `7070/8080` 服务[^4] 2. **核心配置参数**: ```nginx upstream backend { server backend1:80; // 使用 Docker 容器名解析 server backend2:80; # 添加权重:server backend2:80 weight=3; } ``` 默认轮询策略可通过权重(`weight`)调整流量分配[^2] 3. **端口映射原理**: ```mermaid graph LR A[宿主机6060] --> B[负载均衡容器80] C[宿主机7070] --> D[后端容器1] E[宿主机8080] --> F[后端容器2] ``` ### 常见问题处理 1. **容器无法通信**: ```bash docker network inspect nginx-net # 检查网络连接 ``` 2. **配置生效**: ```bash docker exec loadbalancer nginx -t # 验证配置 docker restart loadbalancer # 重启生效 ``` 3. **性能监控**: ```bash docker stats loadbalancer backend1 backend2 ``` > **提示**:实际应用中建议将配置文件持久化存储(如 `-v /data/nginx:/etc/nginx`),避免容器重启丢失配置[^4]。 [^1]: 端口映射基础操作 [^2]: Nginx 负载均衡配置 [^4]: Docker 部署最佳实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值