当前位置:服务器 > > 正文

docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

时间:2021-10-24 10:03:35类别:服务器

docker容器是怎么进行通信的

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

1.容器的网络共享

处于这个模式下的docker容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

使用于web服务器与应用服务器之间的通信。

docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

  • ##清空实验环境
    [root@server1 ~]# docker ps -a
    CONTAINER ID    IMAGE        COMMAND       CREATED       STATUS       PORTS        NAMES
     
    ##默认网络创建容器
    [root@server1 ~]# docker run -it --name vm1 ubuntu
    root@b1a2a90f98a5:/# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
    368: eth0@if369: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
      link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
      inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
        valid_lft forever preferred_lft forever
    root@b1a2a90f98a5:/# [root@server1 ~]# 
     
    ##container创建与vm1 网络共享的vm2
    [root@server1 ~]# docker run -it --name vm2 --network container:vm1 ubuntu
    root@b1a2a90f98a5:/# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
    368: eth0@if369: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
      link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
      inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
        valid_lft forever preferred_lft forever
    root@b1a2a90f98a5:/# 
    
  • docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

    2.--link方式

    docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

  • ##清空镜像
    [root@server1 ~]# docker rm -f vm1
    vm1
    [root@server1 ~]# docker rm -f vm2
    vm2
    [root@server1 ~]# docker ps -a
    CONTAINER ID    IMAGE        COMMAND       CREATED       STATUS       PORTS        NAMES
     
    ##默认网络创建vm1
    [root@server1 ~]# docker run -it --name vm1 ubuntu
    root@68e56c57a9a0:/# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
    370: eth0@if371: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
      link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
      inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
        valid_lft forever preferred_lft forever
    root@68e56c57a9a0:/# [root@server1 ~]#
     
    ##--link方式创建vm1子网的容器vm2
    [root@server1 ~]# docker run -it --name vm2 --link vm1:web ubuntu
    root@61267851b484:/# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
    372: eth0@if373: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
      link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
      inet 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/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.2 web 68e56c57a9a0 vm1
    172.17.0.3 61267851b484
    root@61267851b484:/# ^C
    root@61267851b484:/# 
    
  • docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

    --link

    更新hosts文件

    link容器的变量也复制过来

    docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

    docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

  • root@61267851b484:/# env
    HOSTNAME=61267851b484
    TERM=xterm
    LS_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" alt="docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)" border="0" />
    
  • 容器停止 ip将释放掉,开启后重新获取其他ip,link的容器自动更新hosts文件

    二 容器与外网间的通信

    docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

    查看当前iptable的nat表火墙策略

  • [root@server1 ~]# iptables -t nat -nL
    Chain PREROUTING (policy ACCEPT)
    target   prot opt source        destination     
    DOCKER   all -- 0.0.0.0/0      0.0.0.0/0      ADDRTYPE match dst-type LOCAL
     
    Chain INPUT (policy ACCEPT)
    target   prot opt source        destination     
     
    Chain OUTPUT (policy ACCEPT)
    target   prot opt source        destination     
    DOCKER   all -- 0.0.0.0/0      !127.0.0.0/8     ADDRTYPE match dst-type LOCAL
     
    Chain POSTROUTING (policy ACCEPT)
    target   prot opt source        destination     
    MASQUERADE all -- 172.26.0.0/24    0.0.0.0/0      
    MASQUERADE all -- 172.20.0.0/16    0.0.0.0/0      
    MASQUERADE all -- 172.18.0.0/16    0.0.0.0/0      
    MASQUERADE all -- 172.17.0.0/16    0.0.0.0/0      
     
    Chain DOCKER (2 references)
    target   prot opt source        destination     
    RETURN   all -- 0.0.0.0/0      0.0.0.0/0      
    RETURN   all -- 0.0.0.0/0      0.0.0.0/0      
    RETURN   all -- 0.0.0.0/0      0.0.0.0/0      
    RETURN   all -- 0.0.0.0/0      0.0.0.0/0  
    
  • ##创建nginx容器,并映射端口
    [root@server1 ~]# docker run -d --name nginx -p 80:80 nginx
    cfefe6420cfe60c46cb7a050c142af7eff86fa6d687c3577077a5b4e2c8b961c
     
    ##开启80端口
    [root@server1 ~]# docker port nginx 
    80/tcp -> 0.0.0.0:80
     
    [root@server1 ~]# netstat -antlp | grep 80
    tcp6    0   0 :::80          :::*          LISTEN   27094/docker-proxy 
    [root@server1 ~]# iptables -t nat -nL
    Chain PREROUTING (policy ACCEPT)
    target   prot opt source        destination     
    DOCKER   all -- 0.0.0.0/0      0.0.0.0/0      ADDRTYPE match dst-type LOCAL
     
    Chain INPUT (policy ACCEPT)
    target   prot opt source        destination     
     
    Chain OUTPUT (policy ACCEPT)
    target   prot opt source        destination     
    DOCKER   all -- 0.0.0.0/0      !127.0.0.0/8     ADDRTYPE match dst-type LOCAL
     
    Chain POSTROUTING (policy ACCEPT)
    target   prot opt source        destination     
    MASQUERADE all -- 172.26.0.0/24    0.0.0.0/0      
    MASQUERADE all -- 172.20.0.0/16    0.0.0.0/0      
    MASQUERADE all -- 172.18.0.0/16    0.0.0.0/0      
    MASQUERADE all -- 172.17.0.0/16    0.0.0.0/0      
    MASQUERADE tcp -- 172.17.0.2      172.17.0.2      tcp dpt:80
     
    Chain DOCKER (2 references)
    target   prot opt source        destination     
    RETURN   all -- 0.0.0.0/0      0.0.0.0/0      
    RETURN   all -- 0.0.0.0/0      0.0.0.0/0      
    RETURN   all -- 0.0.0.0/0      0.0.0.0/0      
    RETURN   all -- 0.0.0.0/0      0.0.0.0/0      
    DNAT    tcp -- 0.0.0.0/0      0.0.0.0/0      tcp dpt:80 to:172.17.0.2:80
    [root@server1 ~]# 
    
  • docker容器是怎么进行通信的(Docker容器间通信与外网通信的操作)

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

    上一篇下一篇

    猜您喜欢

    热门推荐