Docker 容器的网络模式介绍

默认的三种网络模式:

  1. bridge:桥接模式
  2. host:主机模式
  3. none:无网络模式

查看网络模式:docker network ls


Docker 容器的bridge模式实战演练

桥接模式是docker 的默认网络设置,当Docker服务启动时,会在主机上创建一个名为docker0的虚拟网桥(在宿主机上执行:ip addr,可以看到),并选择一个和宿主机不同的IP地址和子网分配给docker0网桥
桥接拓扑图:

          Docker网络模式与特权指令_docker

 

安装工具:

  1. yum -y install net-tools  //容器安装 ,  查看路由模式:route -n 
  2. yum install -y bridge-utils  // 宿主机安装。查看桥接情况: brctl show

                 Docker网络模式与特权指令_Docker_02

所以物理机外部网络无法访问到容器的ip,所以启动容器的时候只能通过端口映射,让外界访问

Docker 容器的host主机网络模式

host 模式:该模式下容器是不会拥有自己的ip地址,而是使用宿主机的ip地址和端口。没有NAT,性能比桥接模式好,但是如果端口占用,就不能用了

           Docker网络模式与特权指令_Docker_03

启动nginx容器命令并防火墙放开80端口:

  1. docker run -itd --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
  2. firewall-cmd --state //查看防火墙状态
  3. netstat -tunlp | grep 80 // 查看80 端口被谁占用
  4. firewall-cmd --zone=public --add-port=80/tcp --permanent  // 开放80端口
  5. firewall-cmd --reload  //重新加载
Docker 容器的none关闭网络模式介绍

none模式:关闭模式,无法连外网
docker run -itd --net=none centos:7 /bin/bash,以none模式启动,查看 ip addr,会发现容器没有地址

Docker 容器间基于Link实现单向通信

单向通信:tomcat向mysql发送数据包,而mysql不需要主动向tomcat发送请求

          Docker网络模式与特权指令_docker_04

启动mysql数据库容器:docker run --name mydb -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
启动tomcat应用容器并link到mysql数据库:docker run -itd --name tomcat1 --link mydb tomcat:tag
        注意:mydb 这个容器一定要存在!

测试 :ping mydb  可以测通,不需要ip,只用名字
官方版的mysql 5.7 需要安装工具才有ping命令: apt-get update && apt-get install iputils-ping

Docker容器间利用brige网桥实现双向通信

执行:docker network ls

[root@localhost ~]# docker network ls
NETWORK ID   NAME    DRIVER  SCOPE
b6875f7a18dc   bridge         bridge  local
aa7e5dc89e49  host            host     local
b6ac4684d54d  my_bridge  bridge  local
2d1450c05ce0  none           null       local
创建一个新的网桥:docker network create -d bridge my_bridge
启动第一个容器:docker run -itd --name tomcat centos:7
启动第二个容器:docker run -itd --name redis centos:7
把第一个容器加入网桥:docker network connect my_bridge tomcat
把第二个容器加入网桥:docker network connect my_bridge redis
最后分别进入俩个容器中进行验证:docker exec -it 容器id /bin/bash   ping tomcat;  ping redis;

Docker容器特权模式介绍
  1. 启动一个普通的容器:docker run -itd --name mycentos centos:7 /bin/bash
  2. 安装网络工具:yum -y install net-tools
  3. 执行route -n  查看路由
  4. 删除网关:route del default gw 172.17.0.1  //提示没有权限
  5. 启动拥有特权模式的容器:docker run -itd --privileged=true --name mycentos1 centos:7 /bin/bash
  6. 进入容器:docker exec -it ef /bin/bash
  7. 删除网关:route del default gw 172.17.0.1 // 成功
  8. 备注:特权模式用的比较少
Docker核心知识之Volume数据共享

使用dockerfile设置挂载点。注意:在dockerfile里设置volume是无法修改宿主机的挂载路径的,只能在启动容器通过-v重新设置

dockerfile

FROM centos:7
VOLUME ["/usr/local"]  // 设置挂载点

构建镜像:docker build -t centos:v1 .

启动容器,查看容器详情,可以看到mou'ns里的source,宿主机的路径是无法修改的,用-v启动有两个挂载点

使用volume容器共享创建nginx集群:在nginx的html页面,修改宿主机页面,启动容器,其他容器的都可以看到

创建nginx1  -v 宿主机的路径和容器的路径

docker run -itd -p 8080:80 -v /usr/local/nginx/html:/usr/local/nginx/html --name nginx1 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"


创建nginx2:使用--volumes-from 实现容器与容器之间volume共享

docker run -itd -p 8081:80 --volumes-from nginx1 --name nginx2 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"


创建nginx3:使用--volumes-from 实现容器与容器之间volume共享

docker run -itd -p 8082:80 --volumes-from nginx1 --name nginx3 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"


对/usr/local/nginx/html/index.html进行修改,打开浏览器进行访问测试
使用docker inspect 容器ID 可以查看详细的挂载信息