Docker 在多个本地服务中公开本地主机端口

Docker 在多个本地服务中公开本地主机端口,docker,docker-compose,Docker,Docker Compose,我目前正试图使用Docker来简化涉及两个服务的本地开发体验,但我正在努力以正确的方式使用主机和容器端口。情况如下: 一个包含Rails API的repo,运行在127.0.0.1:3000上(我们称之为后端) 一份包含同构React/Redux前端应用程序的回购协议,运行于127.0.0.1:8080(我们称之为前端) 两者都有自己的Dockerfile和docker-compose.yml文件,因为它们在单独的repo中,并且都以docker compose upfine开始 目前根本不使

我目前正试图使用Docker来简化涉及两个服务的本地开发体验,但我正在努力以正确的方式使用主机和容器端口。情况如下:

  • 一个包含Rails API的repo,运行在127.0.0.1:3000上(我们称之为
    后端
  • 一份包含同构React/Redux前端应用程序的回购协议,运行于127.0.0.1:8080(我们称之为
    前端
  • 两者都有自己的Dockerfile和docker-compose.yml文件,因为它们在单独的repo中,并且都以
    docker compose up
    fine开始
  • 目前根本不使用Docker进行CI或部署,计划将来使用Docker
我遇到的问题是,在本地开发中,
frontend
应用程序正在从
frontend
容器中查找127.0.0.1:3000上的API后端,而该容器不在那里-它仅对主机和实际运行Rails应用程序的
backend
容器可用

是否可以将
后端
容器的3000端口转发到前端容器?或者至少主机的3000端口,我可以在我的计算机上看到本地主机上的Rails应用程序。我在
前端
docker compose中尝试了
127.0.0.1:3000:3000
,但在运行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
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
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
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
version: '3'
services:
  gui:
    build: .
    command: yarn start:dev
    volumes:
      - .:/app
    ports:
      - '8080:8080'
      - '127.0.0.1:3000:3000' 
    networks:
       - webnet

networks:
  webnet:
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:
backend
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
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'
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
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
version: '3'
services:
  gui:
    build: .
    command: yarn start:dev
    volumes:
      - .:/app
    ports:
      - '8080:8080'
      - '127.0.0.1:3000:3000' 
    networks:
       - webnet

networks:
  webnet:
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-compose.yml文件中执行此操作

选中此项可了解docker中的网络

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
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
version: '3'
services:
  gui:
    build: .
    command: yarn start:dev
    volumes:
      - .:/app
    ports:
      - '8080:8080'
      - '127.0.0.1:3000:3000' 
    networks:
       - webnet

networks:
  webnet:
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:
backend
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
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
version: '3'
services:
  gui:
    build: .
    command: yarn start:dev
    volumes:
      - .:/app
    ports:
      - '8080:8080'
      - '127.0.0.1:3000:3000' 
    networks:
       - webnet

networks:
  webnet:
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有自己的DNS解析,因此在完成此操作后,您可以通过将地址设置为:
http://back:3000

通过使用前端应用程序中的外部链接链接到后端应用程序的默认网络来解决此问题,如下所示:

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

如果您需要同时运行这些docker compose文件,可以这样做
docker compose-f docker-compose.yml-f docker-compose.prod.yml up-d
感谢您的回复!我尝试了上述方法,但最终创建了两个网络
frontend\u webnet
backend\u webnet
,我必须使用某种别名吗?或者是外部链接?你有没有试着像我上面写的那样用一个命令启动它们?很奇怪…嗯,这些前缀是从哪里来的。。?你提到过吗?我想是这个项目的名字——我真的不想把它们放在一起,因为它们在不同的回购协议中。我使用
外部链接和默认网络名称进行排序,谢谢您的帮助