1. 程式人生 > >[虛擬化]連載No3之虛擬網路+Docker映象模擬雲伺服器搭建

[虛擬化]連載No3之虛擬網路+Docker映象模擬雲伺服器搭建

本次任務:

 1: 宿主機配置一塊虛擬橋接模式網絡卡

 2:使用docker映象製作可以ssh登入的虛擬機器

 3:配置虛擬機器橋接網路,獨立ip可以保證外部登入[不走埠對映]

==========宿主機配置虛擬橋接網絡卡在Linux上建立橋裝置===========
首先最開始的網路資訊如下:

[[email protected] network-scripts]# ifconfig   
eth0      Link encap:Ethernet  HWaddr 00:0C:29:02:2B:7E    
          inet addr:192.168.217.131  Bcast:192.168
.217.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe02:2b7e/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:301 errors:0 dropped:0 overruns:0 frame:0 TX packets:64 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:48584 (47.4 KiB) TX bytes:4344
(4.2 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:16436 Metric:1 RX packets:453 errors:0 dropped:0 overruns:0 frame:0 TX packets:453 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0
RX bytes:87716 (85.6 KiB) TX bytes:87716 (85.6 KiB)

第一,要注意。橋接的話,不支援NetworkManager去管理橋裝置,所以建立橋裝置,必須關掉NetworkManager。
 [[email protected] network-scripts]# service NetworkManager status [linux: chkconfig --list|grep NetworkManager   ]
NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off  
[[email protected] network-scripts]# service NetworkManager stop
NetworkManager is stopped  
[[email protected] network-scripts]#
基於命令列的實現。
1、建立橋接器br0,併為br0新增eth0網絡卡
[[email protected] ~]# brctl addbr br0
[[email protected] ~]# brctl addif br0 eth0 
[[email protected] ~]# ifconfig -a
br0       Link encap:Ethernet  HWaddr C6:50:BC:BE:88:68
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:7E:C9:4F
          inet addr:192.168.217.129  Bcast:192.168.217.255  Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe7e:c94f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:14062 errors:0 dropped:0 overruns:0 frame:0
TX packets:7065 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:20762199 (19.8 MiB)  TX bytes:392006 (382.8 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:16436  Metric:1
RX packets:18 errors:0 dropped:0 overruns:0 frame:0
TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1064 (1.0 KiB)  TX bytes:1064 (1.0 KiB)  

2、拆掉eth0上的IP
[[email protected] ~]# ifconfig eth0 0 up  
[[email protected] ~]#   
[[email protected] ~]# ifconfig   
eth0      Link encap:Ethernet  HWaddr 00:0C:29:7E:C9:4F    
          inet6 addr: fe80::20c:29ff:fe7e:c94f/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
RX packets:14192 errors:0 dropped:0 overruns:0 frame:0  
TX packets:7084 errors:0 dropped:0 overruns:0 carrier:0  
collisions:0 txqueuelen:1000   
RX bytes:20772188 (19.8 MiB)  TX bytes:394136 (384.8 KiB)  

3、為br0新增地址相關內容。
[[email protected] ~]# ifconfig br0 192.168.217.129/24 up  
[[email protected] ~]# route add default gw 192.168.217.2  
[[email protected] ~]#   
[[email protected] ~]# ifconfig   
br0       Link encap:Ethernet  HWaddr 00:0C:29:7E:C9:4F    
          inet addr:192.168.217.129  Bcast:192.168.217.255  Mask:255.255.255.0  
inet6 addr: fe80::20c:29ff:fe7e:c94f/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
RX packets:582 errors:0 dropped:0 overruns:0 frame:0  
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0  
collisions:0 txqueuelen:0   
RX bytes:26772 (26.1 KiB)  TX bytes:606 (606.0 b)  
  
eth0      Link encap:Ethernet  HWaddr 00:0C:29:7E:C9:4F    
          inet6 addr: fe80::20c:29ff:fe7e:c94f/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
RX packets:14868 errors:0 dropped:0 overruns:0 frame:0  
TX packets:7091 errors:0 dropped:0 overruns:0 carrier:0  
collisions:0 txqueuelen:1000   
RX bytes:20814087 (19.8 MiB)  TX bytes:394562 (385.3 KiB)  

4、檢視
[[email protected] ~]# brctl stp br0 on  
[[email protected] ~]# brctl show  
bridge name bridge id       STP enabled interfaces  
br0     8000.000c297ec94f   yes     eth0  

 ===========使用docker映象製作可以ssh登入的虛擬機器=====================
製作虛擬機器映象檔案

#Dockerfile
FROM centos:centos7.2.1511
MAINTAINER xiaoshitou
RUN yum install passwd openssl openssh-server openssh-clients net-tools nc net-tools wget -y
RUN echo '123456' | passwd --stdin root
RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
RUN echo 'root:123456' | chpasswd
#RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum clean all
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ADD run.sh /run.sh
RUN chmod 777 /run.sh
EXPOSE 22
EXPOSE 80
EXPOSE 8080
EXPOSE 8090
EXPOSE 3306
CMD ["/usr/sbin/init","/run.sh"]
#End

製作啟動檔案run.sh   

#!/bin/bash
/usr/sbin/sshd -D
 

 製作映象
docker build -t centos7-ssh .

 建立並啟動容器
docker create --name=centos7-ssh -p 127.0.0.1:3333:22 -p 127.0.0.1:3334:8090 -p 127.0.0.1:3335:3006 centos7-ssh

 啟動容器
docker start centos7-ssh

 測試登陸
  ssh [email protected] -p 3333

 docker預設是nat地址轉換模式
 --更改網路型別為橋接【目的是讓容器網路不走預設的docker0 nat地址轉換,每個容器分配一個獨立的外網訪問ip 】
  1、>宿主機建立橋接器 brctl addbr br-int    【注意,前提是要有橋接網絡卡eth1】
     >橋接網路 brctl addif br-int eth1 
     >啟動  ifconfig br-int up
  2、建立veth裝置(docker-br是連線橋接器br-int  ,eth0-ns是連線docker容器介面)
     >建立兩個介面 ip link add name docker-br type veth peer name eth0-ns
     >啟動 ifconfig docker-br up
     >新增埠到網橋 brctl addif br-int docker-br  橋接模式的時候,要給橋接器配置一個物理介面直達網路
課上bug,是橋接器沒有物理介面eth1,這樣,容器的ARP協議資料包能到br-int,最終ARP包被核心丟棄,
因為網路協議原理定義,arp請求的目標地址不是本機地址時.做丟棄處理
   3、對映網路名稱空間,目的是為了往一個名稱空間新增一個網路介面(網線) mkdir -p /var/run/netns
     >建立新的docker容器,不用指定埠,因為配置橋接模式,不用配置預設的nat網路介面(--net=none),而是手工新增橋接介面
     > docker create --name=ssh02 --net=none centos7-ssh
     > 啟動 docker start centos7-ssh
     > 檢視程序,因為都是在一個名稱空間,可隨便挑選已程序,比如  16319

[[email protected] proc]# docker top d3d1d261830c
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                16295               16277               0                   15:02               ?                   00:00:00            /bin/bash /run.sh
root                16319               16295               0                   15:02               ?                   00:00:00            /usr/sbin/sshd -D
[[email protected] proc]#
     > 檢視程序16319的名稱空間 cd /proc/16319/ns  net為 4026532223 
總用量 0
lrwxrwxrwx 1 root root 0 6月  20 15:06 ipc -> ipc:[4026532220]
lrwxrwxrwx 1 root root 0 6月  20 15:06 mnt -> mnt:[4026532218]
lrwxrwxrwx 1 root root 0 6月  20 15:06 net -> net:[4026532223]
lrwxrwxrwx 1 root root 0 6月  20 15:06 pid -> pid:[4026532221]
lrwxrwxrwx 1 root root 0 6月  20 15:06 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 6月  20 15:06 uts -> uts:[4026532219]
[[email protected] ns]#         
    >隱射docker自己名稱空間到系統目錄下,為的是ip能看到和訪問 這個名稱空間的東西
      格式: ln -sf /proc/{docker_pid}/ns/net /var/run/netns/ssh02
            備註  ssh02可以隨便命名
      執行前檢查  ip netns
      執行   ln -sf /proc/16319/ns/net /var/run/netns/ssh02
    > 將veth另一端加入容器namespace[新增另一個介面到名稱空間(插入docker另一頭網線]
      執行前:進入執行容器ssh2,檢查網路 
             docker exec -it ssh02 /bin/bash
             
      宿主機執行 ip link set eth0-ns netns ssh02 
      執行 容器: ifconfig -a 多出了 eth0-ns介面
         或者 宿主機  ip netns exec ssh02 ifconfig -a
    >配置容器上該網路資訊,新增埠,和主機同一網段:
     ip netns exec ssh02 ifconfig eth0-ns 192.168.0.200/24 
    >如果要訪問外網,需要配置預設閘道器(192.168.0.1為閘道器地址)
      檢查: 名稱空間ssh02路由表  ip netns exec ssh02 route -n
      執行: ip netns exec ssh02 route add default gw 192.168.0.1

=========大功勞搞成,檢驗
1、檢查橋接介面是否正確 

2、宿主機和容器互ping 
   檢視容器ip並ping宿主機  

   宿主機ping 容器