Docker入门到精通(五)
一、Docker网络
1:理解Docker0
★ip addr(查看相关网络信息)
思考:Docker是如何处理容器网络访问的?
// 运行一个Tomcat镜像
docker run -d -P --name tomcat01 tomcatnet:2.0
// 查看容器内部网络地址
★docker exec -it 容器ID ip addr
发现容器启动的时候会得到一个,“eth0@if31”IP地址,docker分配的!
思考,Linux能不能ping通容器内部?是可以ping通的。
Linux可以ping通docker容器内部!!!(与docker0,“172.17.0.1”属于同一个网段)
// 原理
(1)我们每启动一个docker容器,docker就会给docker容器分配一个IP,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!
(2)在启动一个容器测试,发现又多了一对网卡
docker run -d -P --name tomcat02 tomcatnet:2.0
1)我们发现这个容器带来网卡,都是一对对的。
2)evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。
3)正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的。
4)OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术。
(3)容器与容器之间是否可以ping通?当然可以!同一个网段!
// 绘制网络连接图
结论:tomcat01与tomcat02是共用的一个路由器docker0,所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP。
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0。Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!只要容器删除,对应网桥一对就消失了。
2:容器互联link,容器互联(不建议)
思考一个场景,我们编写了一个微服务,database url=ip,项目不重启,数据库IP换掉了,我们希望可以处理这个问题,可以使用名字来进行访问容器吗?
★docker exec -it tomcat01 ping tomcat02(一定ping不通)
docker run -d -P --name tomcat03 --link tomcat02 tomcatnet:2.0
通过--link 就可以解决网络连通问题(但是反向是不可以ping通的)
// 查看网络相关信息docker0
其实这个tomcat03就是在本地配置了tomcat02的配置
--link 就是在我们hosts配置中增加了一个172.17.0.4 tomcat02 db94eba98334
3:自定义网络,容器互联(推荐)
自定义网络,不适用docker0。docker0问题:他不支持容器名连接访问。
★docker network ls(查看所有docker网络信息)
// 网络模式
1)bridge:桥接docker大桥(0.2与0.3通过0.1桥接,默认)
2)none:不配置网络
3)host:和宿主机共享网络
4)container:容器网络连通(用的少!局限性很大)
// 我们直接启动的命令(--net bridge默认参数,就是docker0)
docker run -d -P --name tomcat01 --net bridge tomcatnet:2.0
docker0特点:默认,域名不能访问,--link可以打通连接!(比较麻烦)
// 开始自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
// 解释
driver bridge:桥接
subnet:子网掩码
gateway:默认路由/网关
// tomcat发布到自己的网络里面
docker run -d -P --name tomcat-net-01 --net mynet tomcatnet:2.0
docker run -d -P --name tomcat-net-02 --net mynet tomcatnet:2.0
★docker network inspect mynet(查看mynet相关信息)
// 再次测试ping连接(通过容器名连接,ip也是ok的)
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络。
// 好处
Redis:不同的集群使用不同的网络,保证集群是安全的健康的
Mysql:不同的集群使用不同的网络,保证集群是安全的健康的
4:网络连通
主要实现不同网段下的网络连通
// 准备工作(tomcat01、tomcat02、tomcat-net-01、tomcat-net-02)
// 打通tomcat01到tomcat-net-01网络
★docker network connect mynet tomcat01
★docker network inspect mynet
连通之后就是将tomcat01放到了mynet网络下,一个容器两个IP地址。公网IP与私网IP。
// 开始测试
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!!!
二、SpringBoot打包Docker镜像
(1)构建springboot项目(operate-ticket-0.0.1-SNAPSHOT.jar)
(2)打包应用
(3)编写dockerfile
(4)构建镜像
(5)发布运行
// 编写Dockerfile,上传服务器,构建镜像
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=9090"]
EXPOSE 9090
ENTRYPOINT ["java","-jar","/app.jar"]
// 构建镜像
★docker build -t xcgg666 .(注意后面的”.”)
★docker run -d -P xcgg666
// 开始测试
以后我们使用了Docker之后,给别人交付的就是一个镜像即可!!!