docker的网络(基础)
Docker的网络子系统是可插拔的,使用驱动程序。默认情况下存在多个驱动程序,并提供核心网络功能:
- bridge:docker默认的网络驱动。如果未指定驱动程序,则这是需要创建的网络类型。当应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。
- host:对于独立的容器,删除容器和Docker主机之间的网络隔离,并直接使用主机的网络(若启用特权容器,将可以直接修改宿主机网络设置)。host仅适用于Docker 17.06及更高版本上的swarm群集服务。
- overlay:Overlay networks将多个Docker守护程序连接在一起,并使swarm群集服务能够相互通信。还可以使用Overlay networks来促进swarm群集服务和独立容器之间的通信,或者在不同Docker守护程序上的两个独立容器之间进行通信。此策略无需在这些容器之间执行OS级别的路由。
- macvlan:Macvlan网络允许为容器分配MAC地址,使其显示为网络上的物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan在处理期望直接连接到物理网络的传统应用程序时,使用该驱动程序有时是最佳选择,而不是通过Docker主机的网络堆栈进行路由。
- none:对于此容器,禁用所有网络。通常与自定义网络驱动程序一起使用,none不适用于swarm集群服务。
选择不同的场景:
- 当多个容器在同一个Docker主机上进行通信时,用户定义的桥接网络是最佳选择。
- 当网络堆栈不应与Docker主机隔离时,主机网络最佳,但您希望隔离容器的其他方面。
- 不同Docker主机上运行的容器进行通信时,或当多个应用程序使用swarm服务协同工作时,覆盖网络overlay是最佳选择。
- 当您从VM设置迁移或需要您的容器看起来像网络上的物理主机(每个都具有唯一的MAC地址)时,Macvlan网络是最佳的。
- 第三方网络插件允许您将Docker与专用网络堆栈集成
bridge网络
桥接网络适用于在同一个Docker守护程序宿主机上运行的容器之间通信。
对于在不同Docker守护程序宿主机上运行的容器之间的通信,可以在操作系统级别管理路由,也可以使用overlay网络
启动Docker时,会自动创建默认桥接网络(也称为bridge),并且除非另行指定,否则新启动的容器将连接到该桥接网络。还可以创建用户自定义网桥,用户定义的网桥优于默认bridge网桥
用户定义的网桥与默认网桥之间的差异:
- 用户定义的桥接网络可在容器化应用程序之间提供更好的隔离和互操作性。
连接到同一个用户自定义的网桥的容器会自动将所有端口相互暴露(互操作性),而不会向外界显示任何端口
- 用户定义的桥接器在容器之间提供自动DNS解析
默认网桥上的容器只能通过IP地址相互访问(或启动容器时使用--link选项连接到另一个容器,这样两个容器也可相互通信,不推荐再使用)。在用户定义的桥接网络上,容器可以通过主机名相互解析
- 容器可以在运行中随时与用户自定义的bridge网络连接和分离
在容器的生命周期中,可以动态地将其与用户自定义的网络连接或断开。而从默认桥接网络中删除容器,则需要停止容器并使用不同的网络选项重新创建容器
- 每个用户定义的网络都会创建一个可配置的网桥
如果容器使用默认桥接网络,则可以对其进行配置,但所有容器都使用相同的设置,如MTU和iptables规则。此外,配置默认桥接网络发生在Docker服务之外,并且需要重新启动Docker。
- 默认桥接网络上的相互链接容器(使用--link选项互联)共享环境变量。
最初,在两个容器之间共享环境变量的唯一方法是使用--link选项链接,用户定义的网络无法实现这种类型的变量共享,但有更好的方法来共享环境变量:
使用docker network create创建和配置用户定义的网桥。如果不同的应用程序组具有不同的网络要求,则可以在创建时单独配置每个用户定义的网桥。
1、管理用户自定义网络
docker network create \
--subnet 172.20.0.1/16 \
--ip-range 172.20.0.1/24 \
--gateway 172.20.0.1 \
my-net
可以指定子网,IP地址范围,网关和其他选项
docker network rm my-net #删除用户定义的桥接网络
当创建或删除用户定义的网桥或从用户定义的网桥连接或断开容器时,Docker使用特定于操作系统的工具来管理底层网络基础结构(例如iptables在Linux上添加或删除网桥设备或配置规则)
2、将容器连接到用户定义的桥
创建新容器时,可以指定一个或多个--network标志
此示例将Nginx容器连接到my-net网络。它还将容器中的端口80发布到Docker宿主机上的端口8080,因此外部客户端可以访问该端口8080。连接到my-net网络的任何其他容器都可以访问my-nginx容器上的所有端口,反之亦然。
$ docker create --name my-nginx \
--network my-net \
--publish 8080:80 \
nginx:latest
docker run
若要将正在运行的容器连接到现有的用户定义的桥,使用docker network connect命令(被连接的自定义bridge网络在创建时必须有--attachable选项,而默认的bridge网络默认可以被其他容器连接)
以下命令将已在运行的my-nginx容器连接到已存在的my-net网络:
$ docker network connect my-net my-nginx
要断开正在运行的容器与用户定义的桥接器的连接,使用docker network disconnect命令。
以下命令将my-nginx容器与my-net网络断开连接。
$ docker network disconnect my-net my-nginx
示例:
docker network inspect bridge
docker run -itd --name alpine1 alpine
docker run -itd --name alpine2 alpine
docker network inspect bridge

进入两个容器中分别使用ip地址(通)、容器名(不通)、主机名(自己通,其他不通)互ping
docker container stop alpine1 alpine2
docker container rm alpine1 alpine2
快捷键:Ctrl+P+Q(在使用docker attach进入容器后退出容器,不不关闭容器,容器将继续运行)
docker run -dit --name alpine1 --network my-net alpine
docker run -dit --name alpine2 --network my-net alpine
docker run -dit --name alpine3 alpine
docker run -dit --name alpine4 --network my-net alpine
此时进入alpine4中ping 各个容器的IP、主机名、容器名:
alpine4和alpine1及alpine2之间均是通的
alpine4和alpine3均不通
docker network connect bridge alpine4 #让alpine4连接到bridge网络上
此时进入alpine4 ping各个容器的IP、主机名、容器名:
alpine4和alpine1及alpine2之间均是通的
alpine4可ping通alpine3的IP,ping不通alpine3容器的容器名和主机名
由以上说明:
使用默认的bridge各个容器只能使用IP互通
使用自定义的bridge各个容器的IP、主机名、容器名均可互通
docker network disconnect my-net alpine4
docker container stop alpine1 alpine2 alpine3 alpine4
docker container rm alpine1 alpine2 alpine3 alpine4
docker network rm my-net
启用从Docker容器转发到外部网络
默认情况下,来自连接到默认网桥的容器的流量不会转发到外部(即容器的流量不能到达外网)。宿主机启用转发,需要更改两个设置。这些不是Docker命令,它们会影响Docker主机的内核。
- 配置Linux内核以允许IP转发。
$ sysctl net.ipv4.conf.all.forwarding=1
- 将策略的iptables FORWARD策略更改DROP为ACCEPT。
$ sudo iptables -P FORWARD ACCEPT
默认bridge网络不建议用于生产用途
配置dockerd的默认网桥
要配置默认bridge网络,请在daemon.json中指定选项。这是一个daemon.json指定了几个选项的示例。仅指定需要自定义的设置。
{
"bip": "192.168.1.5/24", #默认docker0网桥被设置成该地址()
"fixed-cidr": "192.168.1.5/25", #为容器分配的地址限制在这个小子网内
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
重新启动Docker以使更改生效
docker的网络(基础)的更多相关文章
- Docker容器网络-基础篇
开源Linux 一个执着于技术的公众号 Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/N ...
- docker 容器网络基础
======================== docker缺省自带的网络 ======================== host 网络, This enables a container to ...
- docker的网络基础配置
一.端口映射实现访问容器 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射.当使用-P标记时,Docker会随机映射一个49000~49900的端口至容器内部开放 ...
- 七、【Docker笔记】Docker中网络基础配置
一个系统一般都包含多个服务组件,这些大量的服务组件不可能放在同一个容器中,这就需要多个容器之间可以互相通信.Docker提供了两种方式来实现网络服务:映射容器端口到宿主主机.容器互联机制. 一.端口映 ...
- docker的网络基础
docker使用的与Linux网络有关的主要技术: Network Namespace Veth 设备对 Iptables/Netfilter 网桥 路由 <1> 网络命令空间 names ...
- Docker容器网络基础总结
ifconfig 之 docker0 基于Linux的虚拟网桥(通用网络设备的抽象) 虚拟网桥特点: 1. 可以设置IP地址 2.相当于拥有一个隐藏的虚拟网卡 docker0 的地址划分 IP: 17 ...
- Docker网络基础:快速指南
Docker网络基础:快速指南 原文连接:http://blogxinxiucan.sh1.newtouch.com/2017/07/30/Docker网络基础:快速指南/ 了解有关扩展网络功能的默认 ...
- docker容器网络bridge
我们知道docker利用linux内核特性namespace实现了网络的隔离,让每个容器都处于自己的小世界里面,当这个小世界需要与外界(宿主机或其他容器)通信的时候docker的网络就发挥作用了,这篇 ...
- Docker基础内容之网络基础
网络命名空间基本原理 单机版多容器实例网络交互原理 在宿主机上面打开两张网卡eth0与eth1,打通两张网卡的链路 在test1上面启动一个veth网卡,创建一个namespace:并桥接到eth0上 ...
随机推荐
- hdoj1176【DP】
DP基础吧.A掉还是挺爽的.就是考虑在两端只能是从前一秒的内部一米或原来的点来进行,但是在5秒以内可到达点是逐渐外扩的,并不是[0,10],所以就特殊考虑了一下.后面两端是0和10,中间的点可以从上一 ...
- PJzhang:Lucifer1993的struts-scan漏洞全量检测工具
猫宁!!! 参考链接: https://www.freebuf.com/sectool/149815.html 有关struts 2的漏洞测试工具,很多,不过有的已经很久没更新了,有的只是针对某一个s ...
- 使用Appache部署WEB服务器
Apache的起源(这个就不说了,百度下就都有了) 简介:Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行, ...
- 05.NopCommerce给Topic表添加排序及类别字段
在用到Nopcommerce中静态页面表时,发现Topic表没有排序字段和类别字段,导致如果Page文件很多的话,无法区分是哪个类别,为此我稍微扩展了一下字段,在此记录一下操作流程,方便以后自己查看, ...
- 如何轻松实现MySQL数据库的读写分离和负载均衡?
配置好了 Mysql 的主从复制结构后,我们希望实现读写分离,把读操作分散到从服务器中,并且对多个从服务器能实现负载均衡.读写分离和负载均衡是 Mysql 集群的基础需求,MaxScale 就可以帮着 ...
- 【js数据结构】图的深度优先搜索与广度优先搜索
图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this ...
- windows.old文件删除
在安装完新系统后,会发现C盘下有个windows.old文件夹,大约有个10多G,里面都是对之前系统的一些备份,用于对之前系统恢复时使用,一般一个月后会自动清理,若觉得不会再对系统进行老版本恢复时,又 ...
- 【持续更新】把.net代码转换为java代码的注意事项
国内大多数大学的软件相关专业大多强制学生学习c和Java,但.net 的几个语言可以说是选学的. 由于visual studio在windows平台上使用相对方便,一些同学会在上大学的Java课之前自 ...
- 基于SAE的Python+Django部署
本文主要参考:http://www.cnblogs.com/qtsharp/archive/2012/01/12/2320774.html,另外包括自己的实际操作. 一.申请SAE帐号以及创建应用ya ...
- Unity Shader-热空气扭曲效果
GrabPass GrabPass是Unity为我们提供的一个很方便的功能,可以直接将当前屏幕内容渲染到一张贴图上,我们可以直接在shader中使用这张贴图而不用自己去实现渲染到贴图这样的一个过程,大 ...