配置docker静态IP地址

1.1 Docker的4种网络模式

  • Docker有以下4种网络模式:

host模式,使用–net=host指定。
container模式,使用–net=container:NAME_or_ID指定。
none模式,使用–net=none指定。
bridge模式,使用–net=bridge指定,默认就是bridge模式。
默认选择bridge的情况下,容器启动后会通过DHCP获取一个地址,这可能不是我们想要的,在centos7系统上, docker环境下可以使用pipework脚本对容器分配固定IP(这个IP可以是和物理机同网段IP)。
注: docker 默认是bridge(–net=bridge)模式,相当于VMware中NAT模式。
docker环境下可以使用pipework脚本对容器分配固定IP,相当于VMware中桥接模式。
注:Pipework有个缺陷,容器重启后IP设置会自动消失,需要重新设置

1.2 配置桥接网络

桥接本地物理网络地目的是为了局域网内用户方便访问docker实例中的服务,不需要各种端口映射即可访问服务。但是这样做,又违背了docker容器的安全隔离的原则。

  • 安装软件包
yum install bridge-utils
  • 创建桥设备br0
    把eth0绑到br0桥设备上:
[root@docker ~]# cd /etc/sysconfig/network-scripts/ 
[root@docker network-scripts]# cp ifcfg-eth0 /opt/     #备份一下eth0
[root@docker network-scripts]# vim ifcfg-eth0 #编辑配置文件为以下内容
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE="br0 #在文件最后插入这一行,表示把eth0桥接到br0上
  • 生成桥设备br0的配置文件:
[root@client network-scripts]# cat ifcfg-br0 
DEVICE="br0"
NM_CONTROLLED="yes"  
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO=none
IPADDR=192.168.31.10
NETMASK=255.255.255.0
GATEWAY=192.168.31.2
DNS1=192.168.31.2
[root@client network-scripts]# 
[root@client network-scripts]# systemctl restart network
  • 测试br0:
[root@client ~]# ip addr|grep br0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
23: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 192.168.31.10/24 brd 192.168.31.255 scope global br0
[root@client ~]# 
[root@client ~]# ping g.cn
PING g.cn (203.208.40.98) 56(84) bytes of data.
64 bytes from 203.208.40.98 (203.208.40.98): icmp_seq=1 ttl=128 time=36.5 ms
64 bytes from 203.208.40.98 (203.208.40.98): icmp_seq=2 ttl=128 time=36.1 ms
^C

1.3 使用pipework配置静态IP

直接下载pipework zip包
https://github.com/jpetazzo/pipework
把pipework-master.zip上传到Linux中

将 pipework-master.zip上传服务器上:
[root@docker ~]# unzip pipework-master.zip   # 不需要编译,因为pipework 是一个shell脚本
查看:
[root@docker ~]# more ./pipework-master/pipework
[root@docker ~]# cp /root/pipework-master/pipework   /usr/local/bin/    #方便后期使用pipework命令

到此 pipework已经安装成功

实战1: 使用静态IP启动的docker实例运行一个web服务器

[root@client ~]# docker run -itd --name www centos bash
c77ff47c7aa37329c908651de459a97bd79ef806b9d2b038a326dcf0ab365c28
[root@client ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
c77ff47c7aa3   centos    "bash"    12 seconds ago   Up 12 seconds             www
给此容器配置地址
pipework语法:pipework 网桥名  容器实例ID  分配给容器的IP/掩码@网关
[root@client ~]# pipework br0 c77ff47c7aa3 192.168.31.100/24@192.168.31.2
[root@client ~]# 
注:容器的DNS地址,会直接使用物理机的dns
[root@client ~]# ping 192.168.31.100  #可以看到docker实例的IP已经可以使用
PING 192.168.31.100 (192.168.31.100) 56(84) bytes of data.
64 bytes from 192.168.31.100: icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from 192.168.31.100: icmp_seq=2 ttl=64 time=0.087 ms

进入容器,测试网络
[root@client ~]# docker exec -it c77ff47c7aa3  /bin/bash
[root@c77ff47c7aa3 /]# yum install net-tools -y
[root@c77ff47c7aa3 /]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.31.100  netmask 255.255.255.0  broadcast 192.168.31.255
        ether 3a:1a:6f:1a:65:3f  txqueuelen 1000  (Ethernet)
        RX packets 9052  bytes 18685078 (17.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5008  bytes 275878 (269.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

到此,docker实例配置静态IP成功。

运行web服务器
[root@c77ff47c7aa3 /]# yum install httpd -y
[root@c77ff47c7aa3 /]# /usr/sbin/httpd -DFOREGROUND & 
[root@c77ff47c7aa3 /]# netstat  -lntup|grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      108/httpd           
[root@c77ff47c7aa3 /]# echo "www" >/var/www/html/index.html

浏览器访问:http://192.168.31.100
[root@c77ff47c7aa3 /]# curl http://192.168.31.100/
www
[root@c77ff47c7aa3 /]# curl http://192.168.31.100/
www
[root@c77ff47c7aa3 /]# 
文档更新时间: 2021-11-09 10:24   作者:xtyang