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

12

网络相关的文档目前存在很大的不明确性,如何创建一个能够在其中定义的服务(容器)之间通信的虚拟网络?

在这种情况下,我们希望不依赖预定义的网络,而是将网络定义完全包含在docker-compose定义文件中。

如果使用预定义网络,则以下内容将工作(假设应用程序中的A使用名称B作为主机名来访问打包在B中监听其9000端口上的应用程序,并且它将使用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配置中定义一个网络,而不是假定先前已定义了一个网络...

简述

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


你想定义哪个网络? - XOR-Manik
一个将连接由docker-compose运行的两个容器的程序。目前在同一主机上。 - matanster
2个回答

8

如果您使用版本2格式,Compose将为您创建一个名为default的网络,但是如果您想要自定义网络,则可以查看以下文档:

您可以在Compose文件的顶层创建一个networks部分,并在每个服务的networks部分中引用它们,但是您不需要这样做,只需按照下面的注释使用默认网络即可。


我不确定在这种默认网络下,包含的应用程序应该使用什么主机名来联系其他应用程序(容器名称和“localhost”都无法使用)。此外,在运行了“docker-compose up”之后,“docker network ls”中没有显示任何默认创建的网络。 - matanster
如果您使用版本2格式,它将创建一个名为“projectname_default”的网络,其中projectname默认为项目目录的基本名称。您可以使用服务名称作为主机名进行连接。因此,在您的示例中是“foo”和“bar”。 - dnephin
1
好的参考资料适用于“版本3”;但是OP询问的是“版本2”。 - Shōgun8

1
请查看以下示例,其中包括网络定义、流量实现等内容。
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 

这是针对Docker Compose 3.XX版本的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接