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

一 容器间通信

1.容器的网络共享

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

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

##清空实验环境
[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:/# 

2.--link方式

##清空镜像
[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:/# 

--link

更新hosts文件

link容器的变量也复制过来

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=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:/bin
PWD=/
SHLVL=1
HOME=/root
WEB_NAME=/vm2/web
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/env
root@61267851b484:/# 

容器停止 ip将释放掉,开启后重新获取其他ip,link的容器自动更新hosts文件

二 容器与外网间的通信

查看当前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 ~]# 

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

(0)

相关推荐

  • 详解Docker 容器跨主机多网段通信解决方案

    一.MacVlan 实现Docker的跨主机网络通信的方案有很多,如之前博文中写到的通过部署 Consul服务实现Docker容器跨主机通信 Macvlan工作原理: Macvlan是Linux内核支持的网络接口.要求的Linux内部版本是v3.9–3.19和4.0+: 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址.虚拟出来的子接口将直接暴露在相邻物理网络中.从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样: 物理网卡收到包后,会根据收到

  • Docker容器跨主机通信中直接路由方式详解

    概述 就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要.再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题.本文就来尝试一下. 方案原理分析 由于使用容器的IP进行路由,就

  • Docker基于macvlan实现跨主机容器通信

    找两台测试机: [root@docker1 centos_zabbix]# docker network ls NETWORK ID NAME DRIVER SCOPE 19ac9a55bedb bridge bridge local 0a3cbfe2473f host host local aab77f02a0b1 none null local [root@docker1 centos_zabbix]# docker network create --driver macvlan --sub

  • Docker容器连接相互通信的实现

    端口映射并不是唯一把 docker 连接到另一个容器的方法. docker 有一个连接系统允许将多个容器连接在一起,共享连接信息. docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息. 容器命名 当我们创建一个容器的时候,docker 会自动对它进行命名.另外,我们也可以使用 --name 标识来命名容器,例如: runoob@runoob:~$ docker run -d -P --name runoob training/webapp python app.py 43780

  • docker容器间跨宿主机通信-基于overlay的实现方法

    overlay网络解析 内置跨主机的网络通信一直是Docker备受期待的功能,在1.9版本之前,社区中就已经有许多第三方的工具或方法尝试解决这个问题,例如Macvlan.Pipework.Flannel.Weave等. 虽然这些方案在实现细节上存在很多差异,但其思路无非分为两种: 二层VLAN网络和Overlay网络 简单来说,二层VLAN网络解决跨主机通信的思路是把原先的网络架构改造为互通的大二层网络,通过特定网络设备直接路由,实现容器点到点的之间通信.这种方案在传输效率上比Overlay网络

  • Docker跨主机容器通信overlay实现过程详解

    同样是两台服务器: 准备工作: 设置容器的主机名 consul:kv类型的存储数据库(key:value) docker01.02上: vim /etc/docker/daemon.json { "hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"], 这行改了要修改自己的docker配置文件 "cluster-store": "consul://10

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

    一 容器间通信 1.容器的网络共享 处于这个模式下的docker容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信. 使用于web服务器与应用服务器之间的通信. ##清空实验环境 [root@server1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ##默认网络创建容器 [root@server1 ~]# docker run -it --name vm1 ubuntu

  • 详解docker容器间通信的一种方法

    以我的ghost博客为例进行说明,我在VPS上用docker启动了两个ghost博客,还有一个Nginx做反向代理,将两个域名分别指向两个博客. docker启动命令 ghost: docker run -e NODE_ENV=production --name ghost1 -v /path/to/data/ghost/ghost1/:/var/lib/ghost -d ghost docker run -e NODE_ENV=production --name ghost2 -v /path

  • docker容器间进行数据共享的三种实现方式

    目录 一.Bind Mounts方式共享数据 二.Volumes方式数据共享 三.Volume container(数据卷容器)方式 3.1.创建数据卷容器 3.2.使用数据卷容器 我们本节为大家介绍的容器数据共享,是指在同一台服务器宿主机的容器之间的数据共享.如果涉及到跨服务器容器的数据共享,实际上是涉及到服务器之间的数据同步或分布式文件系统,基本不属于docker技术范畴. 一.Bind Mounts方式共享数据 使用下面的命令行启动一个容器,名称是nginx80,宿主机映射端口是80 do

  • docker容器通过ping直接运行获取公网IP操作

    通过容器获取本机的公网ip 可以用本地IP 多服务注册中心 把命令改居ping 执行可以拿到不同的服务器信息 public static String getIfconfigIP() { BufferedReader in = null; String outline = ""; // timeOut window为ms linux 为s Runtime r = Runtime.getRuntime(); // 将要执行的ping命令,此命令是windows格式的命令 String p

  • 在docker容器中使用非root用户执行脚本操作

    应用容器化之后,在docker容器启动时,默认使用的是root用户执行命令,因此容器中的应用默认都是使用root用户来运行的,存在很高的安全风险,那么如何能够使用非root的业务用户来运行应用呢, 下面我将举一个简单的例子来说明. 该例子是在容器中使用自建的用户来运行一个简单的shell脚本,并将脚本输出日志持久到容器外部.接下来让我们来看从制作镜像到容器运行的全过程吧. 1.构建镜像: 我将会使用dockerfile的方式来构建镜像,基础镜像使用ubuntu 14.04(需要先拉取该镜像,do

  • Docker容器间通讯直接路由方式实现网络通讯

    概述 就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要.再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题.本文就来尝试一下. 此时两台主机上的Docker容器如何直接通过

  • Docker容器跨主机通信overlay网络的解决方案

    目录 一.Docker主机间容器通信的解决方案 二.Docker Overlay Network 三.使用键值存储搭建Docker主机集群 4.1 系统环境 4.2 安装Consul 4.3 节点配置Dockre守护进程连接Consul 4.4 查看consul 中的节点信息 4.5 创建overlay网络 4.6 使用overlay网络启动容器 一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvl

随机推荐