如何在同一台机器上使用docker为一个项目托管多个环境?

时间:2018-11-01 20:09:57

标签: docker nginx

我有一个典型的Web堆栈,其中包含nginx + django + database个组件。

我已使用docker-compose将它们设置在不同的docker容器中,并且运行良好。

services:
  billing_app_dev:
    image: jameslin/billing_app:latest
    expose:
      - 8000
  billing_postgres:
    image: postgres:10.5
    restart: always
    volumes:
      - pg_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
  billing_nginx:
    image: jameslin/billing_nginx:${TAG}
    volumes:
      - app_files:/static
    links:
      - 'billing_app'
    ports:
      - 80:80

现在,我想知道如何在单台计算机上设置DEVQA环境。我可以更改djangodatabase容器以侦听不同的端口,但是由于端口80只能被一个容器侦听,因此我似乎无法单独运行nginx容器。

对于这两个不太干净的环境,我将不得不共享nginx容器。

如果无法运行2个虚拟机,还有更好的主意吗?

2 个答案:

答案 0 :(得分:0)

我有3个apache容器和1个nginx在同一台服务器上运行,因此可以肯定这不是问题。

对于Web服务器+数据库的每个堆栈,我都有一个不同的docker-compose文件,这样docker将为每个堆栈创建一个不同的网络,从而避免了并发端口的可能问题,而您只需要将nginx绑定到其他文件中服务器的端口,因为您只能将一项服务绑定到一个端口。而且,每个容器都是一个单独的“机器”,因此即使在同一网络上,它们也可以使用相同的端口。

如果您真的需要在服务器的端口80和443中运行所有服务,则可能需要将运行在这些端口中的nginx放置在内部docker网络中的反向代理中,这些服务是一种选择但是我从来没有通过docker内部网络尝试过它。

答案 1 :(得分:0)

我认为您需要的是configs.jsx或可能称为virtual ip。即使您只有一张网卡,仍然可以在其上设置2 ips。

然后,您可以在主机上设置2个不同的nginx容器,并使用不同的ip但使用相同的80端口。

类似如下:

ip aliasing

详细信息指的是Create Multiple IP Addresses to One Single Network Interface

对于cd /etc/sysconfig/network-script/ cp ifcfg-eth0 ifcfg-eth0:1 vi ifcfg-eth0:1 # Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) DEVICE=eth0:1 ----> sub network card HWADDR=00:0C:29:45:62:3B ONBOOT=yes BOOTPROTO=static IPADDR=192.168.109.108 ----> configure a new different ip NETMASK=255.255.255.0 ,从nginx guide,您必须更改nginx泊坞窗才能将nginx修改为listen 80,然后它就不会侦听所有ip地址。