在单个Linux Web服务器服务器上运行多个Docker容器

时间:2019-09-22 15:07:47

标签: docker nginx docker-compose

你好,我目前正在计划使用Docker的一些服务器架构。 (我是Docker的新手)

我的目标是:

  1. 要在单个ubuntu计算机上运行多个docker容器。
  2. 每个容器的每个进程使用相同的端口:(例如)前端使用localhost:8080,后端使用localhost:3000。

每个容器的工作方式:

现在我正在使用docker compose来同时运行前端和后端。

docker-compose.yml

version: '3'
services:
  frontend:
    build: ./frontend
    ports:
      - 8080:80
    networks:
      - app-network
  backend:
    build: ./backend
    ports:
      - 3000:3000
    working_dir: /usr/src/server
    command: node server.bundle.js
    networks:
      - app-network
networks:
  app-network:
    driver: bridge

这很好。我可以访问localhost:8080来访问网页,并可以访问localhost:3000来访问后端。

注意:前端容器使用NGINX docker映像,后端容器使用NODE:10 docker映像。

我想完成的事情

在我的服务器上,我将有另一个NGINX实例。我想以某种方式将每个docker-compose设置容器化到一个端口,例如localhost:5000。

这样,当我从www.example-website1.com收到请求时,它将重定向到localhost:5000,然后从该docker-compose设置加载localhost:8080。

再次从www.example-website2.com收到请求时,它重定向到localhost:5001,然后从另一个docker-compose设置加载localhost:8080。

这可能吗?还是有其他方法可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

您不能在两个不同的容器中使用相同的端口,必须始终公开一个不同的端口。

要配置ngnix,必须将其安装在主机上,然后转到文件夹:

/etc/ngnix/sites-enabled 

然后使用ngnix将使用的规范创建一个.conf文件。 示例:

myapi.conf

server {
  server_name mywebsite.com;
  access_log  /etc/nginx/mywebsite.log;

  location / {
      proxy_pass http://127.0.0.1:9003;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

在此示例中,通过网站mywebsite.com到达的所有流量都将定向到暴露了端口9003的容器。 希望我能帮到你

答案 1 :(得分:1)

在示例中,端口8080没什么特别的,您可以直接选择要用于单独的基于Compose的应用程序的主机端口。您必须为每个Compose设置选择不同的已发布端口,否则容器将根本无法启动。

如果您的设置是主机nginx联系“前端”容器,然后将一些请求转发到“后端”容器,那么您只需要选择前端所需的端口号即可,而无需不需要公开后端。

version: '3'
services:
  frontend:
    build: ./frontend
    ports:
      # Pick a different port "5000" for each setup
      - 5000:80
  backend:
    build: ./backend
    # Use default command:, working_dir: from image
    # Could publish ports: if necessary
    depends_on:
      - frontend
# Use "default" Docker network

如果您确实需要从外部直接联系后端,则可以通过主机nginx代理以相同的方式公开后端,并从中发布ports:,再次为每个容器堆栈选择不同的端口。

在两个容器之间,如果backend需要调用frontend,则它可以始终使用Docker Compose服务名称和容器内 的端口:{{1} }。您不需要http://frontend:80/expose:即可工作。