docker淺學筆記-docker網絡管理

###docker網絡管理###

       docker網絡管理主要試驗了三點:外部訪問容器端口,痛點在於創建容器時考慮不周到,中途指定端口映射失敗,需要先將容器打包爲鏡像,重新創建並指定端口映射;單機容器互通根據情況選擇方法;不同主機網絡互通痛點在於etcd設定ip地址規則,key一定要對應flannel配置文件,還有docker需要配置連接flannel,否則docker網橋和容器地址也不會改變,加以總結以記之。


1、外部訪問端口映射

-P隨機端口
-p 192.168.1.1:80:80指定端口
-p 80:80/udp 指定協議

創建鏡像和容器
[root@node01 /]# docker pull centos
直接使用bash創建容器後,報錯systemctl未知
[root@node01 /]# docker run --privileged -it -d  --name centos-lnmp centos  /usr/sbin/init
[root@node01 /]# docker exec -it centos-lnmp bash
[root@692d1b8f634a /]# yum install -y nginx
FAQ:安裝好nginx後,docker run命令添加端口映射失敗,只有在創建容器時候才能定義端口映射,目前解決方法爲
1、將容易打包爲鏡像;2、導入鏡像;3、重新創建容器並指定規則;4、查看結果。還有一種修改配置文件方法自行搜索。
[root@node01 /]# docker export -o lnmp.tar centos-lnmp
[root@node01 /]# docker import lnmp.tar hahaha:v1
[root@node01 /]# docker run --privileged -it -d  -p 8888:80  --name hahaha-lnmp hahaha:v1  /usr/sbin/init
[root@node01 /]# docker exec -it hahaha-lnmp bash
[root@node01 /]# docker ps

2、單機容器互通

* 第一種方法:link參數配置busybox網絡互通(集常用命令和工具的軟件)
 這種方法特點是容器IP可能不固定,一般容器名是固定的
[root@node01 ~]# docker run -it --name busybox1 busybox
[root@node01 ~]# docker run -it --link busybox1:busybox1 --name busybox2 busybox
/ # cat /etc/hosts
172.17.0.2      busybox1 c65f8fcbbc7b  #自動添加域名解析
172.17.0.3      3b2ce1c63b9a 

* 第二種方法:利用docker網絡模式
[root@node01 ~]# docker network ls
host:能充分利用網卡性能,但容易佔用本地端口產生衝突,不常用
創建自己的局域網絡(可指定網段)
特點自定義網段與ip,創建出來的容器默認互通,但是隻針對自定義的網絡有效
[root@node01 ~]# docker network  create --driver bridge (--subnet 192.168.88.0/24 --gateway 192.168.88.1) my-net1
[root@node01 ~]# docker run -it --rm --network=my-net1 --ip 192.168.88.5 busybox

* 第三種方法:兩個不在同一網絡容器怎麼互通
特點給容器添加雙網卡
[root@node01 ~]# docker network connect 網絡名 容器名

 

3、不同主機網絡互通,etcd+flannel+docker實現


*主控端操作(192.168.192.129)*

#####主控端配置etcd####
[root@node01 ~]# yum install etcd flannel -y
配置etcd
[root@node01 ~]# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak
[root@node01 ~]# vim /etc/etcd/etcd.conf
ETCD_LISTEN_PEER_URLS="http://192.168.192.129:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.192.129:2379,http://127.0.0.1:2379"
ETCD_NAME="master"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.192.129:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.192.129:2379"
重啓etcd
[root@node01 ~]# systemctl enable etcd
[root@node01 ~]# systemctl start etcd
設置host主機的subnet即ip地址池
[root@node01 ~]# vim /root/etcd.sh
{ "Network": "10.10.0.0/16","SubnetLen": 24,"Backend": {"Type":"vxlan"} }
保存配置到etcd,/usr/local/bin/network/config作爲key會在flannel裏面也會配置
[root@node01 ~]# etcdctl --endpoints=http://192.168.192.129:2379 set /usr/local/bin/network/config < /root/etcd.sh

#####主控端配置etcd####
[root@node01 ~]# yum install -y flannel
[root@node01 ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
[root@node01 ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.192.129:2379"
FLANNEL_ETCD_PREFIX="/usr/local/bin/network"
[root@node01 ~]# systemctl enable flanneld
[root@node01 ~]# systemctl start flanneld
[root@node01 ~]# systemctl restart docker
發現新增flannel.1網卡
[root@node01 ~]# ip a
flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default 
link/ether 7e:8c:5b:1a:60:35 brd ff:ff:ff:ff:ff:ff
inet 10.10.90.0/32 scope global flannel.1


*被控端操作(192.168.192.130)*
[root@node02 ~]# yum install -y flannel
[root@node02 ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
[root@node02 ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.192.129:2379"
FLANNEL_ETCD_PREFIX="/usr/local/bin/network"
[root@node02 ~]# systemctl enable flannel
Failed to execute operation: No such file or directory
[root@node02 ~]# systemctl enable flanneld
[root@node02 ~]# systemctl start flanneld
[root@node01 ~]# systemctl restart docker
此時發現兩臺機器docker網卡ip地址相同都是10.10段,接下來需要配置 docker 連接 flannel


*docker操作(192.168.192.129/130)*
[root@node02 ~]# cat  /run/flannel/subnet.env
FLANNEL_SUBNET=10.10.48.1/24
FLANNEL_MTU=1450
[root@node01 ~]# vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --bip=10.10.90.1/24 --mtu=1450
[root@node02 ~]# systemctl daemon-reload
[root@node02 ~]# systemctl restart docker


*驗證工作(192.168.192.129/130)*


此時執行 ip a命令
flannel和docker網卡應該都是10.10段,如果兩臺主機容器之間還是ping不通
如果開啓了路由轉發:echo 1 > /proc/sys/net/ipv4/ip_forward 還是不行,
且主機防火牆:firewalld和selinux已經關閉,因爲linux還有底層的iptables,
所以在兩臺主機上分別執行iptables -P  FORWARD ACCEPT
#驗證
最終結果應爲兩臺主機之間、主機與容器之間、容器與容器之間網絡互通

/ # ping www.baidu.com
PING www.baidu.com (61.135.169.121): 56 data bytes
64 bytes from 61.135.169.121: seq=0 ttl=127 time=59.426 ms
64 bytes from 61.135.169.121: seq=1 ttl=127 time=47.179 ms

/ # ping 192.168.192.129
PING 192.168.192.129 (192.168.192.129): 56 data bytes
64 bytes from 192.168.192.129: seq=0 ttl=64 time=0.058 ms
64 bytes from 192.168.192.129: seq=1 ttl=64 time=0.100 ms

/ # ping 192.168.192.130
PING 192.168.192.130 (192.168.192.130): 56 data bytes
64 bytes from 192.168.192.130: seq=0 ttl=63 time=0.427 ms
64 bytes from 192.168.192.130: seq=1 ttl=63 time=1.273 ms

/ # ping 10.10.48.2
PING 10.10.48.2 (10.10.48.2): 56 data bytes
64 bytes from 10.10.48.2: seq=0 ttl=62 time=1.025 ms
64 bytes from 10.10.48.2: seq=1 ttl=62 time=0.776 ms

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章