zoukankan      html  css  js  c++  java
  • (转)Docker network命令

    转:https://blog.csdn.net/gezhonglei2007/article/details/51627821

    原文地址:https://docs.docker.com/engine/userguide/networking/work-with-networks/

    docker network命令

    docker network所有子命令如下:

    • docker network create
    • docker network connect
    • docker network ls
    • docker network rm
    • docker network disconnect
    • docker network inspect

    创建网络

    在安装Docker Engine时会自动创建一个默认的bridge网络docker0
    此外,还可以创建自己的bridge网络或overlay网络。

    bridge网络依附于运行Docker Engine的单台主机上,而overlay网络能够覆盖运行各自Docker Engine的多主机环境中。

    创建bridge网络比较简单如下:

     # 不指定网络驱动时默认创建的bridge网络
     docker network create simple-network
     # 查看网络内部信息
     docker network inspect simple-network
     # 应用到容器时,可进入容器内部使用ifconfig查看容器的网络详情

    但是创建一个overlay网络就需要一些前提条件(具体操作请参考Docker容器网络相关内容):
    - key-value store(Engine支持Consul、Etcd和ZooKeeper等分布式存储的key-value store)
    - 集群中所有主机已经连接到key-value store
    - swarm集群中每个主机都配置了下面的daemon参数
    - –cluster-store
    - –cluster-store-opt
    - –cluster-advertise
    然后创建overlay网络:

    # 创建网络时,使用参数`-d`指定驱动类型为overlay
    docker network create -d overlay my-multihost-network

    就使用--subnet选项创建子网而言,bridge网络只能指定一个子网,而overlay网络支持多个子网。

    在bridge和overlay网络驱动下创建的网络可以指定不同的参数,具体请参考:https://docs.docker.com/engine/userguide/networking/work-with-networks/

    连接容器

    创建三个容器,分别前两个使用默认网络启动容器,第三个使用自定义bridge网络启动。
    然后再将第二个容器添加到自定义网络。这三个容器的网络情况如下

    • 第一个容器:只有默认的docker0
    • 第二个容器:属于两个网络——docker0、自定义网络
    • 第三个容器:只属于自定义网络

    说明:通过容器启动指定的网络会覆盖默认bridge网络docker0。

    # 创建三个容器 conTainer1,container2,container3
    docker run -itd --name=container1 busybox
    docker run -itd --name=container2 busybox
    # 创建网络mynet
    docker network create -d bridge --subnet 172.25.0.0/16 mynet
    # 将容器containerr2连接到新建网络mynet
    docker network connect mynet container2
    # 使用mynet网络来容器container3
    docker run --net=mynet --ip=172.25.3.3 -itd --name=container3 busybox
    
    # 查看这三个容器的网络情况
    docker network inspect container1 # docker0
    docker network inspect container2 # docker0, mynet
    docker network inspect container3 # mynet

    默认网络与自定义bridge网络的差异

    默认网络docker0:网络中所有主机间只能用IP相互访问。通过--link选项创建的容器可以对链接的容器名(container-name)作为hostname进行直接访问。
    自定义网络(bridge):网络中所有主机除ip访问外,还可以直接用容器名(container-name)作为hostname相互访问。

    # 进入container2内部
    docker attach container2
    ping -w 4 container3 # 可访问
    ping -w 4 container1 # 不可访问
    ping -w 4 172.17.0.2 # 可访问container1的IP
    # Ctrl+P+Q退出容器,让container2以守护进程运行

    默认网络与自定义bridge网络在容器连接的差别

    在默认网络中使用link(legency link),有如下功能:
    - 使用容器名作为hostname
    - link容器时指定alias: --link=<Container-Name>:<Alias>
    - 配合--icc=false隔离性,实现容器间的安全连接
    - 环境变量注入

    自定义网络中使用docker net提供如下功能:
    - 使用DNS实现自动化的名称解析
    - 一个网络提供容器的安全隔离环境
    - 动态地attach与detach到多个网络
    - 支持与--link选项一起使用,为链接的容器提供别名(可以是尚不存在链接容器,与默认容器中–link使用的最大差别)

    默认网络中的link是静态的,不允许链接容器重启,而自定义网络下的link是动态的,支持链接容器重启(以及IP变化)
    因此,使用--link时链接的容器,在默认网络中必须提前创建好,而自定义网络下不必预先建好。

    使用docker network connetct将容器连接到新网络中时,用参数--link链接相同的容器时,可以指定不同的别名,它们是针对不同网络的。

    # 运行容器使用自定义网络,同时使用--link链接尚不存在的container5容器
    docker run --net=mynet -itd --name=container4 --link container5:c5 busybox
    # 创建容器container5
    docker run --net=mynet -itd --name=container5 --link container4:c4 busybox
    # 虽然是相同容器,但是在不同的网络环境连接中可以不同的alias链接
    docker network connect --link container5:foo local_alias container4
    docker network connect --link container4:bar local_alias container5

    指定容器在网络范围的别名(Network-scoped alias)

    Network-scoped alias就是指定容器在可被同一网络范围内的其他容器访问的别名。
    不同于link别名的是,link别名是由链接容器的使用者提供的,只有它自己可使用;
    而指定网络范围内别名,是由容器提供给网络中其它容器使用的。

    Network-scoped alias:同一网络中的多个容器可以指定相同的别名,在使用的当然只有第一个指定别名的容器才生效,
    只有当第一个容器关闭时,指定相同别名的第二个容器的别名才会开始生效。

    docker run --net=mynet -itd --name=container6 --net-alias app busybox
    docker network connect --alias scoped-app local_alias container6
    docker run --net=isolated_nw -itd --name=container7 --net-alias app busybox
    docker network connect --alias scoped-app local_alias container7
    # 在container4中
    docker attach container4
    ping app # 访问container6的IP
    # 从container4中以守护进程运行退出:Ctrl+P+Q
    docker stop container6
    docker attach container4
    ping app # 访问的container7的IP

    断开网络与移除网络

    # 容器从mynet网络中断开(它将无法再网络中的容器container3通讯)
    docker network disconnect mynet container2
    # 测试与容器container3失败
    docker attach container2
    ping contianer3 # 访问失败 

    在多主机的网络环境中,在将容器用已移除的容器名称连接到网络中时会出现container already connected to network的错误,
    这时需要将新容器强制移除docker rm -f,重新运行并连接到网络中。

    移除网络要求网络中所有的容器关闭或断开与此网络的连接时,才能够使用移除命令:

    # 断开最后一个连接到mynet网络的容器
    docker network disconnet mynet container3
    # 移除网络
    docker network rm mynet
  • 相关阅读:
    在django中,执行原始sql语句
    Django的select_related 和 prefetch_related 函数优化查询
    Django -- settings 详解
    Django-models的字段类型
    ORM
    django-response对象
    spark集群进入 bin 下面目录./spark-shell 出现Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    Hbase启动的时候出现:[RpcServer.handler=28,port=60000] ipc.RpcServer: RpcServer.handler=28,port=60000: exiting,master.HMasterCommandLine: Master exiting
    c++实现写一个函数,求2个整数的和,要求在函数体内不得使用+,-* /
    nutch二次开发环境搭建
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/9416422.html
Copyright © 2011-2022 走看看