码头工人撰写服务中的端口符号如何工作?

时间:2018-09-24 14:42:41

标签: docker docker-compose docker-networking

在docker-compose.yml中,

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

ports:
   - "5000:5000"

resp:

ports:
   - "8080"

或根本没有端口。

例如在以下docker-compose.yml中,mongodb服务必须公开一个端口以与节点服务通信,但未指定端口

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中,存在用27017:270178080表示法指定的端口awlays。

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

您能解释一下区别吗?

2 个答案:

答案 0 :(得分:2)

典型的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服务名称)和服务器正在侦听的“内部”端口号。

答案 1 :(得分:0)

要么指定两个端口(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中不会创建任何端口,以防它们与已打开的端口冲突