zoukankan      html  css  js  c++  java
  • docker-compose网络设置之networks

    networks使用方式之官网教程
      官网的docker-compose.yml参考文档:Compose file version 3 reference
      较为准确的中文翻译版:Compose file version 3 reference
      
      networks通常应用于集群服务,从而使得不同的应用程序得以在相同的网络中运行,从而解决网络隔离问题。这种应用在swarm部署中,非常常见。不过,本文并不做讨论。
      一般对于集群服务,常常通过docker-compose.yml文档快速编排、部署应用服务。官网中给出了如下的使用场景和方式:

    1. 未显式声明网络环境的docker-compose.yml
      例如,在目录app下创建docker-compose.yml,内容如下:

    version: '3'
    services:
    web:
    mage: nginx:latest
    container_name: web
    depends_on:
    - db
    ports:
    - "9090:80"
    links:
    - db
    db:
    image: mysql
    container_name: db

      使用docker-compose up启动容器后,这些容器都会被加入app_default网络中。使用docker network ls可以查看网络列表,docker network inspect <container id>可以查看对应网络的配置。

    $ docker net work ls
    NETWORK ID NAME DRIVER SCOPE
    6f5d9bc0b0a0 app_default bridge local
    0fb4027b4f6d bridge bridge local
    567f333b9de8 docker-compose_default bridge local
    bb346324162a host host local
    a4de711f6915 mysql_app bridge local
    f6c79184ed27 mysql_default bridge local
    6358d9d60e8a none null local

    2. networks关键字指定自定义网络
      例如下面的docker-compose.yml文件,定义了front和back网络,实现了网络隔离。其中proxy和db之间只能通过app来实现通信。其中,custom-driver-1并不能直接使用,你应该替换为host, bridge, overlay等选项中的一种。

    version: '3'

    services:
    proxy:
    build: ./proxy
    networks:
    - front
    app:
    build: ./app
    networks:
    - front
    - back
    db:
    image: postgres
    networks:
    - back

    networks:
    front:
    # Use a custom driver
    driver: custom-driver-1
    back:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
    foo: "1"
    bar: "2"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
      值得注意的是,这里定义了back和front两个网络,似乎它们的名字就定义成了back和font,但是你使用docker network ls命令并不能找到它们。假如你是在myApp目录下运行的docker-compose up命令,那么这两个网络应该分别对应myApp_back和myApp_front。

    3. 配置默认网络
    version: '2'

    services:
    web:
    build: .
    ports:
    - "8000:8000"
    db:
    image: postgres

    networks:
    default:
    # Use a custom driver
    driver: custom-driver-1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    4. 使用已存在的网络
    networks:
    default:
    external:
    name: my-pre-existing-network
    1
    2
    3
    4
    遇到的问题
      学习了上面的东西,笔者准备将自己的项目付诸实践。我的项目包含了两个docker-compose.yml,且使用了links选项,所以必须使用networks配置。
      其中,一个docker-compose.yml用于启动mysql服务,位于mysql/目录下:

     version: "3"
    services:
    dbmaster:
    image: master/mysql:latest
    container_name: dbmaster
    ports:
    - "3308:3306"
    volumes:
    - $HOME/Work/data/dbmaster:/var/lib/mysql
    environment:
    MYSQL_ROOT_PASSWORD: master
    logging:
    driver: "json-file"
    options:
    max-size: "1000k"
    max-file: "20"
    networks:
    - app

    dbslave:
    image: slave/mysql:latest
    container_name: dbslave
    ports:
    - "3309:3306"
    depends_on:
    - dbmaster
    volumes:
    - $HOME/Work/data/dbslave:/var/lib/mysql
    environment:
    MYSQL_ROOT_PASSWORD: slave
    logging:
    driver: "json-file"
    options:
    max-size: "1000k"
    max-file: "20"
    links:
    - dbmaster
    networks:
    - app
    networks:
    default:
    external:
    name: app
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
      另一个docker-compose.yml用于启动服务程序,位于cloudgo/目录下:

    version: "3"
    services:
    web:
    image: nginx:latest
    container_name: web
    depends_on:
    - cloudgo
    ports:
    - "9090:80"
    volumes:
    - $HOME/Work/docker/docker-compose/nginx/conf.d:/etc/nginx/conf.d
    links:
    - cloudgot
    logging:
    driver: "json-file"
    options:
    max-size: "1000k"
    max-file: "20"
    networks:
    - app

    cloudgo:
    image: cloudgo:latest
    container_name: cloudgo
    ports:
    - "8080:8080"
    logging:
    driver: "json-file"
    options:
    max-size: "1000k"
    max-file: "20"
    external_links:
    - dbmaster
    - dbslave
    networks:
    - app
    networks:
    app:
    external: true
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
      我决定使用预先创建的网络,然后把他们加入这个已经创建好的网络,从而实现通信。为此,我运行了如下命令:

    $ docker network create app
    1
      之后,开始运行编写好的docker-compose.yml文件。首先运行启动mysql的配置文件,结果如下:

    l$ docker-compose up
    ERROR: Service "dbmaster" uses an undefined network "app"
    1
    2
      明明已经创建好了,却还是报了错,说该网络未定义。尝试改变名称mysql_app,但是依旧报出同样的错误。最终证明,这种方法无法实现,至今没有找到官方文档给出的例子。
      所以,最终决定将第一个docker-compose.yml文件中的networks配置改为如下内容:

    networks:
    mysql_app:
    driver: bridge
    1
    2
    3
      在这个文件中定义一个网络,以便在后面使用。这里修改完毕,该文件其他地方凡是引用到了该网络的地方均要作出相同的修改。同样,第二个文件也一样。

    其他的一些用法
    使用aliases代替link
      一般的使用格式如下:

    services:
    some-service:
    networks:
    some-network:
    aliases:
    - alias1
    - alias3
    other-network:
    aliases:
    - alias2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      在下面的例子中,我的web容器可以直接通过database:3306或者db:3306访问db容器了。它们同时属于一个网络,并且db设置了主机别名,所以这样的访问方式是完全可以的。

    version: '2'

    services:
    web:
    depends_on:
    - worker
    networks:
    - new

    worker:
    depends_on:
    - db
    networks:
    - legacy

    db:
    image: mysql
    networks:
    new:
    aliases:
    - database
    legacy:
    aliases:
    - mysql
    networks:
    new:
    legacy:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
      此时直接使用depends_on已经不再需要link,如果woker需要访问db,可以直接通过mysql:port的方式。
    使用networks的要点在于:
    1. 注意自定义网络的方式
    2. 注意docker-compose.yml文件的位置与网络默认命名的关系
    3. 注意遇到问题尝试几种替代方式去解决
    ---------------------
    作者:Kiloveyousmile
    来源:CSDN
    原文:https://blog.csdn.net/Kiloveyousmile/article/details/79830810
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Chapter 4 持久存储数据对象
    pyhton Chapter3 读文件
    python笔记1
    C#读写txt文件
    机器学习第一讲
    Json对象
    表单加载
    多列树
    Java 基础【11】@注解
    Java 基础【06】复合赋值运算
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/10124499.html
Copyright © 2011-2022 走看看