Как работает нотация портов в сервисе docker compose? - PullRequest
0 голосов
/ 24 сентября 2018

в docker-compose.yml,

В чем разница между следующими обозначениями портов?

ports:
   - "5000:5000"

соответственно:

ports:
   - "8080"

или нет портов вall.

Например, в следующем 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

source: https://github.com/DanWahlin/NodeExpressMongoDBDockerApp

Однако в этом docker-compose.yml есть списки портов, указанные в нотации 27017:27017 или 8080.

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

source: https://github.com/DanWahlin/CodeWithDanDockerServices

Можете ли вы объяснить разницу?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Типичные контейнеры Docker запускают долго работающий сервер, прослушивающий некоторый порт TCP.Другие контейнеры в той же сети Docker могут получить доступ к этому контейнеру, используя имя контейнера (директива docker run --name, container_name:) в качестве имени DNS и порт, на котором работает сервер.В Docker Compose Compose создает сеть Docker для каждого файла Compose YAML, а также делает службы доступными под их ключом в файле YAML.Это работает, даже если ports: не указано.

Так, например, если ваш docker-compose.yml файл говорит

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

, тогда контейнер MongoDB будет доступен для этого имени хоста и(по умолчанию) порт, даже если он явно не имеет ports:.

Если вы объявите ports:, тогда контейнер будет доступен из-за пределов пространства Docker.Если у вас только один порт, это номер порта сервера, и Docker выбирает порт хоста;в большинстве случаев это бесполезно (но гарантированно не столкнется с конфликтом портов).Если у вас есть два порта, это порт хоста и внутренний сервисный порт.Вы также можете указать IP-адрес хоста для bind (2) с.

Наличие или отсутствие ports: не влияет на связь между донорами.Всегда используйте имя контейнера (или Docker-compose.yml имя службы) и «внутренний» номер порта, который прослушивает сервер.

0 голосов
/ 24 сентября 2018

Либо укажите оба порта (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"

С здесь

Эфемерный диапазон портов настраивается с помощью / proc / sys / net / ipv4 / ip_local_port_rangeпараметр ядра, обычно в диапазоне от 32768 до 61000.

В любом случае, вы должны иметь возможность посмотреть, чего достиг Docker в вашем сетевом стеке, изучив таблицы NAT. отсюда

В docker compose по умолчанию порты не создаются, если они сталкиваются с уже открытыми портами

...