CONTENTS
1、容器之间网络通信
(1)通常情况下Docker使用网桥(bridge)与NAT进行通信,通信模式可以参考下图
(2)我们可以查看安装docker的服务器的ip,有一张docker0的网卡,可以理解它就是docker容器之间通信的网桥 。我们之前创建的docker默认的网关都指向它,
比如我们运行一个tomcat的容器,查看它的详细信息:
docker run --name tomcat -p 80:8080 -d tomcat:v1
docker inspect tomcat
(3)默认我们创建的容器之间是可以互相通信的,因为它们都指向同一个网桥。例如我运行两个容器,测试它们之间的连通性。默认是互通的。
(4)容器访问外部网络其实是在防火墙上做了SNAT转换。外部网络访问容器是做DNAT转换。这个在防火墙规则上可以看到。
#SNAT
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
#DNAT
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
2、docker网络模式修改
(1)docker进程网络修改(以下可以作为了解,现实中也很少用到)
- -b, --bridge=" ” 指定Docker 使用的网桥设备,默认情况下Docker 会自动创建和使用docker0 网桥设备,通过此参数可以使用已经存在的设备
- --bip 指定Docker0的IP和掩码,使用标准的CIDR 形式,如10.10.10.10/24
- --dns 配置容器的DNS,在启动Docker 进程是添加,所有容器全部生效
(2)docker容器网络修改
- --dns 用于指定启动的容器的DNS
- --net 用于指定容器的网络通讯方式,有以下四个值(最常用还是前两个,可以自己尝试下)
➢bridge:Docker 默认方式,网桥模式
➢none:容器没有网络栈
➢container:使用其它容器的网络栈,Docker容器会加入其它容器的network namespace
➢host:表示容器使用Host 的网络,没有自己独立的网络栈。容器可以完全访问Host 的网络,不安全
(3)docker端口暴露 -p/P选项说明
- -p :<ContainerPort> 将制定的容器端口映射至主机所有地址的一个动态端口
- -p <HostPort>:<ContainerPort> 映射至指定的主机端口
- -p <IP>::<ContainerPort> 映射至指定的主机的IP 的动态端口
- -p <IP>:<HostPort>:<ContainerPort>映射至指定的主机IP的主机端口
- -P (大)p: 暴露所需要的所有端口
(4)docker0网桥的网络地址配置(这个也可以了解,很少去修改这个的)
3、网络隔离,独立ip配置
(1)常见的网络配置命令:
docker network ls #查看当前可用的网络类型
docker network create -d 类型 namespace
类型有:overlay network
bridge network(常见的)
(2)实现网络隔离
比如我们现在要创建两个容器,使他们之间互相隔离,那么我们就要线创建两个不同namespace的网络,然后运行两个容器指向不同namespace的网络便可实现隔离。如下:
docker network ls
docker network create -d bridge LAMP
docker network create -d bridge LNMP
(3)建立网桥进行主机间通信
docker0这个网桥并不能让外界主机与docker之间进行通信,你可以试一下,真机ping一下docker是ping不通的
下面我们就建立网桥使之具有独立的ip,实现与外界主机通信。
1)编辑网卡配置文件
cp ifcfg-ens37 ifcfg-br0
#编辑ens37网卡文件
vim ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
BRIDGE=br0
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPV6_PRIVACY=no
#编辑网桥文件
vim ifcfg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=10.1.1.100
prefix=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPV6_PRIVACY=no
#重启网络
systemctl restart network
2)利用pipework工具设置容器ip地址
yum install git -y
git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin/
chmod a+x /usr/local/bin/pipework
docker run --name tomcat3 --net=none -d tomcat:v1
pipework br0 tomcat3 10.1.1.200/24
3)现在外界主机就可以和容器实现通信了
并且可以访问到tomcat:
完成今日份打卡!欧力给!