【问题标题】:How do I expose my service to the internal docker network?如何将我的服务公开给内部 docker 网络?
【发布时间】:2017-12-28 20:45:24
【问题描述】:

我正在运行一组这样的服务:

version: '2'
services:
  web:
    build: ./web
    ports: 
      - "3000:3000"
    links:
      - api
  api:
    build: ./api
    links:
      - db
  db:
    image: postgres

我想将web服务暴露给宿主机的网络接口,将宿主机的3000端口绑定到容器的3000端口。但是,我只想将api 服务公开给内部网络,这意味着我只希望它可以被 Web 服务访问。 IIRC,这意味着我需要在 docker-compose 文件中将api 服务暴露给bridge 网络。

如果我正在运行 docker-cli,我会通过指定 --net bridge 参数来执行此操作。但我不确定如何在撰写文件中执行此操作。请帮忙!

【问题讨论】:

  • 自从我使用 Docker Compose 已经有一段时间了,但在我看来,这应该已经可以满足您的需求了 - 从 web 容器的角度来看,主机名 api 应该解析为私网api容器的IP地址。
  • docker网络是否分配了动态端口?
  • 无需分配端口。如果您在api 容器内的端口n 上有监听,那么web 容器将能够通过api:n 连接到它。
  • 现在我有一个不同的问题,只有我的 api 容器在我运行 docker-compose up 时启动
  • @OliverCharlesworth 工作。请正式添加您的答案,并将其标记为正确!

标签: docker networking docker-compose


【解决方案1】:

这里不需要做任何特别的事情。 Docker 为您编写automatically creates a private network,并配置名称解析,以便web 容器能够访问api 容器api:x 的端口x

【讨论】:

    【解决方案2】:

    您需要为 api 服务创建一个单独的内部网络。并将 api 服务附加到内部网络,同时将 Web 服务附加到桥接网络和内部网络。您必须使用网络附加信息更新 docker-compose 文件。

    我找到了一个版本 3 的示例:

    version: '3'
    services:
      worker:
      image: dockersamples/examplevotingapp_worker
      networks:
        - frontend
        - backend
      deploy:
        mode: replicated
        replicas: 6
    

    【讨论】:

    • 这里不需要显式创建网络。
    【解决方案3】:

    "link" 已经过时了,它耦合容器,你最好定义一个桥接网络(实际上是 docker-compose 做的)。下面的例子:

    version: '2' services: web: build: ./web ports: - 3000:3000 container_name: web api: build: ./api container_name: api db: image: postgres container_name: db

    conatiner_name是桥接网络中的主机名。对于web容器可以通过主机名api访问api。像这样:

    http://api

    顺便说一句,你最好在容器db中挂载卷~

    举一个我的项目为例:

    // docker-compsoe.yml version: "2" services: web: build: context: ./web dockerfile: Dockerfile container_name: api-web working_dir: /etc/nginx/ tty: true stdin_open: true ports: - 2017:2017 depends_on: - server server: build: context: ./server dockerfile: Dockerfile container_name: api-server working_dir: /app tty: true stdin_open: true ports: - 2018:2018 depends_on: - db db: image: mongo:3 container_name: api-db tty: true stdin_open: true volumes: - ./data:/data ports: - 27001:27017

    //容器api-web中的nginx.conf,它连接到容器api-server

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 16 64k;
    gzip_http_version 1.1;
    gzip_comp_level 9;
    gzip_types application/javascript text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    
    server {
      listen 2017;
      root /usr/share/nginx/html;
      index index.html;
      location /api {
        proxy_pass http://api-server:2018;
      }
      location / {
        try_files $uri $uri/ /index.html;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多