请问这款什么牌子的手机壳好的牌子

Docker如何固定IP设置的方法
作者:Johnnian
字体:[ ] 类型:转载 时间:
本篇文章主要介绍了Docker如何固定IP设置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
由于工作需要,需要给Docker设置固定IP,在网上的查找了一些资料,自己试着实践一下,留个笔记。
经常用Docker模拟项目在生产环境中的部署,往往需要同时开好几台Docker容器,而且有时安装的软件需要绑定Docker局域网中的其他容器,如 MongoDB 副本集部署的时候,就需要绑定其他容器的内网IP。
但是,Docker 每次重启后,容器的IP地址会变化,查询了资料,Docker是支持设置固定IP的。
Docker 默认网络
Docker安装后,默认会创建下面三种网络类型:
$ docker network ls
NETWORK ID
237ea3d5cfbf
启动 Docker的时候,用 --network 参数,可以指定网络类型,如:
~ docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash
bridge:桥接网络
默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了
none:无指定网络
使用 --network=none ,docker 容器就不会分配局域网的IP
host: 主机网络
使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。
例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
创建自定义网络:(设置固定IP)
启动Docker容器的时候,使用默认的网络是不支持指派固定IP的,如下:
~ docker run -itd --net bridge --ip 172.17.0.10 centos:latest /bin/bash
6eb1f228cf308d1c60dbacbfd0cb21d76cb448c678bab0f1a7c0df6
docker: Error response from daemon: User specified IP address is supported on user defined networks only.
因此,需要创建自定义网络,下面是具体的步骤:
步骤1: 创建自定义网络
创建自定义网络,并且指定网段:172.18.0.0/16
➜ ~ docker network create --subnet=172.18.0.0/16 mynetwork
➜ ~ docker network ls
NETWORK ID
4f11ae9c85de
237ea3d5cfbf
步骤2: 创建Docker容器
➜& ~ docker run -itd --name networkTest1 --net mynetwork --ip 172.18.0.2 centos:latest /bin/bash
这个时候,创建的Docker容器就会持有 172.18.0.2 这个IP.
[root@ec8e31938fe7 /]# ifconfig
Link encap:Ethernet HWaddr 02:42:AC:12:00:02
inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe12:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:88 errors:0 dropped:0 overruns:0 frame:0
TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes: KiB) TX bytes: KiB)
Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
1. Docker的4种网络模式我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:host模式,使用--net=host指定。container模式,使用--net=container:NAME_or_ID指定。none模式,使用--net=none指定。bridge模式,使用--net=bridge指定,默认设置。下面分别介绍一下Docker的各个网络模式。1.1 host模式众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。1.2 container模式在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。1.3 none模式这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。1.4 bridge模式bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。1.4.1 bridge模式的拓扑当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.101.105/24。Docker完成以上网络配置的过程大致是这样的:在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。&从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。网络拓扑介绍完后,接着介绍一下bridge模式下容器是如何通信的。1.4.2 bridge模式下容器的通信在bridge模式下,连在同一网桥上的容器可以相互通信(若出于安全考虑,也可以禁止它们之间通信,方法是在DOCKER_OPTS变量中设置--icc=false,这样只有使用--link才能使两个容器通信)。容器也可以与外部通信,我们看一下主机上的Iptable规则,可以看到这么一条-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE这条规则会将源地址为172.17.0.0/16的包(也就是从Docker容器产生的包),并且不是从docker0网卡发出的,进行源地址转换,转换成主机网卡的地址。这么说可能不太好理解,举一个例子说明一下。假设主机有一块网卡为eth0,IP地址为10.10.101.105/24,网关为10.10.101.254。从主机上一个IP为172.17.0.1/16的容器中ping百度(180.76.3.151)。IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上。然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关10.10.105.254/24。接着包会转发给eth0,并从eth0发出去(主机的ip_forward转发应该已经打开)。这时候,上面的Iptable规则就会起作用,对包做SNAT转换,将源地址换为eth0的地址。这样,在外界看来,这个包就是从10.10.101.105上发出来的,Docker容器对外是不可见的。那么,外面的机器是如何访问Docker容器的服务呢?我们首先用下面命令创建一个含有web应用的容器,将容器的80端口映射到主机的80端口。docker run -d --name web -p 80:80 fmzhen/simpleweb然后查看Iptable规则的变化,发现多了这样一条规则:-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:80此条规则就是对主机eth0收到的目的端口为80的tcp流量进行DNAT转换,将流量发往172.17.0.5:80,也就是我们上面创建的Docker容器。所以,外界只需访问10.10.101.105:80就可以访问到容器中得服务。除此之外,我们还可以自定义Docker使用的IP地址、DNS等信息,甚至使用自己定义的网桥,但是其工作方式还是一样的。
阅读(143)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Docker网络详解',
blogAbstract:'这篇文章写的很清楚,转发自:q.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}1296人阅读
PaaS(14)
云计算(17)
docker如果构建bridge网络
如果在docker daemon启动参数中指定了-b选项,那么Container默认会使用bridge方式的网络。
docker客户端运行run命令,解析命令行参数后发起post start消息给docker server,docker server启动"start" job, "start" job的具体实现在daemon/container.go的Start方法中。
在建立Container的DNS和挂在basesfs之后做了初始化网络,具体实现在container的initializeNetworking方法中。
initializeNetworking主要做了以下几部分:
1 判断Container使用的网络类型,此次分析bridge模式。
根据container.hostConfig.NetworkMode判断Container使用的网络模式。
Container使用主机网络
IsContainer Container使用其他Container的网络
DisableNetwork 仅使用loopback设备
不是以上三种中的一种,那么Container使用bridge网络
2 分配bridge模式的网络
bridge模式的实现在Container的AllocateNetwork方法中。
AllocateNetwork功能如下:
2.1 分配birdge网络接口
使用allocate_interfacejob分配Container网络接口IP、MAC信息。allocate_interface对应的方法在daemon/networkdriver/driver.go中初始化。
for name, f := range map[string]engine.Handler{
"allocate_interface": Allocate,
"release_interface":
"allocate_port":
AllocatePort,
LinkContainers,
if err := job.Eng.Register(name, f); err != nil {
return job.Error(err)
在Allocate中,获取job中的RequestedIP。如果有,使用此IP;如果没有,在bridge的网络地址划分中选取新的IP地址,最后检查IP是否合法。Container使用的bridge网络记录在bridgeIPv4Network中。同样也是在InitDriver中初始化。docker使用的bridge网络如下:
addrs = []string{
"172.17.42.1/16",
"10.0.42.1/16",
"10.1.42.1/16",
"10.42.42.1/16",
"172.16.42.1/24",
"172.16.43.1/24",
"172.16.44.1/24",
"10.0.42.1/24",
"10.0.43.1/24",
"192.168.42.1/24",
"192.168.43.1/24",
"192.168.44.1/24",
接下来分配接口的MAC地址。此MAC地址是有分配的IP地址产生的。使用generateMac生成。
IPv6不做分析重点,但和IPv4的很相似。
2.2 端口处理
主要处理Container和host之间的端口分配和绑定。不做重点。
2.3 将2.1、2.2获得的接口和端口信息赋给NetworkSettings
在2.1和2.2中获得的网络接口信息和Container端口赋给Container配置的NetworkSettings结构体,在后面创建libcontianer容器实例时会用此结构体中的信息创建网络。
3 构建Container的hostname和hosts文件
此部分已在中描述过。
4 libcontianer创建网络
在初始化Container的bridge接口后,此Container的所有网卡信息保存在Container配置的NetworkSettings中。
这些信息将在构建libcontainer容器实例用到。在daemon/container.go的Start方法中,最后执行Container的waitForStart方法,此方法新建一个Container的monitor,然后陷入libcontainer,建立libcontainer层面的容器。
在陷入libcontianer之前,docker还会有一次关于网络的操作,就是在/daemon/container.go中的populateCommand构建一个能够使用execdriver执行的命令。
命令结构体如下:
type Command struct {
`json:"id"`
`json:"rootfs"` // root fs of the container
ReadonlyRootfs
`json:"readonly_rootfs"`
`json:"initpath"` // dockerinit
WorkingDir
`json:"working_dir"`
ConfigPath
`json:"config_path"` // this should be able to be removed when the lxc template is moved into the driver
`json:"network"`
`json:"ipc"`
`json:"pid"`
*Resources
`json:"resources"`
`json:"mounts"`
AllowedDevices
[]*devices.Device `json:"allowed_devices"`
AutoCreatedDevices []*devices.Device `json:"autocreated_devices"`
`json:"cap_add"`
`json:"cap_drop"`
ContainerPid
`json:"container_pid"`
// the pid for the process inside a container
ProcessConfig
ProcessConfig
`json:"process_config"` // Describes the init process of the container.
ProcessLabel
`json:"process_label"`
MountLabel
`json:"mount_label"`
`json:"lxc_config"`
AppArmorProfile
`json:"apparmor_profile"`
其中Network结构体如下:
// Network settings of the container
type Network struct {
*NetworkInterface `json:"interface"` // if interface is nil then networking is disabled
`json:"mtu"`
ContainerID
`json:"container_id"` // id of the container to join network.
HostNetworking bool
`json:"host_networking"`
具体的网络接口信息放在NetworkInterface,结构体如下:
type NetworkInterface struct {
string `json:"gateway"`
string `json:"ip"`
IPPrefixLen
`json:"ip_prefix_len"`
MacAddress
string `json:"mac"`
string `json:"bridge"`
GlobalIPv6Address
string `json:"global_ipv6"`
LinkLocalIPv6Address string `json:"link_local_ipv6"`
GlobalIPv6PrefixLen
`json:"global_ipv6_prefix_len"`
IPv6Gateway
string `json:"ipv6_gateway"`
可以说populateCommand是在为libcontianer构建容器做准备,Command结构体包含了构建libcontianer容器所有的信息。从源代码开看,确实也是这样。
在populateCommand中通过分析Container的hostConfig中NetworkMode配置,会得知Container使用的网络类型,如下:
parts := strings.SplitN(string(c.hostConfig.NetworkMode), ":", 2)
switch parts[0] {
case "none":
case "host":
en.HostNetworking = true
case "bridge", "": // empty string to support existing containers
if !c.Config.NetworkDisabled {
network := c.NetworkSettings
log.Debugf("populateCommand --
network:%s", network)
en.Interface = &execdriver.NetworkInterface{
network.Gateway,
network.Bridge,
IPAddress:
network.IPAddress,
IPPrefixLen:
network.IPPrefixLen,
MacAddress:
network.MacAddress,
LinkLocalIPv6Address: network.LinkLocalIPv6Address,
GlobalIPv6Address:
network.GlobalIPv6Address,
GlobalIPv6PrefixLen:
network.GlobalIPv6PrefixLen,
IPv6Gateway:
network.IPv6Gateway,
case "container":
nc, err := c.getNetworkedContainer()
if err != nil {
return err
en.ContainerID = nc.ID
return fmt.Errorf("invalid network mode: %s", c.hostConfig.NetworkMode)
此处使用前面申请的网络接口信息填充了bridge模式下的网络接口。
5 libcontianer构建容器网络
在陷入libcontianer后,执行populateCommand命令
关于网络部分首先根据Container网络类型创建响应类型的网络端口
</docker/libcontainer/namespaces/exec.go中的InitialzeNetworking功能包括两部分。
一部分是获取Container的网络策略,另一部分是创建Container网络接口
</docker/libcontainer/namespaces/exec.go/InitialzeNetworking
5.1 网络策略
–& network.GetStrategy
在</docker/libcontainer/network/strategy.go中指定了两种network strategy
var strategies = map[string]NetworkStrategy{
"loopback": &Loopback{},
loopback是Container none、bridge、otherContainer、host网络种类共有的策略。
veth是bridge网络种类特有的策略。
每种策略都会有两种两种方法
type NetworkStrategy interface {
Create(*Network, int, *NetworkState) error
Initialize(*Network, *NetworkState) error
以bridge的veth为例
Create:用于创建bridge的端口对并设置bridge侧的端口网络参数。这两个端口一端在bridge侧作为桥上的一个端口,另一端在Container内部作为虚拟网卡。
Initialize:配置Container内的虚拟网卡网络参数。
两个接口位于//docker/libcontianer/network/veth.go中。
5.2 创建bridge模式网络
–& strategy.Create
strategy.Create位于</docker/libcontainer/network/veth.go中。用于创建bridge模式的两个端口对并设置bridge侧的端口网络参数,将Container侧的端口加入到Container的namespace空间中。这两个端口一端在bridge侧作为桥上的一个端口,另一端在Container内部作为虚拟网卡。
5.2.1 创建端口对
使用creaeVethPair创建端对。对应代码块为:
name1, name2, err := createVethPair(prefix,
txQueueLen)
if err != nil {
return err
其中name1为加入到桥中
if err := SetInterfaceMaster(name1, bridge); err != nill {
return err
5.2.2 设置桥侧端口网络参数
设置桥侧端口mtu
if err := SetMtu(name1, n.Mtu); err != nil {
启动桥侧端口
if err := InterfaceUp(name1); err != nil {
return err
5.2.3 Container侧端口加入namespace空间
通过createVethPair创建的端口都是在Container namespace空间之外的,一端加入的桥内,一端需要加入到Container内。
if err := SetInterfaceInNamespacePid(name2, nspid); err != nil {
return err
6 初始化Container侧网络端口
docker fork出的子进程中使用dockerinit在container内部做初始化操作,其中就包括对网络的初始化。
注册需要在container内部初始化的组件。
dockerinit.go
func main() {
// Running in init mode
reexec.Init()
在pkg/reexec.go执行初始化操作。
func Init() bool {
initializer, exists := registeredInitializers[os.Args[0]]
if exists {
initializer()
return true
return false
注册需要初始化的组件
func Register(name string, initializer func()) {
if _, exists := registeredInitializers[name]; exists {
panic(fmt.Sprintf("reexec func already registred under name %q", name))
registeredInitializers[name] = initializer
网络组件的初始化函数
</docker/libcontainer/namespaces/init.go中的Init –& setupNetwork
–& network.GetStrategy
–& strategy.Initialize –& </docker/libcontainer/network/veth.go的Initialize –&
–& 检查bridge模式的Container侧的端口是否存在networkState.VethChild
–& 置Container侧的网络端口为down状态 InterfaceDown
–& 修改Container侧的网络端口名为eth0 ChangeInterfaceName
–& 如果Container侧的网络端口有物理地址,设置它的MAC地址 SetInterfaceMac
–& 设置Container侧的网络端口IP地址 SetInterfaceIp
–& 如果Container侧的网络端口有IPv6地址,设置它 SetInterfaceIp
–& 设置Container侧网络端口的mtu值 SetMtu
–& 置Container侧的网络端口为up状态 InterfaceUp
–& 如果有IPv4或IPv6网关,设置它 SetDefaultGateway
docker version:1.4.1-dev
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29851次
排名:千里之外
原创:17篇
转载:10篇
(1)(1)(1)(9)(5)(7)(1)(2)[docker]docker的四种网络方式 - 博客频道 - CSDN.NET
分类:云计算
声明:本博客欢迎转发,但请保留原作者信息!博客地址:内容系本人学习、研究和总结,如有雷同,实属荣幸!bridge方式(默认)Host IP为186.100.8.117, 容器网络为172.17.0.0/16下边我们看下docker所提供的四种网络:创建容器:(由于是默认设置,这里没指定网络--net=&bridge&。另外可以看到容器内创建了eth0)
[root@localhost ~]# docker run -i -t mysql:latest /bin/bash
root@e:/usr/local/mysql# ip addr
mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
容器与Host网络是连通的:
root@e:/usr/local/mysql# ping 186.100.8.117
PING 186.100.8.117 (186.100.8.117): 48 data bytes
56 bytes from 186.100.8.117: icmp_seq=0 ttl=64 time=0.124 ms
eth0实际上是veth pair的一端,另一端(vethb689485)连在docker0网桥上:
[root@localhost ~]# ethtool -S vethb689485
NIC statistics:
peer_ifindex: 75
[root@localhost ~]# brctl show
bridge name
STP enabled
interfaces
vethb689485
通过Iptables实现容器内访问外部网络:
[root@localhost ~]# iptables-save |grep 172.17.0.*
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A FORWARD -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5000 -j ACCEPT
none方式指定方法: --net=&none&可以看到,这样创建出来的容器完全没有网络:
[root@localhost ~]# docker run -i -t --net=&none&
mysql:latest /bin/bash
root@:/usr/local/mysql# ip addr
mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
root@:/usr/local/mysql# ping 186.100.8.117
PING 186.100.8.117 (186.100.8.117): 48 data bytes
ping: sending packet: Network is unreachable
那这种方式,有什么用途呢?实际上nova-docker用的就是这种方式,这种方式将网络创建的责任完全交给用户。可以实现更加灵活复杂的网络。另外这种容器可以可以通过link容器实现通信。(后边详细说)
host方式指定方法:--net=&host&这种创建出来的容器,可以看到host上所有的网络设备。容器中,对这些设备(比如DUBS)有全部的访问权限。因此docker提示我们,这种方式是不安全的。如果在隔离良好的环境中(比如租户的虚拟机中)使用这种方式,问题不大。
container复用方式指定方法: --net=&container:name or id&如下例子可以看出来,两者的网络完全相同。
[root@localhost ~]# docker run -i -t
mysql:latest /bin/bash
root@02aac28b9234:/usr/local/mysql# ip addr
mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]# docker run -i -t --net=&container:02aac28b9234&
mysql:latest /bin/bash
root@02aac28b9234:/usr/local/mysql# ip addr
mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
举例(openstack nova-docker中的网络实现方式)openstack的nova-docker插件可以向管理虚拟机一样管理容器。容器网络的创建方式:首先创建--net=&none&的容器,然后使用如下过程配置容器网络。(以OVS为例,也可以使用linux bridge)
#创建veth设备
ip link add name veth00 type veth peer name veth01
#将veth设备一端接入ovs网桥br-int中
ovs-vsctl -- --if-exists del-port veth00 -- add-port br-int veth00 -- set Interface veth00 external-ids:iface-id=iface_id external-ids:iface-status=active external-ids:attached-mac=00:ff:00:aa:bb:cc external-ids:vm-uuid=instance_id
#启动ovs的新加端口
ip link set veth00 up
#配置容器的网络namespace
mkdir -p /var/run/netns
ln -sf /proc/container_pid/ns/net /var/run/netns/container_id
#将veth另一端加入容器namespace
ip link set veth01 netns container_id
#配置容器上该网络设备的mac,ip,gateway
ip netns exec container_id ip link set veth01 address mac_address
ip netns exec container_id ifconfig veth01 ip
ip netns exec container_id ip route replace default via gateway dev veth01
至此,容器与host上的虚拟网络连通。之后br-int与br-ex/br-tun连通,最终实现与业务网络的连通。参考:
halcyonbaby
排名:第2916名
(119)(76)(5)(1)(12)(6)}

我要回帖

更多关于 苹果手机壳哪个牌子好 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信