默认的三种网络模式:
- bridge:桥接模式
- host:主机模式
- none:无网络模式
查看网络模式:docker network ls
Docker 容器的bridge模式实战演练
桥接模式是docker 的默认网络设置,当Docker服务启动时,会在主机上创建一个名为docker0的虚拟网桥(在宿主机上执行:ip addr,可以看到),并选择一个和宿主机不同的IP地址和子网分配给docker0网桥
桥接拓扑图:
安装工具:
- yum -y install net-tools //容器安装 , 查看路由模式:route -n
- yum install -y bridge-utils // 宿主机安装。查看桥接情况: brctl show
所以物理机外部网络无法访问到容器的ip,所以启动容器的时候只能通过端口映射,让外界访问
Docker 容器的host主机网络模式host 模式:该模式下容器是不会拥有自己的ip地址,而是使用宿主机的ip地址和端口。没有NAT,性能比桥接模式好,但是如果端口占用,就不能用了
启动nginx容器命令并防火墙放开80端口:
- docker run -itd --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
- firewall-cmd --state //查看防火墙状态
- netstat -tunlp | grep 80 // 查看80 端口被谁占用
- firewall-cmd --zone=public --add-port=80/tcp --permanent // 开放80端口
- firewall-cmd --reload //重新加载
none模式:关闭模式,无法连外网
docker run -itd --net=none centos:7 /bin/bash,以none模式启动,查看 ip addr,会发现容器没有地址
单向通信:tomcat向mysql发送数据包,而mysql不需要主动向tomcat发送请求
启动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 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 run -itd --name mycentos centos:7 /bin/bash
- 安装网络工具:yum -y install net-tools
- 执行route -n 查看路由
- 删除网关:route del default gw 172.17.0.1 //提示没有权限
- 启动拥有特权模式的容器:docker run -itd --privileged=true --name mycentos1 centos:7 /bin/bash
- 进入容器:docker exec -it ef /bin/bash
- 删除网关:route del default gw 172.17.0.1 // 成功
- 备注:特权模式用的比较少
使用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 可以查看详细的挂载信息