我有一个由多个rails项目组成的应用程序,我正在尝试将它们停靠,每个应用程序都在不同的rails端口上启动:
这是我的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
来解析笔记本电脑中的容器主机名。
有什么想法吗?
答案 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