

Docker 网络
理解Docker
清空下前面的docker 镜像、容器
# 删除全部容器 $ docker rm -f $(docker ps -aq) # 删除全部镜像 $ docker rmi -f $(docker images -aq)测试
三个网络
问题: docker 是如果处理容器网络访问的?
原理
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术!
再次测试 ip addr
2 、再启动一个容器测试,发现又多了一对网络
3、我们来测试下tomcat01和tomcat02是否可以ping通
# 获取tomcat01的ip 172.17.0.2 $ docker-tomcat docker exec -it tomcat01 ip addr 550: eth0@if551: <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 link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever # 让tomcat02 ping tomcat01 $ docker-tomcat docker exec -it tomcat02 ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.098 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.071 ms # 结论:容器和容器之间是可以互相ping通网络模型图
结论:tomcat01和tomcat02公用一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
小结
Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0
Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥一对就没了!
思考一个场景:我们编写了一个微服务,database url=ip: 项目不重启,数据ip换了,我们希望可以处理这个问题,可以通过名字来进行访问容器?
–-link
$ docker exec -it tomcat02 ping tomca01 # ping不通 ping: tomca01: Name or service not known # 运行一个tomcat03 –link tomcat02 $ docker run -d -P –name tomcat03 –link tomcat02 tomcat 5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef # 3连接2 # 用tomcat03 ping tomcat02 可以ping通 $ docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.080 ms # 2连接3 # 用tomcat02 ping tomcat03 ping不通探究:
docker network inspect 网络id 网段相同
Name不同,但是IPv4Address是相同的docker inspect tomcat03
“Links”: [ “/tomcat02:/tomcat03/tomcat02” ],查看tomcat03里面的/etc/hosts发现有tomcat02的配置
$ docker-tomcat docker exec tomcat03 cat /etc/hosts–link 本质就是在hosts配置中添加映射
现在使用Docker已经不建议使用–link了!
自定义网络,不适用docker0!
docker0问题:不支持容器名连接访问!
自定义网络
docker network connect — Connect a container to a network create — Creates a new network with a name specified by the disconnect — Disconnects a container from a network inspect — Displays detailed information on a network ls — Lists all the networks created by the user prune — Remove all unused networks rm — Deletes one or more networks查看所有的docker网络
$ docker network ls网络模式
bridge :桥接 docker(默认,自己创建也是用bridge模式)
none :不配置网络,一般不用
host :和所主机共享网络
container :容器网络连通(用得少!局限很大)
测试
# 我们直接启动的命令 –net bridge,而这个就是我们的docker0 # bridge就是docker0 $ docker run -d -P –name tomcat01 tomcat # 上面等价于下面呢这一个 docker run -d -P –name tomcat01 –net bridge tomcat # docker0,特点:默认,域名不能访问。 –link可以打通连接,但是很麻烦! # 我们可以 自定义一个网络 $ docker network create –driver bridge –subnet 192.168.0.0/16 –gateway 192.168.0.1 mynet $ docker network inspect mynet;启动两个tomcat,再次查看网络情况
$ docker run -d -P –name tomcat-net-01 –net mynet tomcat $ docker run -d -P –name tomcat-net-02 –net mynet tomcat $ docker network inspect mynet;在自定义的网络下,服务可以互相ping通,不用使用–link
$ docker exec tomcat-net-02 ping tomcat-net-01 $ docker exec tomcat-net-01 ping tomcat-net-02我们自定义的网络docker当我们维护好了对应的关系,推荐我们平时这样使用网络!
好处:
redis -不同的集群使用不同的网络,保证集群是安全和健康的
mysql-不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!
实战:部署Redis集群
docker搭建redis集群完成!
我们使用docker之后,所有的技术都会慢慢变得简单起来!
SpringBoot微服务打包Docker镜像
1、构建SpringBoot项目
2、打包运行
mvn package3、编写dockerfile
FROM java:8 COPY *.jar /app.jar CMD [“–server.port=8080”] EXPOSE 8080 ENTRYPOINT [“java”,”-jar”,”app.jar”]4、构建镜像
# 1.复制jar和DockerFIle到服务器 # 2.构建镜像 $ docker build -t xxxxx:xx .5、发布运行
以后我们使用了Docker之后,给别人交付就是一个镜像即可!
暂无评论内容