04_docker网络配置之独立IP

网络配置

04_docker网络配置之独立IP_第1张图片

  Dokcer 通过使用Linux桥接提供容器之间的通信,docker0桥接接口的目的就是方便Docker管理。当Docker daemon启动时需要做以下操作:

  1. 如果docker0不存在则创建
  2. 搜索一个与当前路由不冲突的ip段
  3. 在确定的范围中选择 ip
  4. 绑定 ip 到 docker0

Docker四种网络模式

docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:

  1. host模式,使用 --net=host指定。
  2. container模式,使用 --net=container:NAMEorID 指定。
  3. none模式,使用 --net=none指定。
  4. bridge模式,使用 --net=bridge指定,默认设置。

host 模式
  如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。

  比如:我们在 10.10.101.105/24 的机器上用 host 模式启动一个含有 web 应用的 Docker 容器,监听 tcp 80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用 10.10.101.105:80 即可,不用任何 NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

container 模式
  这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

none模式
  这个模式和前两个不同。在这种模式下,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。

bridge模式

04_docker网络配置之独立IP_第2张图片

  bridge 模式是 Docker 默认的网络设置,此模式会为每一个容器分配 Network Namespace、设置 IP 等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。当 Docker server 启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配 IP 了,Docker 会从 RFC1918 所定义的私有 IP 网段中,选择一个和宿主机不同的IP地址和子网分配给 docker0,连接到 docker0 的容器就从这个子网中选择一个未占用的 IP 使用。如一般 Docker 会使用 172.17.0.0/16 这个网段,并将 172.17.42.1/16 分配给 docker0 网桥(在主机上使用 ifconfig 命令是可以看到 docker0 的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)

Docker独立IP及容器互联

内置bridge(nat)
  • 缺点:
  1. 需要配套服务注册/发现,否则宿主上端口分配困难,容易冲突。
  2. 由于每个容器暴露的端口都不一致,造成前端路由层nginx配置(proxy_pass)里无法使用dns的方式。端口映射要在容器启动时就指定好,后期无法变更。
  3. 测试发现nat不支持websocket。
自建桥接网络
  • 优点:
  1. 每个容器都有独立ip,对外提供服务,如nginx+php,nginx+resin,都可以使用默认的80端口
  2. 由于容器暴露端口都可以使用80端口,因此前端路由层nginx配置(proxy_pass)里可以使用dns的方式。
  3. 无需为了后期端口映射添加而烦恼
  4. 桥接支持websocket

当我们把docker镜像下载下来之后,启动一个容器,登录容器我们会发现容器的ip如下图所示:

[root@hadoop ~]# ifconfig            
docker0   Link encap:Ethernet  HWaddr 02:42:9D:92:CC:6C  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP 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:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:EC:0E:66  
          inet addr:192.168.175.210  Bcast:192.168.175.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feec:e66/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2690 errors:0 dropped:0 overruns:0 frame:0
          TX packets:321 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:174657 (170.5 KiB)  TX bytes:46139 (45.0 KiB)

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@9d8bdd656f84 /]# ip addr list
1: lo:  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
6: eth0:  mtu 1500 qdisc noqueue state UP 
    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
[root@9d8bdd656f84 /]# 

虚拟化独立外网IP

  • 停止服务
    /etc/init.d/docker stop
  • 关掉docker0
    ifconfig docker0 down
  • 删除docker
    brctl delbr docker0
  • 进入网卡配置目录
    cd /etc/sysconfig/network-scripts/
  • 安装brctl命令包
    yum install bridge-utils(如果有,可以安装)
  • 编辑eth0
    vi ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
BRIDGE=br0
  • 创建 ifcfg-br0文件并编辑
    vi ifcfg-br0
DEVICE=br0
ONBOOT=yes
NM_CONTROLLED=yes
TYPE=Bridge
IPADDR=192.168.175.210
NETMASK=255.255.255.0
GATEWAY=192.168.175.2
DNS1=192.168.175.2
  • 修改docker配置文件
    vi /etc/sysconfig/docker
[root@hadoop ~]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker
#
# Other arguments to pass to the docker daemon process
# These will be parsed by the sysv initscript and appended
# to the arguments list passed to docker -d

other_args="-b=br0 --registry-mirror=https://xxxxxx.mirror.aliyuncs.com"
DOCKER_CERT_PATH=/etc/docker

# Resolves: rhbz#1176302 (docker issue #407)
DOCKER_NOWARN_KERNEL_VERSION=1

# Location used for temporary files, such as those created by
# # docker load and build operations. Default is /var/lib/docker/tmp
# # Can be overriden by setting the following environment variable.
# # DOCKER_TMPDIR=/var/tmp

如上在other_args添加,-b=br0;

  • 启动docker服务
    /etc/init.d/docker start

  • 查看主机网卡

[root@hadoop ~]# ifconfig
br0       Link encap:Ethernet  HWaddr 00:0C:29:EC:0E:66  
          inet addr:192.168.175.210  Bcast:192.168.175.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feec:e66/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27377 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18688 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:11987900 (11.4 MiB)  TX bytes:1375658 (1.3 MiB)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:EC:0E:66  
          inet6 addr: fe80::20c:29ff:feec:e66/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25978 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16953 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:23883946 (22.7 MiB)  TX bytes:1325863 (1.2 MiB)

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)

veth8caba71 Link encap:Ethernet  HWaddr E2:08:AB:A0:B4:07  
          inet6 addr: fe80::e008:abff:fea0:b407/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6297 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10345 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:344082 (336.0 KiB)  TX bytes:12022779 (11.4 MiB)

[root@hadoop ~]# 
  • 进入docker容器
    docker attach id

    04_docker网络配置之独立IP_第3张图片
    容器的网卡

  • 在容器中ping主机


    04_docker网络配置之独立IP_第4张图片
  • 在容器中ping外网


    04_docker网络配置之独立IP_第5张图片

你可能感兴趣的:(04_docker网络配置之独立IP)