2016-04-24 80 views
0

我正在为多个网站创建Docker环境。我已决定为每个域分开具有多个容器的docker-compose.yml文件。目前,我有这样的事情:为多个Docker容器使用域而不是端口

web: 
    image: nginx:latest 
    volumes: 
    - /c/Users/marcin/dock-test/html/test-laravel-project-2/:/usr/share/nginx/html/test-laravel-project-2/ 
    - /c/Users/marcin/dock-test/nginx-conf/conf.d2/:/etc/nginx/conf.d 
    - /c/Users/marcin/dock-test/nginx-log/:/var/log/nginx 
    ports: 
    - "8088:80" 
    working_dir: /usr/share/nginx/html/test-laravel-project-2/ 
    links: 
    - php 
    - db 
    container_name: lara.web 
    environment: 
    - VIRTUAL_HOST='l2.app' 
    - VIRTUAL_NETWORK='nginx-proxy' 
    expose: 
    - 8088 
php: 
    build: ../dockerfiles/ 
    dockerfile: Dockerfile-php7-fpm 
    volumes: 
    - /c/Users/marcin/dock-test/html/test-laravel-project-2/:/usr/share/nginx/html/test-laravel-project-2/ 
    - /c/Users/marcin/dock-test/php-config/:/usr/local/etc/php/ 
    working_dir: /usr/share/nginx/html/ 
    links: 
    - db 
    container_name: lara.php 
db: 
    image: mysql:5.7 
    environment: 
    MYSQL_ROOT_PASSWORD: 
    MYSQL_DATABASE: 
    MYSQL_USER: 
    MYSQL_PASSWORD: 
    expose: 
    - 3306 
    volumes: 
    - /c/Users/marcin/dock-test/mysql2/:/var/lib/mysql/ 
    - /c/Users/marcin/dock-test/mysql-log2/:/var/log/mysql/ 
    ports: 
    - "33062:3306" 
    container_name: lara.db 

这是工作正常,但我想用这个域名,因为此刻我需要使用8088端口,像这样:http://192.168.99.100:8088。很明显,我可以在上面的配置中使用80:80映射,但我们假设我想使用8088端口(因为对于多个站点,我将需要为每个网站使用不同的端口)。

现在的问题 - 我如何使用域名而不是IP与端口?我已经添加到我的Windows(我使用Windows作为操作系统)l2.app映射到192.168.99.100,但我仍然需要像这样使用它:http://l2.app:8088

我也试着nginx-proxy这样的:

docker pull jwilder/nginx-proxy 
docker-compose up -d 
docker run -d -p 80:8088 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy 

但是当我尝试使用http://l2.app我越来越503,显然,当我使用http://l2.app:8088一切正常访问网站。

我假设我可能错误配置了端口映射nginx-proxy,但不知道映射在哪个位置不正确。你能给我这个建议吗?

+0

我想你需要首先启动'nginx-proxy'容器,然后'docker-compose up'。另外''nginx-proxy'的端口映射应该是80:80。虽然我认为Windows上的这个设置可能会有进一步的问题,因为Docker在Windows上的虚拟机内部运行,所以现在您将'l2.app'指向192.168.99.100,但'nginx-proxy'指向'l2.app '到虚拟机内容器的内部IP地址。我没有测试过,但我认为它可能无法正常工作。 –

+0

@warmoverflow我几乎可以肯定,我也在努力,因为你写了,但我会尽快再试一次,我将我的PC周围 –

+0

@warmoverflow我已经做到了 - 没有成功。我也尝试将'expose'改为'80',但它也完全没有帮助 –

回答

1

这比我想象的要容易。以下是通过命令行执行的步骤,但您应该可以基于此创建相应的docker-compose.yml文件。你不需要端口映射的应用容器,如果它运行在默认为80(代理会知道如何转发流量到每个容器的80端口,所以你并不需要将它们映射!)

  1. 编辑Windows主机文件,将域指向192.168.99.100

在Windows 2000/XP/Vista/7/8/10上,文件位置为C:\\Windows\\System32\\drivers\\etc\\hosts。添加下列行

192.168.99.100 myapp1.com 
192.168.99.100 myapp2.com 
  • 开始nginx-proxy容器第一
  • 注意,双斜线var之前。取决于您使用的终端,您可能只需要一个斜线。为自己尝试。

    docker run -d -p 80:80 -v //var/run/docker/sock:/tmp/docker.sock:ro jwilder/nginx-proxy 
    
  • 启动app1app2容器
  • 您可以使用相同的命令开始更多的容器,只是改变了域名和图像名称

    docker run -d -e VIRTUAL_HOST=myapp1.com myapp1 
    docker run -d -e VIRTUAL_HOST=myapp2.com myapp2 
    
    1. 在您的网络浏览器中,打开http://myapp1.comhttp://myapp2.com
    +0

    感谢您的回复,我还没有尝试过,但我正在使用'docker-compose.yml'和运行像'docker-compose up -d'这样的容器,并用'docker run'显示该方法。我应该使用哪个图像,以及如何在不使用'docker-compose'的情况下链接它们? –

    +0

    我相信如果你先用80:80运行nginx-proxy,然后运行你的撰写文件(但删除端口映射并公开网络命令),它将会正常工作。如果没有,请尝试删除VIRTUAL_NETWORK –

    +0

    恐怕它不起作用。没有'myapp1'图片,因为我在'docker-compose.yml'中有自己的容器名称。 –

    相关问题