【问题标题】:How ports notation in docker compose service works?docker compose 服务中的端口符号如何工作?
【发布时间】:2018-09-24 14:42:41
【问题描述】:

在 docker-compose.yml 中,

以下端口符号有什么区别?

ports:
   - "5000:5000"

回复:

ports:
   - "8080"

或根本没有端口。

例如在下面的docker-compose.yml中,mongodb服务必须暴露一个端口才能与node服务通信,但没有指定端口

services:

  node:
    build:
      context: .
      dockerfile: node.dockerfile
    ports:
      - "3000:3000"
    networks:
      - nodeapp-network
    depends_on: 
      - mongodb

  mongodb:
    image: mongo
    networks:
      - nodeapp-network

networks:
  nodeapp-network:
    driver: bridge

来源:https://github.com/DanWahlin/NodeExpressMongoDBDockerApp

但是,在这些 docker-compose.yml 中,有些端口 awlay 使用 27017:270178080 表示法指定。

services:
    nginx:
      container_name: nginx
      image: ${DOCKER_ACCT}/nginx
      build: 
        context: .
        dockerfile: .docker/nginx.${APP_ENV}.dockerfile
      links:
        - node1:node1
        - node2:node2
        - node3:node3
      ports:
        - "80:80"
        - "443:443"
      networks:
        - codewithdan-network

    node1:
      container_name: node-codewithdan-1
      image: ${DOCKER_ACCT}/node-codewithdan
      build: 
        context: .
        dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
      ports:
      - "8080"
      volumes:
        - .:/var/www/codewithdan
      working_dir: /var/www/codewithdan
      env_file:
        - ./.docker/env/app.${APP_ENV}.env
      depends_on:
        - mongo
        - redis
      networks:
        - codewithdan-network

    node2:
      container_name: node-codewithdan-2
      image: ${DOCKER_ACCT}/node-codewithdan
      build: 
        context: .
        dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
      ports:
      - "8080"
      volumes:
        - .:/var/www/codewithdan
      working_dir: /var/www/codewithdan
      env_file:
        - ./.docker/env/app.${APP_ENV}.env
      depends_on:
        - mongo
        - redis
      networks:
        - codewithdan-network

    node3:
      container_name: node-codewithdan-3
      image: ${DOCKER_ACCT}/node-codewithdan
      build: 
        context: .
        dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
      ports:
      - "8080"
      volumes:
        - .:/var/www/codewithdan
      working_dir: /var/www/codewithdan
      env_file:
        - ./.docker/env/app.${APP_ENV}.env
      depends_on:
        - mongo
        - redis
      networks:
        - codewithdan-network

    mongo:
      container_name: mongo
      image: ${DOCKER_ACCT}/mongo
      build:
        context: .
        dockerfile: .docker/mongo.dockerfile
      ports:
      - "27017:27017"
      env_file:
        - ./.docker/env/mongo.${APP_ENV}.env
      networks:
        - codewithdan-network

    redis:
      container_name: redis
      image: ${DOCKER_ACCT}/redis
      build: 
        context: .
        dockerfile: .docker/redis.${APP_ENV}.dockerfile
      ports:
        - "6379"
      networks:
        - codewithdan-network

networks:
    codewithdan-network:
      driver: bridge

来源:https://github.com/DanWahlin/CodeWithDanDockerServices

你能解释一下区别吗?

【问题讨论】:

    标签: docker docker-compose docker-networking


    【解决方案1】:

    典型的 Docker 容器运行一个长时间运行的服务器,侦听某个 TCP 端口。同一 Docker 网络上的其他容器可以使用容器的名称(docker run --namecontainer_name: 指令)作为 DNS 名称和服务器运行的端口来访问该容器。在 Docker Compose 中,Compose 为每个 Compose YAML 文件创建一个 Docker 网络,并在 YAML 文件中的密钥下提供服务。即使没有指定 ports:,这也有效。

    例如,如果您的 docker-compose.yml 文件显示

    services:
      mongo:
        image: mongo
      others:
        env:
          MONGODB_HOST: mongo
          MONGODB_PORT: 27017
    

    那么 MongoDB 容器将可以通过该主机名和(默认)端口访问,即使它没有明确具有 ports:

    如果您确实声明了ports:,那么该容器将可以从 Docker 空间外部访问。如果你只有一个端口,那就是服务器的端口号,Docker 选择主机端口;这在大多数情况下没有用(但可以保证不会遇到端口冲突)。如果你有两个端口,它们是主机端口和内部服务端口。您还可以指定要绑定(2)到的主机 IP 地址。

    ports: 的存在与否不会影响捐赠者之间的交流。始终使用容器的名称(或Docker-compose.yml 服务名称)和服务器正在侦听的“内部”端口号。

    【讨论】:

    • 关于“Compose 根据 Compose YAML 文件创建一个 Docker 网络”:好的,但是我的示例中的网络声明有什么影响?
    • 它会创建第二个网络并使用它。我认为它曾经是必需的(就像之前的links:)并且已经被载入教程。
    【解决方案2】:

    要么指定两个端口 (HOST:CONTAINER),要么只指定容器端口(选择临时主机端口)。所以在你的情况下8080 是容器端口

    ports:
     - "3000"
     - "3000-3005"
     - "8000:8000"
     - "9090-9091:8080-8081"
     - "49100:22"
     - "127.0.0.1:8001:8001"
     - "127.0.0.1:5000-5010:5000-5010"
     - "6060:6060/udp"
    

    来自here

    临时端口范围由 /proc/sys/net/ipv4/ip_local_port_range 内核参数配置,通常范围为 32768 到 61000。

    无论哪种方式,您都应该能够通过检查您的 NAT 表来了解 Docker 在您的网络堆栈中完成了什么。 from here

    默认情况下,在 docker compose 中不会创建任何端口,以防它们与已打开的端口发生冲突

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多