在同一主机/不同端口上运行不同的docker容器

时间:2017-09-12 07:26:07

标签: ruby-on-rails docker networking

我有一个由多个rails项目组成的应用程序,我正在尝试将它们停靠,每个应用程序都在不同的rails端口上启动:

  • 主要应用:1665
  • admin:3002
  • 网站:3000
  • ...

这是我的docker-compose.yml文件:

version: '2'
services:

  db:
    image: postgres:9.6
    container_name: acme_db
    hostname: db.myapp.dev
    hostname: db.ach
    ports:
      - "5432:5432"
    volumes:
      - myapp_pgdata:/var/lib/postgresql/data/pgdata
    environment:
      - PGDATA=/var/lib/postgresql/data/pgdata
      - VIRTUAL_HOST=db.myapp.dev
    networks:
      - generic

  myapp:
    image: acme/myapp
    container_name: acme_myapp
    hostname: app.myapp.dev
    command: rails s -p 1665 -b '0.0.0.0'
    volumes:
      - ./myapp:/usr/src/app
      - $SSH_AUTH_SOCK:/tmp/ssh_auth_sock
    ports:
      - "1665:1665"
    depends_on:
      - db
    environment:
      - SSH_AUTH_SOCK=/tmp/ssh_auth_sock
      - RAILS_ENV=development
      - VIRTUAL_HOST=myapp.dev
    networks:
      - generic

  admin:
    image: acme/admin
    container_name: acme_admin
    hostname: admin2.myapp.dev
    command: rails s -p 3002 -b '0.0.0.0'
    volumes:
      - ./admin2:/usr/src/app
      - $SSH_AUTH_SOCK:/tmp/ssh_auth_sock
    ports:
      - "3002:3002"
    depends_on:
      - myapp
    environment:
      - SSH_AUTH_SOCK=/tmp/ssh_auth_sock
      - RAILS_ENV=development
      - VIRTUAL_HOST=admin2.myapp.dev
    networks:
      - generic

  website:
    image: acme/website
    container_name: acme_website
    hostname: web.myapp.dev
    command: rails s -p 3001 -b '0.0.0.0'
    volumes:
      - ./website:/usr/src/app
      - $SSH_AUTH_SOCK:/tmp/ssh_auth_sock
    ports:
      - "3001:3001"
    environment:
      - SSH_AUTH_SOCK=/tmp/ssh_auth_sock
      - RAILS_ENV=development
      - VIRTUAL_HOST=myapp.dev
    networks:
      - generic

volumes:
  myapp_pgdata:
    external: true

networks:
  generic:
    external: true

运行每个应用程序都可以正常工作,但是当应用程序需要在它们之间进行通信时我遇到了问题,例如网站需要将http请求转发到主应用程序,当它发生时,它会尝试解析此uri:{ {1}}并且,解析的ip是127.0.0.1而不是http://app.myapp.dev:1665/register docker container ip。

我该如何处理这种情况?我应该为每个容器使用完全不同的主机名吗?理想情况下,我想避免DNS解析,因此rails试图点击myapp而不是解析app.myapp.dev:1665,然后解析app.myapp.dev

顺便说一句,我正在使用127.0.0.1:1665来解析笔记本电脑中的容器主机名。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的设置允许您的容器通过“网络”按名称相互解析。由docker-compose设置。

因此<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.conduiraonline</groupId> <artifactId>contentmanagementapi</artifactId> <version>0.0.1</version> <packaging>jar</packaging> <name>ContentManagementService</name> <description>ContentManagementService</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/javax.mail/mail --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>com.conduiraonline</groupId> <artifactId>licenseapi</artifactId> <version>0.0.1</version> <classifier>exec</classifier> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>21.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin> </plugins> </build> </project> 应该可以通过website

点击主应用