docker network命令详解

发布时间 - 2020-08-21 00:00:00    点击率:

我们先来看看network所有的子命令:

(推荐教程:docker教程)

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网络驱动下创建的网络可以指定不同的参数。

二、连接容器

创建三个容器,分别前两个使用默认网络启动容器,第三个使用自定义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=: 
- 配合--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


# docker  # 自定义  # 子网  # 移除  # 连接到  # 第一个  # 多个  # 第二个  # 还可以  # 是由  # 第三个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何为不同团队 ID 动态生成多个独立按钮  如何撰写建站申请书?关键要点有哪些?  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何快速上传建站程序避免常见错误?  Linux系统命令中screen命令详解  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何在IIS中新建站点并配置端口与物理路径?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  JavaScript实现Fly Bird小游戏  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Laravel如何处理CORS跨域请求?(配置示例)  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  如何在IIS中新建站点并解决端口绑定冲突?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Android自定义控件实现温度旋转按钮效果  如何在阿里云域名上完成建站全流程?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何在Windows虚拟主机上快速搭建网站?  MySQL查询结果复制到新表的方法(更新、插入)  微信小程序 五星评分(包括半颗星评分)实例代码  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  如何挑选优质建站一级代理提升网站排名?  如何在万网利用已有域名快速建站?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  JavaScript Ajax实现异步通信  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何在建站宝盒中设置产品搜索功能?  如何用5美元大硬盘VPS安全高效搭建个人网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  BootStrap整体框架之基础布局组件  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  如何在建站主机中优化服务器配置?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何安全更换建站之星模板并保留数据?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  免费视频制作网站,更新又快又好的免费电影网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel怎么为数据库表字段添加索引以优化查询