- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章docker 指定IP地址、与主机同网段IP由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
首先讲一下docker的网络模式:
我们使用docker run创建容器时,可以使用--net选项指定容器的网络模式,docker一共有4中网络模式:
1:bridge模式,--net=bridge(默认).
这是dokcer网络的默认设置。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。如下:
2:host模式,--net=host.
这个模式下创建出来的容器,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口.
3:container模式,--net=container:NAME_or_ID.
这个模式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的.
4:none模式,--net=none.
这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP.
因此,若想使用pipework配置docker容器的ip地址,必须要在none模式下才可以 。
以下是几种分配IP的方式:
1、pipework 。
首先讲一下docker的网络模式:
我们使用docker run创建容器时,可以使用--net选项指定容器的网络模式,docker一共有4中网络模式:
1:bridge模式,--net=bridge(默认).
这是dokcer网络的默认设置。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。如下:
2:host模式,--net=host.
这个模式下创建出来的容器,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口.
3:container模式,--net=container:NAME_or_ID.
这个模式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的.
4:none模式,--net=none.
这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。 因此,若想使用pipework配置docker容器的ip地址,必须要在none模式下才可以.
pipework安装:
1
2
3
4
5
6
7
8
9
10
11
12
|
# wget https://github.com/jpetazzo/pipework/archive/master.zip
# unzip pipework-master.zip
# cp pipework-master/pipework /usr/local/bin/
# chmod +x /usr/local/bin/pipework
创建none模式的容器,为其分配IP。
#ip a show docker0
#docker run -idt --name test --net=none resin
#pipework docker0 test 172.17.42.100/16@172.17.42.1
#docker attach test
|
以上操作给新建的test容器分配了一个172.17.42.100的IP地址.
2、 docker默认使用'bridge'来设置container的网络模式(即从与docker0同网段的未使用的IP中取一个作为container的IP),我们这里使用'none'来实现自己手动配置container的网络.
首先我们以**--net='none'**的方式启动一个container 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[yaxin@cube2x ~]$docker run -i -t --
rm
--net=
'none'
ubuntu
/bin/bash
root@db84e747c362:/
# ifconfig -a
lo 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:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
root@db84e747c362:/
#
|
可以看到,由于我们使用'none'模式,container中没有获取到IP,甚至连网卡都没有,下面我们开始给container配置IP 。
首先获取container的pid(我们需要通过pid获取file descriptor) 。
1
2
3
4
5
|
[yaxin@cube2x ~]$docker
ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db84e747c362 docker.cn
/docker/ubuntu
:latest
"/bin/bash"
4 minutes ago Up 4 minutes sharp_kirch
[yaxin@cube2x ~]$docker inspect -f
"{{.State.Pid}}"
sharp_kirch
23090
|
ip-netns的man page中有这样一句 。
By convention a named network namespace is an object at /var/run/netns/NAME that can be opened. The file descriptor resulting from opening/var/run/netns/NAME refers to the specified network namespace 。
因而我们需要创建一个链接 。
1
|
[yaxin@cube2x ~]$
sudo
ln
-s
/proc/23090/ns/net
/var/run/netns/23090
|
然后创建一对端到端的网卡,将veth_db84e747c3绑定到docker0网桥,并启动。将另一块网卡X放到container内部 。
1
2
3
4
|
[yaxin@cube2x ~]$
sudo
ip link add veth_db84e747c3
type
veth peer name X
[yaxin@cube2x ~]$
sudo
brctl addif docker0 veth_db84e747c3
[yaxin@cube2x ~]$
sudo
ip link
set
veth_db84e747c3 up
[yaxin@cube2x ~]$
sudo
ip link
set
X netns 23090
|
这时查看container的IP,会发现多了一个名为X的网卡 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
root@db84e747c362:/
# ifconfig -aX Link encap:Ethernet HWaddr 5a:7e:4d:ba:63:1c
BROADCAST MULTICAST MTU:1500 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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo 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:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
|
然后对container内部新添加的网卡进行配置(可以通过man ip-netns更详细查看) 。
1
2
3
4
|
[yaxin@cube2x ~]$
sudo
ip netns
exec
23090 ip link
set
dev X name eth0
[yaxin@cube2x ~]$
sudo
ip netns
exec
23090 ip link
set
eth0 up
[yaxin@cube2x ~]$
sudo
ip netns
exec
23090 ip addr add 172.17.111.10
/16
dev eth0
[yaxin@cube2x ~]$
sudo
ip netns
exec
23090 ip route add default via 172.17.42.1
|
注意: 指定给container的IP必须跟docker0在同一网段,且给container的网关应该为docker0的IP 。
最后,写成shell脚本如下
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#!/usr/bin/env bash# filename: bind_addr.sh
if
[ `
id
-u` -
ne
0 ];
then
echo
'必须使用root权限'
exitfi
if
[ $
# != 2 ]; then
echo
"使用方法: $0 容器名字 IP"
exit
1fi
container_name=$1bind_ip=$2
container_id=`docker inspect -f
'{{.Id}}'
$container_name 2>
/dev/null
`
if
[ ! $container_id ];
then
echo
"容器不存在"
exit
2fibind_ip=`
echo
$bind_ip |
egrep
'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'
`
if
[ ! $bind_ip ];
then
echo
"IP地址格式不正确"
exit
3fi
container_minid=`
echo
$container_id |
cut
-c 1-10`
container_netmask=`ip addr show docker0 |
grep
"inet\b"
|
awk
'{print $2}'
|
cut
-d / -f2`
container_gw=`ip addr show docker0 |
grep
"inet\b"
|
awk
'{print $2}'
|
cut
-d / -f1`
bridge_name=
"veth_$container_minid"
container_ip=$bind_ip/$container_netmask
pid=`docker inspect -f
'{{.State.Pid}}'
$container_name 2>
/dev/null
`
if
[ ! $pid ];
then
echo
"获取容器$container_name的id失败"
exit
4fi
if
[ ! -d
/var/run/netns
];
then
mkdir
-p
/var/run/netns
fi
ln
-sf
/proc/
$pid
/ns/net
/var/run/netns/
$pid
ip link add $bridge_name
type
veth peer name X
brctl addif docker0 $bridge_name
ip link
set
$bridge_name up
ip link
set
X netns $pid
ip netns
exec
$pid ip link
set
dev X name eth0
ip netns
exec
$pid ip link
set
eth0 up
ip netns
exec
$pid ip addr add $container_ip dev eth0
ip netns
exec
$pid ip route add default via $container_gw
运行并写入ip和容器名称
配置容器与主机IP同一网段
先配置主机br0
vi
/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=
yes
DELAY=0
STP=
yes
IPADDR=192.168.2.111
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
/etc/init
.d
/network
restart
docker run -itd --name
test
centos
/bin/bash
pipework br0
test
192.168.2.201
/24
@192.168.2.1
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/wangdaoge/article/details/52703890 。
最后此篇关于docker 指定IP地址、与主机同网段IP的文章就讲到这里了,如果你想了解更多关于docker 指定IP地址、与主机同网段IP的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在寻找的服务器是: 轻量级, 非 buggy , 支持.NET, 在客户端上运行以进行测试, 在Windows上运行 Cassinni太过马车,IIS太昂贵,Apache很难安装,XSP仅是lin
所以我有大约10个短的css文件,可以与mvc应用程序一起使用。 有像 error.css login.css 等等... 仅有一些非常短的CSS文件,这些文件使更新和编辑变得容易(至少对我而言)。我
我正在编写程序来自动化 win32 表单。我正在使用 Microsoft UI 自动化库。我不知道如何获取和调用该表单上的预定义快捷键。现在我只需获取 MenuItem 的 AutomationEle
我有一个在后台线程上运行的及时操作。运行时,我当前将光标置于等待状态: Mouse.OverrideCursor = Cursors.Wait 我刚刚实现了一项功能,允许用户在厌倦等待时单击“取消”按
如何找到所有可能直接或间接调用给定方法的单元测试?当我更改方法时,我希望知道要运行的最佳测试;必须有一个工具! 因为我们有很多接口(interface),所以我对所有调用接口(interface)方法
我想知道,一个类会被装箱吗?我一直假设每个类都有一个虚拟表,可以用来标识类,所以它需要装箱吗? 最佳答案 只有值类型(结构)被装箱。类实例不会被装箱。 关于.net - 类是盒装的吗? 。网,我们在S
所以接下来有一个按钮调用(页面)。它的 href 链接是 site/blah/#。所以我知道它真正运行的 javascript 代码。在我解析完第一页后,我想解析下一页。我如何模拟鼠标点击,以便我可以
我想知道是否有人对解决以下设计问题有好的建议/模式。我有一个命令类的层次结构。在最抽象的层面上,我有一个 ICommand 接口(interface)。执行 ICommand 的 RunCommand
我在资源(xsd 文件)中有几个文件可用于验证收到的 xml 消息。我使用的资源文件名为 AppResources.resx,它包含一个名为 clientModels.xsd 的文件。当我尝试使用这样
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
(最后的简短版本) 我目前正在开发的软件需要跟踪任意数量的 MS Office 文件,现在需要提供将所有这些文件一起打印的功能,以及一些应用程序数据(可能会发送到打印机作为 .xps、.html 或
我想在不指定命名空间或程序集的情况下按名称(字符串)实例化一个类。像这样(Unity 语法): var processor = container.Resolve("SpecialProcessor"
我有一些代码可以对 64 位整数进行大量比较,但是它必须考虑数字的长度,就好像它被格式化为字符串一样。我无法更改调用代码,只能更改函数。 最简单的方法(除了 .ToString().Length 之外
使用遗留代码,我发现我有很多这样的语句(超过 500 个) bool isAEqualsB = (a == b) ? true : false; 这样重写有意义吗? bool isAEqualsB =
我有这个: AudioPlayer player = new AudioPlayer(); player.Directory = vc.Directory; player.StartTime = vc
我已经阅读了很多关于双重检查锁定的危险的文章,我会努力远离它,但话虽如此,我认为他们的阅读非常有趣。 我正在阅读 Joe Duffy 的这篇关于使用双重检查锁定实现单例的文章: http://www.
对于可变类型,值类型和引用类型之间的行为差异很明显: // Mutable value type PointMutStruct pms1 = new PointMutStruct(1, 2); P
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this q
我有一个 Cordova pp 我在 Controller 中调用post方法 它可以在浏览器中工作,但是在构建和调试apk时出现错误 ionic.bundle.js:23826 POST http:
我们正在尝试将时间戳附加到某些 URL 以让内容缓存但在它们发生更改时更新它们。我们有代码可以归结为: DateTime ts = File.GetLastWriteTime(absPath); 其中
我是一名优秀的程序员,十分优秀!