简体   繁体   中英

Use different hostname / url than localhost for docker-compose web application

Summary: 2 separate applications, both using docker-compose, how can I have http://app-1.test and http://app-2.test available at the same time?

Description: I feel like I've missed something super-simple. I have 2 php-fpm (via nginx) applications, both run by similar docker-compose setups, somewhat like:

# docker-compose.yaml
version: '3'

services:
  app:
    build:
      context: .
      dockerfile: docker/Dockerfile
    container_name: app_1
    tty: true
    depends_on:
      - db
      - dbtest
    working_dir: /var/www
    volumes:
      - ./:/var/www

  webserver:
    image: nginx:stable
    container_name: app_1_webserver
    restart: always
    ports:
      - "80:80"
    depends_on:
      - app
    volumes:
      - ./:/var/www
      - ./docker/app.conf:/etc/nginx/conf.d/default.conf
    links:
      - app
# ...

On my /etc/hosts , I can add something like

127.0.0.1 app-1.test

Now I can call the app via the browser by going to app-1.test .

The second one has a similar setup, but of course it won't go up, because port 80 is blocked. I can of course change the port, but then the url would be something like app-2.test:81 instead of app-2.test . What can I do, so I can run a second application under a different local hostname? Or is using a different port the best way to go?

You can't. What you can do is add a "router" in front of your images (a third image) which does routing (proxy passing) based on the host name.

Apache or Nginx are often used for these kinds of things.

eg with apache server https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html

<VirtualHost *:80>
    ServerName app-1.test
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://image1:80/
    ProxyPassReverse / http://image1:80/
    ErrorLog /var/log/apache2/error.log
    LogLevel info
    CustomLog /var/log/apache2/access.log combined
</VirtualHost>
<VirtualHost *:80>
    ServerName app-2.test
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://image2:80/
    ProxyPassReverse / http://image2:80/
    ErrorLog /var/log/apache2/error.log
    LogLevel info
    CustomLog /var/log/apache2/access.log combined
</VirtualHost>

now you can add both names on the same ip in your /etc/hosts file and the server can route internally based on the provided hostname ( ServerName ).

The http://image1:80/ (and its like) references should be changed to the docker internal dns like specified in the docker-compose.yml

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM