~阿弥陀佛~

人生能有多少天是按照自己的想法去活着

docker四种网络模型实践

创建桥接式容器

桥接式容器是用来对外通讯,虽然对外并不包含宿主机之外的其他位置,但至少要包含宿主机之上其他容器的,主机间通讯很多情况使用主机名,注意以下命令在docker run和docker create都可以使用

[root@node-2 ~]# docker run –name wlx2 -it –rm busybox:latest /bin/sh  (–rm 退出容器后,容器自动删除)

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:05 

          inet addr:172.17.0.5  Bcast:172.17.255.255  Mask:255.255.0.0

/ # hostname

8a97c667423c   (默认容器ID就是其主机名)

/ #

/ # exit

^C[root@node-2 ~]# docker ps

CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS     NAMES

8a97c667423c   busybox:latest       "/bin/sh"                46 seconds ago   Up 45 seconds             wlx2

[root@node-2 ~]# docker run –name wlx2 -it –network bridge  -h t1.magedu.com –rm busybox:latest /bin/sh  (-h手动指定主机名为t1.magedu.com)

/ # hostname

t1.magedu.com  (假如这个容器通过主机名与其他容器进行通讯,两种方式,dns服务器主机名解析或hosts文件,)

/ #

/ # cat /etc/hosts

127.0.0.1                                                                                     localhost

::1                                                                                              localhost ip6-localhost ip6-loopback

fe00::0                                                                                        ip6-localnet

ff00::0                                                                                         ip6-mcastprefix

ff02::1                                                                                         ip6-allnodes

ff02::2                                                                                         ip6-allrouters

172.17.0.4                                                                                   t1.magedu.com t1

/ # cat /etc/resolv.conf

# Generated by NetworkManager

nameserver 192.168.8.1   (指向的dns服务器地址是物理网络中的,用的是宿主机可用的正常的外部的dns服务器

/ # nslookup  -type=A www.baidu.com   (测试解析)

Server:                                                                                        192.168.8.1

Address:                                                                                     192.168.8.1:53

Non-authoritative answer:

www.baidu.com                                                                          canonical name = www.a.shifen.com

Name:                                                                                        www.a.shifen.com

Address: 110.242.68.3

Name:                                                                                        www.a.shifen.com

Address: 110.242.68.4)

[root@node-2 ~]# docker run –name wlx2 -it –network bridge  -h t1.magedu.com  –dns 114.114.114.114  –dns-search linux.io –rm busybox:latest /bin/sh  (–dns指定dns地址,–dns-search指定搜索域)

/ # cat /etc/resolv.conf

search linux.io

nameserver 114.114.114.114

[root@node-2 ~]#

[root@node-2 ~]# docker run –name wlx2 -it –network bridge  -h t1.magedu.com  –add-host www.wlxbeijing.com:192.168.0.2 –rm busybox:latest /bin/sh   (–add-host 添加host解析)

/ # cat /etc/hosts

192.168.0.2                                                                                 www.wlxbeijing.com

[root@node-2 ~]# docker run –name wlx2 -it –network bridge –rm busybox:latest /bin/sh  (–network bridge手动指定网络模式和不指定是一样的)

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:05 

          inet addr:172.17.0.5  Bcast:172.17.255.255  Mask:255.255.0.0

/ # exit

[root@node-2 ~]#

 

创建一个封闭式容器

[root@node-2 ~]# docker run –name wlx2 -it –network none –rm busybox:latest /bin/sh  (node封闭式容器,只有lo)

/ # ifconfig

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

两个宿主机之间容器网络IP时私有地址,在没有路由信息的情况下是无法通讯的,但是宿主机很多的情况下添加路由信息过于麻烦,因此应该把服务主动暴露到对外通讯的网络中,相当于dnat去发布,-p选项可以使用多次  -P暴露所有端口

四种方式

1.      -P (containerPort)

 将指定的容器端口映射至主机所有地址的一个动态端口(动态端口指随机端口,具体的映射结果可用docker port命令查看)

 

[root@node-2 ~]# docker run –name  myweb –rm -p 80 mageedu/httpd:v0.2

[root@node-2 ~]# docker inspect f6f27079eece  (查看运行容器的IP,在外部访问时应该访问node2宿主机的地址,因为做了dnat)

[root@node-2 ~]# iptables -t  nat -vnL  (查看dnat端口)

Chain DOCKER (2 references)

 pkts bytes target     prot opt in     out     source               destination        

    0     0 RETURN     all  —  docker0 *       0.0.0.0/0            0.0.0.0/0          

0     0 DNAT       tcp  —  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:49153 to:172.17.0.4:80

浏览器访问http://192.168.8.135:49153/ 测试

[root@node-2 ~]# docker kill myweb  (容器删除相应的规则也会删除)

myweb

[root@node-2 ~]#

1.      -p (hostport):(containerport)

   将容器端口映射至指定的主机端口

 

【宿主机可能有多个IP地址,默认情况是把每个地址的某个端口都转为容器的80端口,现在指定某个IP

[root@node-2 ~]# docker port myweb (显示容器的映射,将容器tcp协议的80端口映射到物理机所有可用地址的49154上)

80/tcp -> 0.0.0.0:49154

oot@node-2 ~]# docker run –name  myweb –rm -p 192.168.8.135::80 mageedu/httpd:v0.2  (两个冒号中间表示宿主机使用什么端口即随机端口 )

[root@node-2 ~]# docker port myweb

80/tcp -> 192.168.8.135:49154  (非0.0.0.0了,浏览器测试)

 

2.     -p (ip):(containerport)\

将指定的容器端口映射至主机指定ip的动态端口

[root@node-2 ~]# docker run –name  myweb –rm -p 80:80 mageedu/httpd:v0.2(宿主机80映射容器80)

[root@node-2 ~]# docker port myweb

80/tcp -> 0.0.0.0:80

 

3.     -p  (ip):(hostport):(containerport)

将指定的容器端口映射至主机指定的ip的端口

[root@node-2 ~]# docker run –name  myweb –rm -p 192.168.8.135:8080:80  mageedu/httpd:v0.2 (主机的地址和8080 映射到容器的80)

[root@node-2 ~]# docker port myweb

80/tcp -> 192.168.8.135:8080

 

创建联盟式容器

联盟式容器是指使用某个已存在容器的网络接口的容器,接口被联盟内的各容器共享使用; 因此,联盟式容器彼此间瓦全无隔离,

联盟式容器彼此间虽然共享同一个网络名称空间,但其他名称空间如user,mount等还是隔离的

联盟式容器彼此间存在端口冲突的可能性,因此,通常只会在多个容器上的程序需要程序loopback接口互相通信,或对某已存的容器的网络属性进行监控时才使用此种模式的网络模型。

[root@node-2 ~]# docker run –name wlx3 -it –rm busybox  (-it交互式启动)

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04 

          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0

 

[root@node-2 ~]# docker run –name wlx4 -it –rm busybox  (另启一个终端运行wlx4容器查看ip为0.5)

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:05 

          inet addr:172.17.0.5  Bcast:172.17.255.255  Mask:255.255.0.0

[root@node-2 ~]# docker run –name wlx4  –network container:wlx3 -it –rm busybox  (wlx4共享wlx3容器的网络名称空间,但是他们的文件系统还是隔离的可以都创建文件测试)

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04 

          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0

 

 

[root@node-2 ~]# docker run –name wlx4  –network container:wlx3 -it –rm busybox

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

/ # httpd -h /tmp/

/ #

[root@node-2 ~]# docker run –name wlx3 -it –rm busybox  (在wlx3上访问127.0.0.1确定wlx4的网络共享)

/ # wget -O – -q 127.0.0.1

hello world

 

创建开放式容器

共享宿主机的网络名称空间

[root@node-2 ~]# docker run –name wlx4  –network host -it –rm busybox

/ # ifconfig

docker0   Link encap:Ethernet  HWaddr 02:42:57:84:B0:11 

          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

      

 

ens33     Link encap:Ethernet  HWaddr 00:0C:29:46:57:AE 

          inet addr:192.168.8.135  Bcast:192.168.8.255  Mask:255.255.255.0

 

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

/ # httpd -h /tmp/

/ # netstat -tnl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State      

tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN     

tcp        0      0 127.0.0.1:37717         0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     

tcp        0      0 :::10250                :::*                    LISTEN     

tcp        0      0 :::80                   :::*                    LISTEN      

tcp        0      0 :::22                   :::*                    LISTEN   

浏览器访问测试

Next Post

Previous Post

Leave a Reply

© 2021 ~阿弥陀佛~

ICP备案号: 京ICP备19038630号

版权所有@ 王力翔

耗时 0.205 秒 | 查询 43 次 | 内存 22.42 MB