Docker 在多个本地服务中公开本地主机端口
我目前正试图使用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开始 目前根本不使
- 一个包含Rails API的repo,运行在127.0.0.1:3000上(我们称之为
后端
)
- 一份包含同构React/Redux前端应用程序的回购协议,运行于127.0.0.1:8080(我们称之为
)前端
- 两者都有自己的Dockerfile和docker-compose.yml文件,因为它们在单独的repo中,并且都以
fine开始docker compose up
- 目前根本不使用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
,我必须使用某种别名吗?或者是外部链接?你有没有试着像我上面写的那样用一个命令启动它们?很奇怪…嗯,这些前缀是从哪里来的。。?你提到过吗?我想是这个项目的名字——我真的不想把它们放在一起,因为它们在不同的回购协议中。我使用外部链接和默认网络名称进行排序,谢谢您的帮助