我正在使用这个lib:
https://github.com/jwilder/nginx-proxy
这是我的docker-compose文件:
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
whoami:
image: jwilder/whoami
environment:
- VIRTUAL_HOST=whoami.local
service1:
image: mynode:1.4
build: .
volumes:
- .:/app
restart: always
environment:
- VIRTUAL_HOST=service1.local
service2:
image: mynodeother:1.3
build: .
volumes:
- .:/app
restart: always
environment:
- VIRTUAL_HOST=service2.local
我添加了2个新节点服务......
我可以这样做:curl -H "Host: service2.local" localhost
并从service2获得响应....
问题是我从中获得了什么好处?如何在80端口上运行service1?
这是来自service1的Dockerfile
:
FROM node:6.9.4
# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
RUN npm install nodemon -g
# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install
# Bundle app source
COPY . /usr/src/app
EXPOSE 8080
CMD [ "npm", "start" ]
答案 0 :(得分:0)
这很简单,你只需要在80端口运行所有服务,并在Dockerfile中显示那个端口,就是它。
只要您不将该端口发布到您的主机(就像您使用nginx一样),就没有问题。
优点是你在那里的每项服务都可以通过使用主机名到达另一个服务,这意味着容器的名称,这很酷,因为你不需要知道当前的ip地址分配给每个容器。
因此,如果您使用bash
或sh
进入其中一项服务,则应该能够使用主机名ping其他服务:
内部服务1:
ping service2
关于nginx-proxy
的好处是它会检测你是否扩展了你的一个服务并且会自动更新nginx配置:
docker-compose scale service1=3
我将启动service1的其他2个实例,无论你有100个,其余服务都可以使用hostname:service1来访问它们。
因此,您可以平衡负载,而不必担心同一服务的每个实例的IP地址。