配置docker静态IP地址
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设置会自动消失,需要重新设置。
配置桥接网络:
桥接本地物理网络的目的,是为了局域网内用户方便访问docker实例中服务,不要需要各种端口映射即可访问服务。 但是这样做,又违背了docker容器的安全隔离的原则,工作中辩证的选择.
创建桥设备br0:
安装包:
# rpm -ivh /mnt/Packages/bridge-utils-1.5-9.el7.x86_64.rpm
把ens33绑到br0桥设备上:
[root@xuegod63 ~]# cd /etc/sysconfig/network-scripts/
[root@xuegod63 network-scripts]# cp ifcfg-ens33 /opt/ #备份一下eth0
[root@xuegod63 network-scripts]# vim ifcfg-ens33#编辑配置文件为以下内容
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
NAME="ens33"
UUID="7a556ff6-f865-4549-b08f-9e526c9bb638"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.1.63" #删除IP地址相关内容,删除下面4行
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_PRIVACY="no"
BRIDGE="br0" #在文件最后插入这一行,表示把ens33桥接到br0上
生成桥设备br0的配置文件:
[root@xuegod63 network-scripts]# vim ifcfg-br0 #创建ifcfg-br0 文件,并写入以下内容
DEVICE="br0"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO=none
IPADDR=192.168.1.63
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=114.114.114.114
注:TYPE="Bridge"
[root@xuegod63 network-scripts]# service network restart
Restarting network (via systemctl): [ 确定 ]
测试br0:
root@xuegod63 network-scripts]# ifconfig
[root@xuegod63 network-scripts]# ping g.cn
PING g.cn (203.208.37.20) 56(84) bytes of data.
64 bytes from 203.208.37.20: icmp_seq=1 ttl=57 time=12.3 ms
使用pipework配置静态IP
方法1:直接下载pipework zip包
https://github.com/jpetazzo/pipework
把pipework-master.zip上传到Linux中
方法2:使用git获得:
git下载链接:https://github.com/jpetazzo/pipework.git
# git clone https://github.com/jpetazzo/pipework.git
将 pipework-master.zip上传服务器上:
# unzip pipework-master.zip # 解压
#不需要编译,因为pipework 是一个shell脚本
# cp /root/pipework-master/pipework /usr/local/bin/ #方便后期使用pipework命令
# which pipework #查看命令可用
到此 pipework已经安装成功。
使用静态IP启动一个docker实例
例:以none模式,使用--net=none 启动一个容器,并且开启docker特权模式。
[root@xuegod63 ~]# docker run -itd --net=none --privileged=true centos bash
扩展:
--privileged=true #允许开启特权功能
使用privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。不启用privileged,容器中root用户不能执行mount。
启动并查看容器ID:
# docker run -itd --net=none --privileged=true centos:latest bash
759828e9e369be61be5f615c6288348989b245189ef094537b769945b95d025b
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
759828e9e369 centos:latest "bash" 7 minutes ago Up 7 minutes distracted_gauss
给此容器配置地址:
pipework语法:pipework 网桥名 容器实例ID 分配给容器的IP/掩码@网关
# pipework br0 759828e9e369 192.168.3.79/[email protected]
# ping 192.168.3.79
PING 192.168.3.79 (192.168.3.79) 56(84) bytes of data.
64 bytes from 192.168.3.79: icmp_seq=1 ttl=64 time=0.112 ms
64 bytes from 192.168.3.79: icmp_seq=2 ttl=64 time=0.104 ms
# docker inspect 容器实例ID #查看容器的详细情况
进入容器,测试网络:
[root@xuegod63 ~]# docker exec -it e4698f625a56 /bin/bash #进入容器
注:容器的DNS地址,会直接使用物理机的dns
# docker exec -it 759828e9e369 /bin/bash
# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 114.114.114.114
nameserver 223.5.5.5
# yum install -y net-tools #安装ifconfig命令
查看路由:# route -n
实战1: 使用静态IP启动的docker实例运行,一个web服务器
[root@759828e9e369 /]# yum install httpd -y
[root@759828e9e369 /]# systemctl start httpd #这个方式,无法启动
Failed to get D-Bus connection: Operation not permitted
[root@759828e9e369 /]# /usr/sbin/httpd -DFOREGROUND &
[root@759828e9e369 /]# netstat -antup | grep 80 #查看服务监听端口是否启动
[root@759828e9e369 /]# echo 192.168.3.79 > /var/www/html/index.html #生成默认首页内容
扩展:非正常方法关闭docker 实例
[root@CentOS7 pipework-master]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 759828e9e369 centos:latest "bash" 49 minutes ago Up 49 minutes distracted_gauss [root@CentOS7 pipework-master]# docker inspect 759828e9e369 | grep Pid #查看docker的pid "Pid": 22710, "PidMode": "", "PidsLimit": null, [root@CentOS7 pipework-master]# kill -9 22710 #找到docker的pid,直接kill掉,也可以关闭docker。注:从而大家可以看出docker的实例就是一个进程。所以运行docker实例时,就像运行本地的一个程序,所以docker效率高。 [root@CentOS7 pipework-master]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@CentOS7 pipework-master]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 759828e9e369 centos:latest "bash" 50 minutes ago Exited (137) 17 seconds ago distracted_gauss c37488d568fb centos:httpd-v2 "/bin/sh -c /usr/loc…" 2 hours ago Exited (137) 54 minutes ago musing_engelbart c40163b59e62 centos:latest "/bin/sh -c 'while t…" 2 hours ago Exited (137) 54 minutes ago nervous_hypatia [root@CentOS7 pipework-master]#
步骤总结:
1、创建一个br0桥接设备
2、下载pipework 包并安装
3、安装并运行docker
4、导入centos docker 镜像
5、启动一个docker实例 注意加参数: --net=none --privileged=true
6、使用pipework 给docker实例配置IP