天天看點

docker(二)--容器網絡相關

同一實體機上的兩個容器通信

可以在主機上建立一個虛拟交換機,在兩個容器各自用純軟體方式建一對虛拟網卡,一個在容器上,一個在交換機上

不同實體機上面的虛拟機通信

橋接網絡: 把實體網卡當作交換機來用。安全性低

nat網絡: 實體機上打開轉發功能,容器c1 snat到實體機1->實體機2 snat容器c2,并且c1看不到c2。效率低

Overlay Network 疊加網絡:容器c1 通過隧道模式與實體機h1通信,并且c1和實體機2上的c2在同一網段。

容器運作時,預設會為每個容器建立一對網卡,一半在容器中,一半在主控端上,并且被關聯到了docker0上面,docker0橋即nat橋

 docker ps 看到有3個容器運作

docker(二)--容器網絡相關
ip addr   看到有3個veth開頭的虛拟網卡
docker(二)--容器網絡相關

 brctl show  

可以檢視到容器的網卡被關聯到docker0

docker(二)--容器網絡相關

同一主機上的容器之間能夠互相通路

例如:

 docker inspect web1 可以看到web1容器的ip 為172.27.0.2

 進入busybox這個容器中:

docker exec -it t2 /bin/sh

/ # ifconfig

eth0 Link encap:Ethernet HWaddr 02:42:AC:1B:00:03

inet addr:172.27.0.4 Bcast:172.27.255.255 Mask:255.255.0.0

/ # wget -O - -q http://172.27.0.2    # 在t2容器中可以通路到web1容器中的nginx服務

<!DOCTYPE html>

...

<body>

<h1>Welcome to nginx!</h1>

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

如果外部機器需要通路該主機上的容器web1,外部->主機->容器。需要通過主機dnat 轉發到容器,才能使容器被外部通路到。

docker的四種網絡通信模型

docker(二)--容器網絡相關

 docker network inspect bridge  檢視bridge的詳細資訊

第一種:封閉式網絡

  docker run --name t1 -it --network none --rm busybox:latest   

/ # ifconfig -a   檢視隻有一個lo網卡

docker(二)--容器網絡相關

 第二種,bridge橋接式,也就是預設的:

 docker run --name t1 -it --network bridge --rm busybox:latest     (這裡不指定network也預設是bridge)

docker(二)--容器網絡相關

 bridged containers 啟動時還可以指定主機名和dns等:

docker run --name t1 -it -h docker1.test.com --dns 114.114.114.114 --dns-search ilinux.io --rm busybox

/ # hostname

docker1.test.com

/ # cat /etc/resolv.conf 

search ilinux.io

nameserver 114.114.114.114

options rotate timeout:1

使主控端外部用戶端能夠通路容器

-p <containerPort>   将指定容器端口映射到主機的一個動态端口

-p <hostPort>:<containerPort>  将容器端口<containerPort>映射至主機指定端口<hostPort>

-p <ip>::<containerPort>   将指定的容器端口<containerPort>映射至主機指定<ip>的動态端口

-p <ip>:<hostPort>:<containerPort>   将指定的容器端口<containerPort> 映射到主機指定<ip>的指定端口<hostPort>

docker run --name boxweb --rm -p 80 abao/bbox:v0.2     啟動一個httpd

docker port boxweb   #動态端口是随機端口,docker port可以檢視具體映射結果

 80/tcp -> 0.0.0.0:32768

在外部可以通過主控端ip:32768 通路到容器

第三種:joined containers  聯盟式容器

聯盟式容器是指使用某個已存在容器的網絡接口的容器,接口被聯盟内的各容器共享使用。

聯盟式容器彼此間雖然共享一個網絡名稱空間,但是其它名稱空間:user、mount等還是隔離的

聯盟式容器彼此間存在端口沖突的可能性,是以,通常隻會在多個容器上的程式需要程式loopback接口互相通信、或對已存在的容器的網絡屬性進行監控是才使用此種模式

啟動一個c1容器

docker run --name c1 -it --rm busybox

啟動一個c2

docker run --name c2 --network container:c1 -it --rm busybox

c1,c2檢視ip主機名都是一樣的,但是在建立檔案互相看不到,啟動httpd,能檢視到監聽的80端口

第四種:Open container 開放式容器

  共享主控端的網絡名稱空間

docker run --name c3 --network host -it --rm busybox

/ # echo "hello container" >/tmp/index.html

/ # httpd -h /tmp

在主控端外部可以通路到 httpd服務

# curl 172.27.0.3

hello container

管理network名稱空間

ip netns help
Usage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID
       ip [-all] netns delete [NAME]
       ip netns identify [PID]
       ip netns pids NAME
       ip [-all] netns exec [NAME] cmd ...
       ip netns monitor
       ip netns list-id      

建立network名稱空間,除了network名稱空間的其它名稱空間是共享的

# ip netns add r1

# ip netns add r2

# ip netns list

r2

r1

# ip netns exec r1 ifconfig -a      # 檢視r1和r2都隻有一個lo

 添加虛拟網卡

ip link add name veth1.1 type veth peer name veth1.2

ip link show     可以看到網卡對,但是預設沒有被激活,ifconfig看不到

docker(二)--容器網絡相關

把veth1.2網卡 移到建立的r1 network 名稱空間:

ip link set dev veth1.2 netns r1

再次檢視,可以看到veth1.1在主機上,veth1.2 在r1 網絡名稱空間中:

ip link show

docker(二)--容器網絡相關

ip netns exec r1 ifconfig -a

docker(二)--容器網絡相關

 給r1的veth1.2 改名:

ip netns exec r1 ip link set dev veth1.2 name eth0

激活主控端的veth1.1

ifconfig veth1.1 10.1.0.1/24 up 

激活r1中的另一半

ip netns exec r1 ifconfig eth0 10.1.0.2/24 up

測試ping可以互相通信

将主控端的veth1.1移到r2中,r1和r2兩個網絡名稱空間中可以通過虛拟網卡互相進行通信:

docker(二)--容器網絡相關

ip link set dev veth1.1 netns r2

ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up

ip netns exec r2 ping 10.1.0.2

---由于很長時間沒用這台機器,網絡中間配置混亂,導緻主機和docker不通,後重新修改了docker網段,如下-------

修改docker預設的網段

第一步 删除原有配置

service docker stop
ip link set dev docker0 down
brctl delbr docker0
iptables -t nat -F POSTROUTING      

第二步 建立新的網橋

brctl addbr docker0
ip addr add 172.17.0.1/24 dev docker0
ip link set dev docker0 up      

第三步 配置Docker的檔案

vi /etc/docker/daemon.json
# cat /etc/docker/daemon.json  #可以自定義docker0橋的網絡屬性資訊
{"registry-mirrors": ["http://224ac393.m.daocloud.io"],
    "bip": "172.17.0.1/24"
}
# systemctl  restart  docker

      

docker遠端連接配接

docker預設是監聽在本地unix socket位址,/var/run/docker.sock,如果使用tcp套接字docker可以使外部能連接配接

修改node1的配置

/etc/docker/daemon.json

"hosts":["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]

在node2上面可以連接配接node1的docker

docker -H 172.27.0.3:2375 image ls 

建立docker橋

 docker network create -d bridge --subnet "172.16.0.0/16" --gateway "172.16.0.1" docker1

3d11b7921e4810d2b728e1c1cafd3bac9c399ecf4f72ab6d6652b81906dcb69c

docker(二)--容器網絡相關

docker run --name d1 -it --network docker1 busybox

eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:02

inet addr:172.16.0.2 Bcast:172.16.255.255 Mask:255.255.0.0

繼續閱讀