在几个本地服务中暴露localhost端口

我目前正试图使用​​Docker来让我们的本地开发经验更容易涉及到两个服务,但是我正努力以正确的方式使用主机和容器端口。 情况如下:

  • 一个包含Rails API的repo,在127.0.0.1:3000上运行(让我们调用这个backend
  • 一个包含同构React / Redux前端应用程序的回购,运行于127.0.0.1:8080(让我们称之为frontend
  • 两者都有自己的Dockerfile和docker-compose.yml文件,因为它们在单独的回购站中,并且都以docker-compose up
  • 目前根本没有使用Docker来进行CI或部署,计划在未来进行。

我遇到的问题是,在本地开发中, frontend应用程序正在从frontend容器中查找127.0.0.1:3000后端应用程序(后端容器中不存在) – 只有主机和backend容器实际运行Rails应用程序。

是否有可能将backend容器的3000端口转发到前端容器? 或者至less是主机的3000端口,因为我可以在我的电脑上看到本地主机上的Rails应用程序。 我已经尝试127.0.0.1:3000:3000frontenddocker组成,但我不能这样做,而运行Rails应用程序的端口正在使用,并无法连接。 我想也许我误解了这个观点,或者错过了一些明显的东西?

文件:

frontend Dockerfile

 FROM node:8.7.0 RUN npm install --global --silent webpack yarn RUN mkdir /app WORKDIR /app COPY package.json /app/package.json COPY yarn.lock /app/yarn.lock RUN yarn install COPY . /app 

frontend docker-compose.yml

 version: '3' services: web: build: . command: yarn start:dev volumes: - .:/app ports: - '8080:8080' - '127.0.0.1:3000:3000' # rails backend exposed to localhost within container 

backend Dockerfile

 FROM ruby:2.4.2 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN bundle install COPY . /app 

backend docker-compose.yml

 version: '3' volumes: postgres-data: driver: local services: postgres: image: postgres:9.6 volumes: - postgres-data:/var/lib/postgresql/data web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/app ports: - '3000:3000' depends_on: - postgres 

你必须将这些容器联合在一个networking中 。 在你的docker-compose.yml文件中做。

检查此文档以了解Docker中的networking。

frontend docker-compose.yml

 version: '3' services: gui: build: . command: yarn start:dev volumes: - .:/app ports: - '8080:8080' - '127.0.0.1:3000:3000' networks: - webnet networks: webnet: 

backend docker-compose.yml

 version: '3' volumes: postgres-data: driver: local services: postgres: image: postgres:9.6 volumes: - postgres-data:/var/lib/postgresql/data back: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/app ports: - '3000:3000' depends_on: - postgres networks: - webnet networks: webnet: 

Docker有自己的DNSparsing,所以在你做这个之后,你可以通过设置地址来连接你的后端: http://back:3000

在前端应用程序中使用外部链接pipe理解决这个问题,以链接到后端应用程序的默认networking,如下所示:

 version: '3' services: web: build: . command: yarn start:dev environment: - API_HOST=http://backend_web_1:3000 external_links: - backend_default networks: - default - backend_default ports: - '8080:8080' volumes: - .:/app networks: backend_default: # share with backend app external: true