Docker - 容器直连
本文是在原文基础上的实际操作验证记录和细节补充。
默认情况下,容器连接到虚拟网桥docker0提供的虚拟子网中,容器之间通过默认网关(虚拟网桥docker0接口地址)建立连接。
如果不使用虚拟网桥,用户也可以通过创建两个容器间的点到点链路,将一对peer接口分别放到两个容器,来实现容器直连。
容器的直连链路不需要子网和子网掩码。
1 - 启动容器
[root@CentOS-7 ~]# docker run -it -d --net=none --name node-A centos /bin/bash
2c5683fbdf0880271013357e9a40b7549ad1c570c855bf591341ad7e7ac3f64e
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker run -it -d --net=none --name node-B centos /bin/bash
33c209f70d0b5d48963793873088006349133652190d86444417b408830fd20d
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33c209f70d0b centos "/bin/bash" 2 minutes ago Up 2 minutes node-B
2c5683fbdf08 centos "/bin/bash" 2 minutes ago Up 2 minutes node-A
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1d732a1c4f67 bridge bridge local
2e217e480705 host host local
c31d9a1acfc0 none null local
[root@CentOS-7 ~]# docker network inspect none
[
{
"Name": "none",
"Id": "c31d9a1acfc0b2ef806bef75c492b77189c32ae21bdca4eeef709b015ba95923",
"Scope": "local",
"Driver": "null",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": []
},
"Internal": false,
"Containers": {
"2c5683fbdf0880271013357e9a40b7549ad1c570c855bf591341ad7e7ac3f64e": {
"Name": "node-A",
"EndpointID": "73131ca12a7f7c1e036f7dcb26eb7d6d50f315767db1eddd829a89d45f4b17a3",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
},
"33c209f70d0b5d48963793873088006349133652190d86444417b408830fd20d": {
"Name": "node-B",
"EndpointID": "0be67083bf14916b3accfbf9641c9099a69f8b7597a53eeeb88659315e193117",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@CentOS-7 ~]#
如果不指定"--net=none", 容器可以使用默认bridge网络通信。
2 - 根据进程ID创建网络名称空间跟踪文件
[root@CentOS-7 ~]# pid_A=`docker inspect -f '{{.State.Pid}}' node-A`
[root@CentOS-7 ~]# pid_B=`docker inspect -f '{{.State.Pid}}' node-B`
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# mkdir -p /var/run/netns
[root@CentOS-7 ~]# ln -s /proc/$pid_A/ns/net /var/run/netns/$pid_A
[root@CentOS-7 ~]# ln -s /proc/$pid_B/ns/net /var/run/netns/$pid_B
[root@CentOS-7 ~]#
3 - 创建peer接口并配置路由
[root@CentOS-7 ~]# ip link add node-A type veth peer name node-B
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# ip link set node-A netns $pid_A
[root@CentOS-7 ~]# ip netns exec $pid_A ip addr add 10.1.1.1/32 dev node-A
[root@CentOS-7 ~]# ip netns exec $pid_A ip link set node-A up
[root@CentOS-7 ~]# ip netns exec $pid_A ip route add 10.1.1.2/32 dev node-A
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# ip link set node-B netns $pid_B
[root@CentOS-7 ~]# ip netns exec $pid_B ip addr add 10.1.1.2/32 dev node-B
[root@CentOS-7 ~]# ip netns exec $pid_B ip link set node-B up
[root@CentOS-7 ~]# ip netns exec $pid_B ip route add 10.1.1.1/32 dev node-B
[root@CentOS-7 ~]#
4 - 验证
容器可以相互ping通和建立连接。
[root@CentOS-7 ~]# docker attach node-A
[root@2c5683fbdf08 /]#
[root@2c5683fbdf08 /]# ip addr show |grep node-A
83: node-A@if82: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.1.1.1/32 scope global node-A
[root@2c5683fbdf08 /]#
[root@2c5683fbdf08 /]# ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.113 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=0.106 ms
^C
--- 10.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.106/0.109/0.113/0.011 ms
[root@2c5683fbdf08 /]# ping 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.180 ms
64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=0.110 ms
^C
--- 10.1.1.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.110/0.133/0.180/0.034 ms
[root@2c5683fbdf08 /]# [root@CentOS-7 ~]#
[root@CentOS-7 ~]#
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker attach node-B
[root@33c209f70d0b /]#
[root@33c209f70d0b /]# ip addr show |grep node-B
82: node-B@if83: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.1.1.2/32 scope global node-B
[root@33c209f70d0b /]#
[root@33c209f70d0b /]# ping 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.113 ms
64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=0.084 ms
^C
--- 10.1.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.084/0.098/0.113/0.017 ms
[root@33c209f70d0b /]#
[root@33c209f70d0b /]# ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.189 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=0.122 ms
^C
--- 10.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.122/0.155/0.189/0.035 ms
[root@33c209f70d0b /]# [root@CentOS-7 ~]#
[root@CentOS-7 ~]#
Docker - 容器直连的更多相关文章
- 在docker容器中安装和使用,linux版的powershell
powershell 传教士 原创文章.始于 2016-09-18 ,2016-10-27修改powershell docker官网.允许转载,但必须保留名字和出处,否则追究法律责任 1 在任意版本的 ...
- docker 容器日志集中 ELK + filebeat
docker 容器日志集中 ELK ELK 基于 ovr 网络下 docker-compose.yaml version: '2' networks: network-test: external: ...
- Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)
微服务架构的应用由若干 service 组成.比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 ...
- 通过案例学习 Secret - 每天5分钟玩转 Docker 容器技术(110)
在下面的例子中,我们会部署一个 WordPress 应用,WordPress 是流行的开源博客系统. 我们将创建一个 MySQL service,将密码保存到 secret 中.我们还会创建一个 Wo ...
- k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)
在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这 ...
- DNS 访问 Service - 每天5分钟玩转 Docker 容器技术(138)
在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问. kubeadm 部署时会默认安装 kube-dns 组件. ...
- docker容器的时间同步
好久没写博客了,有时间开始陆续整理一下工作中遇到的问题,今天罗列一下docker容器的时间同步问题 我们每次在run容器的时候,会存在时区不同的问题,这样对数据处理会有很大障碍,操作如下: 第一种方式 ...
- docker容器持久化卷讲解
docker容器自身存储数据效率比较低,因此我们为了提高磁盘IO的性能等,需要在容器中挂载一个外部存储设备.关于讲解大致如下: Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中 ...
- Docker容器学习与分享10
Docker容器向外提供服务 用分享04中的Nginx服务来试一下. 不过这次我直接用Nginx镜像创建容器,先下载Nginx镜像. [root@promote ~]# docker search n ...
随机推荐
- Cesium原理篇:3D Tiles(3)个人总结
个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹? 好的方面 数据规范 我非常喜欢glTF的整体设计,概括有四点:第一,数据块(B ...
- 关于修改编JDK编译环境的问题
最近从svn下拿的代码本地编译测试总是会出一个Unsupported major.minor version 51.0...的问题,出现这样的问题基本上都是因为JDK版本的问题,由于高版本JDK编译的 ...
- 【已解决】Windows下 MySQL大小写敏感 解决方案及分析
Windows下 MySQL大小写敏感配置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-3-27 最近在window ...
- 【原】Linux设备网络硬件管理
遇到网络问题时候,一般情况下,我们第一反应是查找软件方面问题,但排查之后,软件没有问题的时候,我们就需要排查硬件方面工作是否正常. 我们可能需要查询网卡设备本身的状态,查询网卡是否有数据包发送接收: ...
- PHPCMSV9上线方法及文件权限设置
上线步骤: a.替换代码和数据库文件内的域名b.修改cache/configs/database.php中的数据库密码c.修改cache/configs/system.php文件中的网站路径变量 'w ...
- js实现文本框溢出文字用省略号(...)表示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- ubuntu12.04下编译chrome
1,直接下载压缩包: http://chromium-browser-source.commondatastorage.googleapis.com/chromium_tarball.html 2,安 ...
- activiti 5.15.1 动态手动通过java编码方式,实现创建用户任务,动态指定个人,用户组,角色,指定监听的实现
因为我们的业务需要,最近一直在搞动态动过java程序实现为用户任务绑定监听程序.碰了很多壁,查看了API文档,最后终于在找到解决办法,所以贴出来,希望能够留个底,也能帮助有需要的人. -------- ...
- JavaScript Array 技巧
filter():返回该函数会返回true的项组成的数组 ,,,,]; var result = num.filter(function(item,index,array){ ); }) consol ...
- node.js 中模块的循环调用问题详解
首先,我们看一下图示代码,每一个注释其实代表一个 js 文件.所以下面其实是三个 js 文件 .第一个是我们要运行的 main 文件,后面两个是 a, b 文件. 从上面可以看书 a ,b 两个模 ...