Docker容器间通信与外网通信的操作

一 容器间通信 1.容器的网络共享
处于这个模式下的docker容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
使用于web服务器与应用服务器之间的通信。
Docker容器间通信与外网通信的操作
文章图片

##清空实验环境[root@server1 ~]# docker ps -aCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES ##默认网络创建容器[root@server1 ~]# docker run -it --name vm1 ubunturoot@b1a2a90f98a5:/# ip a1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever368: eth0@if369: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft foreverroot@b1a2a90f98a5:/# [root@server1 ~]# ##container创建与vm1 网络共享的vm2[root@server1 ~]# docker run -it --name vm2 --network container:vm1 ubunturoot@b1a2a90f98a5:/# ip a1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever368: eth0@if369: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft foreverroot@b1a2a90f98a5:/#

Docker容器间通信与外网通信的操作
文章图片

2.--link方式
Docker容器间通信与外网通信的操作
文章图片

##清空镜像[root@server1 ~]# docker rm -f vm1vm1[root@server1 ~]# docker rm -f vm2vm2[root@server1 ~]# docker ps -aCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES ##默认网络创建vm1[root@server1 ~]# docker run -it --name vm1 ubunturoot@68e56c57a9a0:/# ip a1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever370: eth0@if371: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft foreverroot@68e56c57a9a0:/# [root@server1 ~]# ##--link方式创建vm1子网的容器vm2[root@server1 ~]# docker run -it --name vm2 --link vm1:web ubunturoot@61267851b484:/# ip a1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever372: eth0@if373: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ffinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0##ip与vm1同网段,递增valid_lft forever preferred_lft forever ##解析文件中含有vm1 的ip 与别名等信息root@61267851b484:/# cat /etc/hosts127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.17.0.2 web 68e56c57a9a0 vm1172.17.0.3 61267851b484root@61267851b484:/# ^Croot@61267851b484:/#

Docker容器间通信与外网通信的操作
文章图片

--link
更新hosts文件
link容器的变量也复制过来
Docker容器间通信与外网通信的操作
文章图片

【Docker容器间通信与外网通信的操作】Docker容器间通信与外网通信的操作
文章图片

root@61267851b484:/# envHOSTNAME=61267851b484TERM=xtermLS_COLORS=rs=0:di=01; 34:ln=01; 36:mh=00:pi=40; 33:so=01; 35:do=01; 35:bd=40; 33; 01:cd=40; 33; 01:or=40; 31; 01:su=37; 41:sg=30; 43:ca=30; 41:tw=30; 42:ow=34; 42:st=37; 44:ex=01; 32:*.tar=01; 31:*.tgz=01; 31:*.arj=01; 31:*.taz=01; 31:*.lzh=01; 31:*.lzma=01; 31:*.tlz=01; 31:*.txz=01; 31:*.zip=01; 31:*.z=01; 31:*.Z=01; 31:*.dz=01; 31:*.gz=01; 31:*.lz=01; 31:*.xz=01; 31:*.bz2=01; 31:*.bz=01; 31:*.tbz=01; 31:*.tbz2=01; 31:*.tz=01; 31:*.deb=01; 31:*.rpm=01; 31:*.jar=01; 31:*.war=01; 31:*.ear=01; 31:*.sar=01; 31:*.rar=01; 31:*.ace=01; 31:*.zoo=01; 31:*.cpio=01; 31:*.7z=01; 31:*.rz=01; 31:*.jpg=01; 35:*.jpeg=01; 35:*.gif=01; 35:*.bmp=01; 35:*.pbm=01; 35:*.pgm=01; 35:*.ppm=01; 35:*.tga=01; 35:*.xbm=01; 35:*.xpm=01; 35:*.tif=01; 35:*.tiff=01; 35:*.png=01; 35:*.svg=01; 35:*.svgz=01; 35:*.mng=01; 35:*.pcx=01; 35:*.mov=01; 35:*.mpg=01; 35:*.mpeg=01; 35:*.m2v=01; 35:*.mkv=01; 35:*.webm=01; 35:*.ogm=01; 35:*.mp4=01; 35:*.m4v=01; 35:*.mp4v=01; 35:*.vob=01; 35:*.qt=01; 35:*.nuv=01; 35:*.wmv=01; 35:*.asf=01; 35:*.rm=01; 35:*.rmvb=01; 35:*.flc=01; 35:*.avi=01; 35:*.fli=01; 35:*.flv=01; 35:*.gl=01; 35:*.dl=01; 35:*.xcf=01; 35:*.xwd=01; 35:*.yuv=01; 35:*.cgm=01; 35:*.emf=01; 35:*.axv=01; 35:*.anx=01; 35:*.ogv=01; 35:*.ogx=01; 35:*.aac=00; 36:*.au=00; 36:*.flac=00; 36:*.mid=00; 36:*.midi=00; 36:*.mka=00; 36:*.mp3=00; 36:*.mpc=00; 36:*.ogg=00; 36:*.ra=00; 36:*.wav=00; 36:*.axa=00; 36:*.oga=00; 36:*.spx=00; 36:*.xspf=00; 36:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binPWD=/SHLVL=1HOME=/rootWEB_NAME=/vm2/webLESSOPEN=| /usr/bin/lesspipe %sLESSCLOSE=/usr/bin/lesspipe %s %s_=/usr/bin/envroot@61267851b484:/#

容器停止 ip将释放掉,开启后重新获取其他ip,link的容器自动更新hosts文件
二 容器与外网间的通信 Docker容器间通信与外网通信的操作
文章图片

查看当前iptable的nat表火墙策略
[root@server1 ~]# iptables -t nat -nLChain PREROUTING (policy ACCEPT)targetprot opt sourcedestinationDOCKERall -- 0.0.0.0/00.0.0.0/0ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT)targetprot opt sourcedestination Chain OUTPUT (policy ACCEPT)targetprot opt sourcedestinationDOCKERall -- 0.0.0.0/0!127.0.0.0/8ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT)targetprot opt sourcedestinationMASQUERADE all -- 172.26.0.0/240.0.0.0/0MASQUERADE all -- 172.20.0.0/160.0.0.0/0MASQUERADE all -- 172.18.0.0/160.0.0.0/0MASQUERADE all -- 172.17.0.0/160.0.0.0/0 Chain DOCKER (2 references)targetprot opt sourcedestinationRETURNall -- 0.0.0.0/00.0.0.0/0RETURNall -- 0.0.0.0/00.0.0.0/0RETURNall -- 0.0.0.0/00.0.0.0/0RETURNall -- 0.0.0.0/00.0.0.0/0

##创建nginx容器,并映射端口[root@server1 ~]# docker run -d --name nginx -p 80:80 nginxcfefe6420cfe60c46cb7a050c142af7eff86fa6d687c3577077a5b4e2c8b961c ##开启80端口[root@server1 ~]# docker port nginx 80/tcp -> 0.0.0.0:80 [root@server1 ~]# netstat -antlp | grep 80tcp600 :::80:::*LISTEN27094/docker-proxy [root@server1 ~]# iptables -t nat -nLChain PREROUTING (policy ACCEPT)targetprot opt sourcedestinationDOCKERall -- 0.0.0.0/00.0.0.0/0ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT)targetprot opt sourcedestination Chain OUTPUT (policy ACCEPT)targetprot opt sourcedestinationDOCKERall -- 0.0.0.0/0!127.0.0.0/8ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT)targetprot opt sourcedestinationMASQUERADE all -- 172.26.0.0/240.0.0.0/0MASQUERADE all -- 172.20.0.0/160.0.0.0/0MASQUERADE all -- 172.18.0.0/160.0.0.0/0MASQUERADE all -- 172.17.0.0/160.0.0.0/0MASQUERADE tcp -- 172.17.0.2172.17.0.2tcp dpt:80 Chain DOCKER (2 references)targetprot opt sourcedestinationRETURNall -- 0.0.0.0/00.0.0.0/0RETURNall -- 0.0.0.0/00.0.0.0/0RETURNall -- 0.0.0.0/00.0.0.0/0RETURNall -- 0.0.0.0/00.0.0.0/0DNATtcp -- 0.0.0.0/00.0.0.0/0tcp dpt:80 to:172.17.0.2:80[root@server1 ~]#

Docker容器间通信与外网通信的操作
文章图片

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    推荐阅读