如何在版本 2 docker-compose 定义文件中定义网络?

How do you define a network in a version 2 docker-compose definition file?

documentation about networking is currently 对此非常含糊 ― 你如何实现 docker-compose.yml 创建 虚拟网络,让服务(容器)由它在那个网络上通信?

此场景中的目标是不依赖于预定义的网络,用于为 docker-compose 定义的容器集合。而是将网络定义包含在 docker-compose 定义文件中。

对于预定义的网络,如果 A 中的应用程序使用名称 B 作为主机名来访问打包在 B 中的应用程序,则以下内容将起作用端口 9000。它将用于它的 host:port 将是 B:9000(在我的特定情况下更具体地说是 uri mongodb://B:9000)。

foo:
  net: my-pre-defined-network
  container_name: A
  image: foo
bar:
  net: my-pre-defined-network
  container_name: B
  image: bar
  ports:
    - "9000:9000"

但我的观点是在 docker-compose 配置中定义一个网络,而不是假设一个网络是先验定义的...

TL;DR

自动创建默认网络。请参阅 https://docs.docker.com/compose/networking/ 的开头部分,了解如何在此网络中寻址容器。

只要您使用版本 2 格式,Compose 就会为您创建一个 default 网络,但如果您想要自定义网络,请参阅此处的文档:

您可以在 Compose 文件的顶层创建一个 networks 部分,并在每个服务的 networks 部分中引用它们。但是您不需要,只需使用下面评论中描述的默认网络即可。

请查看以下示例,其中包括网络定义、流量实现等。

version: '2.2'
services: 
  unifiedpushserver: 
    image: docker.io/aerogear/unifiedpush-wildfly:2.1.0 
    networks: 
      - network 
    volumes: 
       - ./helper:/ups-helper:z  
    entrypoint: "/ups-helper/exportKeycloakHost.sh" 
    depends_on: 
       unifiedpushDB: 
         condition: service_healthy 
    environment: <br>
        POSTGRES_SERVICE_HOST: ${POSTGRES_SERVICE_HOST} 
        POSTGRES_USER: ${POSTGRES_USER} 
        POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} 
        POSTGRES_SERVICE_PORT: ${POSTGRES_SERVICE_PORT} 
        POSTGRES_DATABASE: ${POSTGRES_DATABASE} 
        KEYCLOAK_SERVICE_HOST: ${KEYCLOAK_SERVICE_HOST} 
        KEYCLOAK_SERVICE_PORT: ${KEYCLOAK_SERVICE_PORT} 
    labels: 
      traefik.backend: "aerogear" 
      traefik.docker.network: "appliance" 
      traefik.domain: "notification.com" 
      traefik.enable: "true" 
      traefik.frontend.entryPoints: "http, https" 
      traefik.frontend.redirect: "false" 
      traefik.frontend.rule: "Host: notification.com" 
    links: 
      - unifiedpushDB:unifiedpush 
      - keycloakServer:keycloak 
    ports: 
      - 9999:8080 
  unifiedpushDB: 
    image: postgres:9.6 
    networks: 
      - network 
    environment: 
      POSTGRES_USER: ${POSTGRES_USER} 
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} 
      POSTGRES_DB: ${POSTGRES_DATABASE} 
    healthcheck: 
      test: ["CMD-SHELL", "pg_isready -U postgres"] 
      timeout: 20s 
      retries: 10 
  keycloakServer: 
    networks: 
      - network 
    image: docker.io/jboss/keycloak:4.1.0.Final 
    command: "-b 0.0.0.0 -Dkeycloak.import=/ups-keycloak-config/ups-realm-sample.json" 
    volumes: 
      - ./keycloak-realm:/ups-keycloak-config:z 
    environment: 
      KEYCLOAK_USER: ${KEYCLOAK_USER} 
      KEYCLOAK_PASSWORD: ${KEYCLOAK_PASSWORD} 
networks: 
     network: 
       external: 
         name: appliance