在几个本地服务中暴露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:3000
在frontend
docker组成,但我不能这样做,而运行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