[虛擬化]連載No3之虛擬網路+Docker映象模擬雲伺服器搭建
阿新 • • 發佈:2019-01-10
本次任務:
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:0RX 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 容器