docker 其他电脑访问权限_docker 指定IP地址、与主机同网段IP

本文介绍了如何配置docker容器的网络,使其与其他电脑在同一网段内可以互相访问。讲解了docker的四种网络模式:bridge、host、container和none模式,并详细说明了在none模式下使用pipework或手动配置IP的方法。通过这些方法,可以为docker容器分配特定的IP地址,实现网络互通。
摘要由CSDN通过智能技术生成

013f777a9330d4585c374dfa7af6de8a.png

首先讲一下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。

5978021b23b69bf0b12dbd6a103e85c7.png

这个方式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。

因此,若想使用pipework配置docker容器的ip地址同网段活动主机,必须应在none模式下才可以

以下是几种分配IP的方法:

一、pipework

首先讲一下docker的网络方式:

我们使用docker run创建容器时,可以使用--net选项指定容器的网络体系,docker一共有4中网络方式:

1:bridge模式,--net=bridge(默认)。

这是dokcer网络的默认修改。安装完docker,系统会手动添加一个供docker使用的网关docker0,我们建立一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接至docker0网桥,以此推动容器与宿主机的网络互通。如下:

2:host模式,--net=host。

20180325234307912915.png

这个方式下构建起来的容器同网段活动主机,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和网关。

3:container模式,--net=container:NAME_or_ID。

这个方式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等而是隔离开的。

4:none模式,--net=none。

这个方式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。

因此,若想使用pipework配置docker容器的ip地址,必须应在none模式下才可以。

pipework安装:

# 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地址。

T2s.5HXwhaXXXXXXXX_%21%2140203152.jpg

二、 docker默认使用'bridge'来设定container的网络体系(即从与docker0同网段的未使用的IP中取一个作为container的IP),我们此处使用'none'来实现自己手动配置container的网络。

首先我们以**--net='none'**的方式启动一个container

[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)

[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

因而我们必须创建一个链接

f6bee82e805838a9a0ff1a8e54502ff4.png

[yaxin@cube2x ~]$sudo ln -s /proc/23090/ns/net /var/run/netns/23090

然后构建一对端到端的网关,将veth_db84e747c3绑定到docker0网桥,并开启。将另一块网卡X放到container内部

[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的网卡

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更具体查看)

[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脚本如下:

#!/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://www.pc-fly.com/a/tongxinshuyu/article-144072-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值