Docker系列7 - Docker网络模式

系列文章
Docker系列1 - CentOS7 安装Docker
Docker系列2 - Docker常用命令
Docker系列3 - Docker文件系统及搭建Docker私服
Docker系列4 - 在Docker中测试MySQL主从数据库
Docker系列5 - 在Docker中测试Redis集群
Docker系列6 - Dockerfile简介


Docker网络模式

Docker网络:容器IP变动时,可以通过服务名直接网络通信而不受到影响 (docker容器内部的IP是有可能会发生改变的)

docker network ls

#创建删除网络
docker network create test_network
docker network ls

#驱动默认是bridge
docker network inspect test_network
docker network rm test_network

常用的网络模式

  1. bridge:为每一个容器分配、设置IP等,并将容器连接到docker0(默认模式)
  2. host:虚拟器不会虚拟出自己的网卡,而是使用宿主机的IP和端口
  3. container:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等

Docker服务默认会创建一个docker0网桥,它在内核层连通了其它的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络
Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信

docker network inspect bridge
docker network inspect host
docker network inspect none
#关闭所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

#删除所有容器
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

#删除所有镜像(慎用)
docker rmi $(docker images | awk '{print $3}' |tail -n +2)

docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8

#在主机上查看ip
ip addr
#veth和eth0配对(40<==>39, 42<==>41)
40: veth0a3e4a3@if39
42: vethee89f7d@if41

#在容器内部查看ip
docker exec -it tomcat81 /bin/bash
ip addr
39: eth0@if40

host模式

host模式直接使用宿主机的IP地址也外界进行通信,不再需要额外进行NAT转换

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

#docker启动时指定--network host 同时指定了-p映射端口,会有此警告,且通过-p设置的参数不会起作用;端口号会以主机端口号为主,重复时则递增
#WARNING: Published ports are discarded when using host network mode
docker ps
curl http://127.0.0.1:8080

docker rm -f tomcat83
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8

#查看Networks中的IPAddress、Gateway
docker inspect tomcat83
docker inspect tomcat81

#host模式,在容器内部查看IP,和在主机中查看IP是一样的
docker exec -it tomcat83 /bin/bash
ip addr

none模式

none模式:禁用网络功用(不为Docker容器进行任何网络配置),只有lo标识(就是127.0.0.1表示本地回环)

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
docker inspect tomcat84 | tail -n 20
docker exec -it tomcat84 /bin/bash
ip addr

container模式

container:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等

docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat85 billygoo/tomcat8-jdk8
#docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
#相当于tomcat86和tomcat85公用同一个ip同一个端口,导致端口冲突
docker rm -f tomcat85

docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh

#在alpine1、alpine2中查看ip(公用同一个ip)
ip addr

#停掉alpine1,查看alpine2的ip
docker stop alpine1
#在alpine2中查看ip,此时alpine2没有内网的ip地址了
ip addr

自定义网络

#删除所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

ip addr

#使用默认的网络
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8

docker exec -it tomcat81 /bin/bash
ip addr

docker exec -it tomcat82 /bin/bash
ip addr
ping 172.17.0.3
ping 172.17.0.2

#无法使用服务名ping通
ping tomcat81
ping tomcat82


#创建自定义网络
docker network create test_network

docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker run -d -p 8081:8080 --network test_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network test_network --name tomcat82 billygoo/tomcat8-jdk8

docker exec -it tomcat81 /bin/bash
ip addr

docker exec -it tomcat82 /bin/bash
ip addr
ping 172.17.0.3
ping 172.17.0.2

#可以使用服务名ping通
ping tomcat81
ping tomcat82
#64 bytes from tomcat82.test_network (172.18.0.3)

结论:自定义网络本身就维护好了主机名和IP的对应关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GalenZhang888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值