docker compose 服务中的端口表示法如何工作?

Lie*_*ero 5 docker docker-compose docker-network

在 docker-compose.yml 中,

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

ports:
   - "5000:5000"
Run Code Online (Sandbox Code Playgroud)

回复:

ports:
   - "8080"
Run Code Online (Sandbox Code Playgroud)

或者根本没有端口。

例如,在下面的 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
Run Code Online (Sandbox Code Playgroud)

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

然而,在这些 docker-compose.yml 中,有使用27017:270178080符号指定的端口 awlay。

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
Run Code Online (Sandbox Code Playgroud)

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

你能解释一下其中的区别吗?

Dav*_*aze 4

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

\n\n

因此,举例来说,如果您的docker-compose.yml文件显示

\n\n
services:\n  mongo:\n    image: mongo\n  others:\n    env:\n      MONGODB_HOST: mongo\n      MONGODB_PORT: 27017\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么 MongoDB 容器将可以在该主机名和(默认)端口上访问,即使它没有\xe2\x80\x99t 明确具有ports:.

\n\n

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

\n\n

存在或不存在ports:不会影响容器间的通信。始终使用容器\xe2\x80\x99s 名称(或Docker-compose.yml服务名称)和服务器正在侦听的\xe2\x80\x9cinternal\xe2\x80\x9d 端口号。

\n