Docker 容器网络概述

要构建具有安全的一致行为的 Web 应用程序,可以使用 Docker 网络特性。根据定义,网络为容器实现了完全隔离。因此,控制应用程序所在的网络很重要。Docker 容器网络为用户提供了这种控制能力。

我们在某个微服务架构的项目中,出于安全隔离微服务进程和外界网络的目的,采用了这种Docker容器网络的解决方案。采用Docker容器网络的好处是,处于同一容器网络的容器之间可以直接通过ip通信,需要开放给外界使用的微服务(例如提供API的服务)只需要创建端口映射就可以被外界访问了,其他没有创建端口映射的服务不会被外界访问,这也实现了一定程度的安全保障。

本文将概述 Docker 引擎交付原生的默认网络行为,介绍默认创建的网络类型,以及如何创建用户定义的网络。

安装docker

apt install docker.io

(安装mysql镜像并使用:)

sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.7sudo docker run -it --net host mysql:5.7 "sh"
mysql -h127.0.0.1 -P3306 -uroot -pxxx

默认网络

安装 Docker 时,它会自动创建 3 个网络。可以使用 docker network ls命令列出这些网络。

ubuntu@VM-0-2-ubuntu:~$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
20e5c73aed87        bridge              bridge              local
5d56423ab009        host                host                local
0523654c5c1f        none                null                local

这 3 个网络包含在 Docker 实现中。运行一个容器时,可以使用 the –net标志指定您希望在哪个网络上运行该容器。您仍然可以使用这 3 个网络。

bridge 网络表示所有 Docker 安装中都存在的 docker0 网络。除非使用 docker run –net=选项另行指定,否则 Docker 守护进程默认情况下会将容器连接到此网络。在主机上使用 ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分。
none 网络在一个特定于容器的网络堆栈上添加了一个容器。该容器缺少网络接口。
host 网络在主机网络堆栈上添加一个容器。您可以发现,容器中的网络配置与主机相同。
用户定义的网络
您可以创建自己的用户定义网络来更好地隔离容器。Docker 提供了一些默认网络驱动程序来创建这些网络。您可以创建一个新 bridge 网络或覆盖一个网络。也可以创建一个网络插件或远程网络并写入您自己的规范中。
您可以创建多个网络。可以将容器添加到多个网络。容器仅能在网络内通信,不能跨网络进行通信。一个连接到两个网络的容器可与每个网络中的成员容器进行通信。当一个容器连接到多个网络时,外部连接通过第一个(按词典顺序)非内部网络提供。

在 Power 上创建一个覆盖 Docker 网络
Docker 默认情况下会创建一个与 docker0网桥对应的 bridge 网络。您也可以创建自己的网络。docker network命令有许多选项可用来管理网络。

下面的示例中我们创建了一个docker网络test-network,并展示了它的属性。最后我们显示了已有的Docker网络,

ubuntu@VM-0-2-ubuntu:~$ sudo docker network create test-network
f9358c6308bad72c877bb1b1a8d8a3fa11ab64f200094d6aa7601bcdfc28a61f
ubuntu@VM-0-2-ubuntu:~$ sudo docker network inspect test-network
[{"Name": "test-network","Id": "f9358c6308bad72c877bb1b1a8d8a3fa11ab64f200094d6aa7601bcdfc28a61f","Created": "2018-07-06T12:08:33.198346843+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.18.0.0/16","Gateway": "172.18.0.1"}]},"Internal": false,"Attachable": false,"Containers": {},"Options": {},"Labels": {}}
]
ubuntu@VM-0-2-ubuntu:~$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
20e5c73aed87        bridge              bridge              local
5d56423ab009        host                host                local
0523654c5c1f        none                null                local
f9358c6308ba        test-network        bridge              local

另外,还可以采用其他一些选项,比如 –subnet、–gateway和 –ip-range。可以使用 docker network – help或 docker network [COMMAND] – help命令查看更多信息。
可以通过在创建容器时显式提及某个网络,从而将该容器连接到该网络。

ubuntu@VM-0-2-ubuntu:~$ sudo docker run -itd --name=test1 --net=test-network yh1.5
2e0b59e469e23d5f0c68f9f5e65c873ae904fef38501724cff93f623f2b10359
ubuntu@VM-0-2-ubuntu:~$ sudo docker network inspect test-network
[{"Name": "test-network","Id": "f9358c6308bad72c877bb1b1a8d8a3fa11ab64f200094d6aa7601bcdfc28a61f","Created": "2018-07-06T12:08:33.198346843+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.18.0.0/16","Gateway": "172.18.0.1"}]},"Internal": false,"Attachable": false,"Containers": {"2e0b59e469e23d5f0c68f9f5e65c873ae904fef38501724cff93f623f2b10359": {"Name": "test1","EndpointID": "4ec720219776316dbec6889fa05ec6d1ad90c9dbdf90e6ef4a91d4ea48818cff","MacAddress": "02:42:ac:12:00:02","IPv4Address": "172.18.0.2/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]

也可以动态地将容器连接到网络。

ubuntu@VM-0-2-ubuntu:~$ sudo docker run -itd --name=test2 yh1.5 /bin/bash
7c26d9880040452e46f6455c32203e67e62d0beec92de23f4e2363f72116df06
ubuntu@VM-0-2-ubuntu:~$ sudo docker network connect test-network test2
ubuntu@VM-0-2-ubuntu:~$ sudo docker network inspect test-network
[{"Name": "test-network","Id": "f9358c6308bad72c877bb1b1a8d8a3fa11ab64f200094d6aa7601bcdfc28a61f","Created": "2018-07-06T12:08:33.198346843+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.18.0.0/16","Gateway": "172.18.0.1"}]},"Internal": false,"Attachable": false,"Containers": {"2e0b59e469e23d5f0c68f9f5e65c873ae904fef38501724cff93f623f2b10359": {"Name": "test1","EndpointID": "4ec720219776316dbec6889fa05ec6d1ad90c9dbdf90e6ef4a91d4ea48818cff","MacAddress": "02:42:ac:12:00:02","IPv4Address": "172.18.0.2/16","IPv6Address": ""},"7c26d9880040452e46f6455c32203e67e62d0beec92de23f4e2363f72116df06": {"Name": "test2","EndpointID": "fc5f17c367ebcfd25f57bd4b1ff7d6c5cc667ccddae97b6e5ce14ea11a64ca28","MacAddress": "02:42:ac:12:00:03","IPv4Address": "172.18.0.3/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]

通过这几种简单的运用方法,就可以创建你想要的Docker容器网络了。我最终使用的Docker容器网络包含了5个运行微服务进程的容易:

ubuntu@VM-0-2-ubuntu:~$ sudo docker network inspect my_net2
[{"Name": "my_net2","Id": "d3585fbc7ac5397730b55bdae577ee9c8f104fa70a9e88a3b77115a52c8f1c22","Created": "2018-05-15T13:34:17.534900215+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.22.16.0/24","Gateway": "172.22.16.1"}]},"Internal": false,"Attachable": false,"Containers": {"0e89eac9e66948504b0a5e3667f94c1cf42b7f82cef8f91e569632e455fe3a75": {"Name": "room","EndpointID": "ea251de5c4948e5c2c80bea7c0873ea94964f42a07fac577921c4ec7f5fafdc2","MacAddress": "02:42:ac:16:10:03","IPv4Address": "172.22.16.3/24","IPv6Address": ""},"291c320ed2505b16b2b8cb98e8eeac773cfc23260e47d22145a121f29a09b013": {"Name": "device2","EndpointID": "95efe521721b2b66ca4dca7381fcc155288d89bd16113d80ca9536ace0c39663","MacAddress": "02:42:ac:16:10:04","IPv4Address": "172.22.16.4/24","IPv6Address": ""},"3efce0715b305d134d4d2f657c80731f00d633281525eb298df9cc176891ac6a": {"Name": "voice","EndpointID": "487936efcdd4161b7eff0aeb08deee76650e9865234d2910c3e2f2448f71bdc9","MacAddress": "02:42:ac:16:10:06","IPv4Address": "172.22.16.6/24","IPv6Address": ""},"67bde5833ac2af4a1599cad257cea705bb221805a5dd4833e9a9947408c80f7a": {"Name": "user","EndpointID": "cf550de3d4cc1e59ce21f954d599b7fd88c640acc3d22469975f14b7ea9ab5e9","MacAddress": "02:42:ac:16:10:05","IPv4Address": "172.22.16.5/24","IPv6Address": ""},"d4a4b1be541cbe6cdc3112a2d9fe3f0bc02c4b25480fb93d71dba117f44b3d23": {"Name": "proxy","EndpointID": "e887e3e6ffed87427e3837f64e65a539e66e2984d620ee0c93686080dfca8f47","MacAddress": "02:42:ac:16:10:02","IPv4Address": "172.22.16.2/24","IPv6Address": ""}},"Options": {},"Labels": {}}
]

转载于:https://www.cnblogs.com/liangf27/p/9356838.html

Docker网络实践运用相关推荐

  1. 蚂蚁金服Docker网络技术实践

    以下内容根据演讲PPT以及现场分享整理而成. 主要内容提纲 一.docker网络分析 二.docker网络插件开发 三.蚂蚁金服的网络插件实践 一.docker网络分析 主要介绍三种docker网络, ...

  2. Docker网络解决方案-Flannel部署记录

    Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico实现跨主机容器间的通信.其中Pipework.Weave. ...

  3. Docker网络和服务发现

    [编者的话] 本文是<Docker网络和服务发现>一书的全文,作者是Michael Hausenblas.本文介绍了Docker世界中的网络和服务发现的工作原理,并提供了一系列解决方案. ...

  4. Docker教程(三) Docker网络访问和数据管理

    Docker教程(三) Docker网络访问和数据管理 本文链接:https://blog.csdn.net/yuan_xw/article/details/77504077 Docker教程(三) ...

  5. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  6. docker 网络_初探Docker的网络模式

    xiaohang 一个写不好代码的年轻人 钢铁侠的铁杆粉丝:I am Iron Man! 刚接触Docker的时候,你是否好奇容器之间是怎么通信的呢? 今天我们就一起来认识一下docker的网络吧~ ...

  7. docker swarm实践爆心肝总结全在这里,火速收藏!!!

    Docker Swarm 快速入门 "这是一个非常棒的docker swarm学习历程.我把一个国外的docker精简实践教学进行了简略的翻译,比起国内博客学习的总结性文章,它更注重让小白在 ...

  8. Docker网络体系结构:设计可扩展、可移植的Docker容器网络

    原文地址 译者:本人翻译水平有限,目的仅是为了学好Docker,如有错误请见谅. 翻译版本:v1.01(将不断优化翻译质量) 本文包含以下内容 Docker容器就是将应用及其所依赖运行环境的完整文件系 ...

  9. 微服务的「扩展立方」与 Docker 化实践

    2019独角兽企业重金招聘Python工程师标准>>> 微服务的扩展立方模型 "扩展立方模型"是指微服务架构的在拆分时包括三个维度,如上图所示,X 轴表示水平副本 ...

  10. 曾金龙:迅雷云的Docker开发实践

    非商业转载请注明作译者.出处,并保留本文的原始链接:http://www.ituring.com.cn/article/201256 曾金龙就职于迅雷网络,是国内覆盖面最广的"迅雷P2P引擎 ...

最新文章

  1. Multithread 之 introduction
  2. 现在开始每天坚持写点啥。linux相关基础内容学习。
  3. volatile 使用说明
  4. python2中可以使用print()函数吗_在Python2.x中使用print()(函数版本)
  5. mysql 查看表v空间自增涨_MySQL InnoDB表空间加密
  6. java如何获得集合的长度_Java集合长度
  7. java core 作者_java core dump分析实战
  8. ORACLE客户端连接
  9. QT中如果出现: warning: 'nullptr' is incompatible with C++98等类似警告
  10. 小程序中添加客服按钮contact-button
  11. javase和java区别_javase和java有什么区别
  12. 管理信息系统案例分析_BIM案例分析—地下空间工程(二)
  13. irlr7843引脚图_IRLR7843PBF中文资料
  14. 各自然带代表植被_十种常见自然带所对应的植被 十种常见自然带所对应的气候类型...
  15. Android Jetpack架构组件(十)之Slices
  16. Ubuntu用apt-get下载csh
  17. iPhone手机怎么投影到MacPro上
  18. Facebook灰度手势识别论文笔记
  19. Could not connect to SMTP host: smtp.163.com, port: 465, response: -1
  20. WSL2连接调用USB设备

热门文章

  1. 人生真正拉开距离不是高考!是大学毕业后第一个十年
  2. 给编程生涯充电的 10 本书
  3. 鸿蒙os 实测,鸿蒙体验怎么样_鸿蒙OS实测体验
  4. Android5.0以下drawable tag vector错误的解决办法(转发)
  5. Shell函数和正则表达式
  6. Redis学习-1 NoSQL
  7. hdu5033 Building 单调队列
  8. 浏览器同源策略及其规避方法
  9. luogu1140相似基因
  10. JVM(十),垃圾回收之新生代垃圾收集器