找干货、答疑就来公众号:学神IT教育(XueGod-IT)
本节所讲内容:
实验环境: 一个还原到之前安装了docker的虚拟机快照:
Docker的4种网络模式 1、Docker有以下4种网络模式: host模式,使用--net=host指定。 container模式,使用--net=container:NAME_or_ID指定。 none模式,使用--net=none指定。 bridge模式,使用--net=bridge指定,默认设置。 默认选择bridge的情况下,容器启动后会通过DHCP获取一个地址,这可能不是我们想要的,在centos7系统上, docker环境下可以使用pipework脚本对容器分配固定IP(这个IP可以是和物理机同网段IP)。 注: docker 默认是bridge(--net=bridge)模式,相当于VMware中NAT模式。 docker环境下可以使用pipework脚本对容器分配固定IP,相当于VMware中桥接模式。 注:Pipework有个缺陷,容器重启后IP设置会自动消失,需要重新设置。
配置桥接网络: 桥接本地物理网络的目的,是为了局域网内用户方便访问docker实例中服务,不要需要各种端口映射即可访问服务。 但是这样做,又违背了docker容器的安全隔离的原则,工作中辩证的选择.
创建桥设备: 安装包: [root@xuegod63 ~]# 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#编辑配置文件为以下内容 [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地址相关内容 PREFIX="24" GATEWAY="192.168.1.1" DNS1="8.8.8.8" IPV6_PEERDNS="yes" IPV6_PEERROUTES="yes" IPV6_PRIVACY="no" BRIDGE="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" B要大写。 不大写也可以。
[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 包 方法1:直接下载pipework zip包 https://github.com/jpetazzo/pipework
把pipework-master.zip上传到Linux中
扩展: 方法2:使用git获得:
[root@xuegod63 ~]# rpm -qf `which git` git-1.8.3.1-5.el7.x86_64 [root@xuegod63 ~]# cd /opt/
咱们使用方法1: 将 pipework-master.zip上传xuegod63上: [root@xuegod63 ~]# unzip pipework-master.zip # 不需要编译,因为pipework 是一个shell脚本 查看: [root@xuegod63 ~]# vim ./pipework-master/pipework [root@xuegod63 ~]# cp /root/pipework-master/pipework /usr/local/bin/ #方便后期使用pipework命令
到此 pipework已经安装成功。
启动docker: [root@xuegod63 ~]# systemctl start docker 把centos-lastest-docker-image.tar 镜像上传Linux上,并导入docker平台 [root@xuegod63 ~]# docker load -i centos-lastest-docker-image.tar
使用静态IP启动一个docker实例 例:以none模式,使用--net=none 启动一个容器,并且开启docker特权模式。 [root@xuegod63 ~]# docker run -itd --net=none --privileged=true centos bash e4698f625a56661edd2678269215ba42d4fa41c2da881768a741a72b4a3d0c60 扩展: --privileged=true #允许开启特权功能 privileged [ˈprɪvəlɪdʒd] 在docker 0.6版以后,privileged被引入docker。使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部物理机的一个普通用户权限。
使用privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。不启用privileged,容器中root用户不能执行mount。
扩展: 测试privileged 特权功能 可以:1 1、未设置privileged启动的容器: [root@localhost ~]# docker run -it centos:latest bash [root@65acccbba42f /]# ls /dev #可以看到的设备文件比较少 console fd full fuse kcore null ptmx pts random shm stderr stdin stdout tty urandom zero [root@00931099722f /]# mount -o bind /etc /opt/ mount: permission denied 而在物理机是可以挂载成功的: [root@xuegod63 ~]# mount -o bind /etc /opt/ [root@00931099722f /]# exit
2、使用privileged启动的容器 [root@xuegod63 ~]# docker run -it --privileged centos:latest bash [root@4a51d0fde3ce /]# ls /dev/ #可以看到很多设备文件 [root@4a51d0fde3ce /]# mount -o bind /etc /opt/ #可以挂载成功 [root@4a51d0fde3ce /]# mount /dev/sda1 /opt/ #可以挂载物理机上的sda1分区 [root@4a51d0fde3ce /]# ls /opt/ [root@4a51d0fde3ce /]# init 0 #不行,还是使用exit退出docker Couldn't find an alternative telinit implementation to spawn. [root@4a51d0fde3ce /]# exit 对开特权模式的docker实例有了解:1 没有:2 直接吸收:80%的技术! 拿个本纸
扩展结束,接着给容器配置地址 [root@xuegod63 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4698f625a56 centos "bash" 30 seconds ago Up 27 seconds suspicious_colden 可以看到容器启动的ID ,比如是e4698f625a56 给此容器配置地址 pipework语法:pipework 网桥名 容器实例ID 分配给容器的IP/掩码@网关 [root@xuegod63 ~]# pipework br0 c88c4c7f01f9 192.168.1.71/24@192.168.1.1
测试IP: [root@xuegod63 ~]# ping 192.168.1.71 #可以看到docker实例的IP已经可以使用 PING 192.168.1.71 (192.168.1.71) 56(84) bytes of data. 64 bytes from 192.168.1.71: icmp_seq=1 ttl=64 time=0.639 ms
[root@xuegod63 ~]# docker inspect 容器实例ID #查看容器的详细情况
进入容器,测试网络: [root@xuegod63 ~]# docker exec -it 87fadc0249a9 /bin/bash #进入容器 [root@6e38ee3f9672 /]# cat /etc/resolv.conf # Generated by NetworkManager search xuegod63.cn nameserver 114.114.114.114
[root@e4698f625a56 /]# yum install -y net-tools #安装ifconfig命令 [root@e4698f625a56 /]# ifconfig eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.71 netmask 255.255.255.0 broadcast 192.168.1.255 [root@e4698f625a56 /]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
到此,docker实例配置静态IP成功。
实战1: 使用静态IP启动的docker实例运行,一个web服务器 [root@1e1db6c6c17c ~]# yum install httpd -y #安装 [root@1e1db6c6c17c ~]# systemctl start httpd #这个方式,无法启动 [root@1e1db6c6c17c ~]# httpd #直接运行 httpd命令 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::a0be:f1ff:feeb:484. Set the 'ServerName' directive globally to suppress this message [root@1e1db6c6c17c ~]# netstat -antup | grep 80 #发现80已经监听 [root@1e1db6c6c17c ~]# cd /var/×××w/html/ # [root@1e1db6c6c17c ~]# echo aaaaa > index.html 查看结果即可
总结: 1、创建一个br0桥接设备 2、下载pipework 包并安装 3、安装并运行docker 4、导入centos docker 镜像 5、启动一个docker实例 注意加参数: --net=none --privileged=true 6、使用pipework 给docker实例配置IP
|