二、--link与自定义网络
时间:2021-09-27
本文章向大家介绍二、--link与自定义网络,主要包括二、--link与自定义网络使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
--link(不推荐使用)
思考一个场景,我们编写了一个微服务,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以用名字来访问?
1.启动两个容器如下
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79bec4d5841a centos "/bin/bash" 28 minutes ago Up 28 minutes centos02
95937ebb5ce8 centos "/bin/bash" 29 minutes ago Up 29 minutes centos01
[root@docker ~]# docker exec -it centos01 ping centos02
ping: centos02: Name or service not known
我们发现不能ping通:
解决办法--link即可解决连接问题,但是反向连接不能ping通
[root@docker ~]# docker run -d -it --name centos03 --link centos01 --link centos02 centos
ed7e71239e34507cd1aa32590df51f0a0fdc335d7d9ef6503c170197fb1ab92e
[root@docker ~]# docker exec -it centos03 ping centos01
PING centos01 (172.17.0.2) 56(84) bytes of data.
64 bytes from centos01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from centos01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.043 ms
可以查看网卡信息
[root@docker ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "219769a742011931a0b08b03fc00f6135ad1bcabce1cfa93bc68902b532a2a3b",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Containers": {
"79bec4d5841a7f4bba483e0a0107383eea759d863ade5c6bf0d2c7cdf5693950": {
"Name": "centos02",
"EndpointID": "0e862a4d7bd09adaed475d9844af2d72a07a412b72534bfdac107af42b9991ef",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"95937ebb5ce8d7571232306218f44d7da65dc6e9aa8b901e8c156315199ec759": {
"Name": "centos01",
"EndpointID": "4ed26158cd299b9d834e9b90142e1131e62f0c107124f7c4babd54fa3fa58962",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"ed7e71239e34507cd1aa32590df51f0a0fdc335d7d9ef6503c170197fb1ab92e": {
"Name": "centos03",
"EndpointID": "a2eacc59f98083eccfa2ce4f8b00f7d311ab056cd0118b0bdbaad0c88cbbbcf5",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
探索 inspect
其实这个centos03就是配置了centos01-02的配置
#查看hosts配置, 在这里原理发现
[root@docker ~]# docker exec -it centos03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 centos01 95937ebb5ce8
172.17.0.3 centos02 79bec4d5841a
172.17.0.4 ed7e71239e34
本质探究:--link操作就是在hosts配置中增加了一个centos01-2的映射
在真实项目中已经不建议使用--link了
在实际中我们采用自定义网络,不使用docker0
docker的问题:它不支持容器名连接访问
自定义网络
[root@docker ~]# docker network ls #查看所有网卡
docker network rm 删除网卡
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
219769a74201 bridge bridge local
f6b9d84b1f81 host host local
47132fb890ac none null local
网络模式
bridge :桥接(默认,自己创建网络也推荐使用bridge模式)
none: 不配置网络
host: 和宿主机共享网络
container: 容器网络连通!(使用较少!局限性很大)
测试:
#我们直接启动的命令 --network bridge ,而这个就是我们的docker0
[root@docker ~]# docker run -d -P --name centos1 --network bridge centos
#docker0 :默认,域名不能访问,使用--link可以打通连接
#我们可以自定义一个网络
[root@docker ~]# docker network create --help #帮助命令查看
[root@docker ~]# docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 mynet
2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
219769a74201 bridge bridge local
f6b9d84b1f81 host host local
2bb4bf4c0539 mynet bridge local
47132fb890ac none null local
参数讲解:
--driver bridge :指定模式为桥接
--subnet: 子网地址
--gateway: 网关
[root@docker ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
至此我们自己的网络就创建好了
接下来启动两个容器测试:
[root@docker ~]# docker run -d -it -P --name cenos01 --network mynet centos
0f928c84f9f4615e432198d78a5e72062334041117b5b74ce66e327422dc6f78
[root@docker ~]# docker run -d -it -P --name cenos02 --network mynet centos
6dcaf8d1698263309bb87d5f535981679e73958f7cb63d2fe69a9a3fa74d6808
[root@docker ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Containers": {
"0f928c84f9f4615e432198d78a5e72062334041117b5b74ce66e327422dc6f78": {
"Name": "cenos01",
"EndpointID": "c6a6451c319156074642e6c26d7305977c7619bd5fe3faeac1bab656dc7c81e5",
"MacAddress": "02:42:c0:a8:01:02",
"IPv4Address": "192.168.1.2/24",
"IPv6Address": ""
},
"6dcaf8d1698263309bb87d5f535981679e73958f7cb63d2fe69a9a3fa74d6808": {
"Name": "cenos02",
"EndpointID": "9346da6d8559ae555dd47a40e4f2c56e8d59f7b7d2fba674ec95f1eaac26d9ba",
"MacAddress": "02:42:c0:a8:01:03",
"IPv4Address": "192.168.1.3/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
#再次测试ping连接不使用--link也可以ping名字ping通
[root@docker ~]# docker exec -it cenos01 ping cenos02
PING cenos02 (192.168.1.3) 56(84) bytes of data.
64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=3 ttl=64 time=0.070 ms
我们 自定义的网络docker都已经帮我们维护好了对应的关系推荐使用自定义网络
好处:保证不同的集群使用不同的网络,保证集群是安全和健康的
原文地址:https://www.cnblogs.com/momo6656/p/15342975.html
- ShellExecute 启动外部程序 参数详细介绍
- 零基础学编程033:字符串的split拆分与join连接
- 零基础学编程032:生成二维码
- C#,一些非常简单但应该知道的知识点
- C#神奇的扩展方法
- 使用Python制作一个简单的刷博器
- 零基础学编程031:Python与其它语言最不同的一条语法规则
- dedecms批量导出新增文章url和标题
- 明理知意:复合索引优化及索引访问原理
- WCF配置文件与文件下载之坎坷路
- 零基础学编程030:像黑客般玩玩字符艺术
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小
- 零基础学编程029:程序员作图不用笔
- 零基础学编程028:面向对象编程OOP
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 从别人的代码中学习golang系列--03
- Flink写出数据到HBase的Sink实现
- 「MoreThanJava」Day 4:面向对象基础
- RTSP协议视频平台EasyNVR接入EasyNVS通道不显示任何数据怎么处理?
- RTSP协议视频平台EasyNVR接入视频综合管理平台EasyNVS可以自由修改配置吗?
- 使用Azure人脸API对图片进行人脸识别
- 视频综合管理平台EasyNVS显示的rtsp和rtmp穿透地址错误如何解决?
- 开发RTSP协议视频平台EasyNVR采用ffmpeg集成fdk-aac报no member named “encoderDelay”
- 微信小程序开发实战(17):用画布画一张笑脸
- PHP中Session ID的实现原理分析和实例解析
- 【好文推荐】黑莓OS手册是如何详细阐述底层的进程和线程模型的?
- 简析Spark Streaming/Flink的Kafka动态感知
- 微信小程序开发实战(19):页面导航
- Kotlin:02-函数的声明
- 「MoreThanJava」Day 5:面向对象进阶—继承详解