Docker 容器网络概述

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

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

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

安装docker

apt install docker.io

(安装mysql镜像并使用:)

sudo docker run -p : --name mysql -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.7

sudo docker run -it --net host mysql:5.7 "sh"
mysql -h127.0.0. -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": {}
}
]

Docker网络实践运用的更多相关文章

  1. docker 网络实践

    #docker 网络模式 环境 centos7. , Docker version -ce docker自带网络类型 bridge,host,none,container,overlay,macvla ...

  2. docker网络实践

    docker网络.md #docker 网络模式 环境 centos7.4 , Docker version 17.12.0-ce docker自带网络类型 bridge,host,none,cont ...

  3. 【转】Docker网络详解及pipework源码解读与实践

    好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...

  4. Docker 网络详解及 pipework 源码解读与实践

    转载自:https://www.infoq.cn/article/docker-network-and-pipework-open-source-explanation-practice/ Docke ...

  5. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  6. Docker网络解决方案-Flannel(转)

    转自https://www.cnblogs.com/kevingrace/p/6859114.html Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Ope ...

  7. docker 网络的几种模式

    docker 网络分为单机和多机,我们来了解一下docker的单机网络 docker单机网络分为以下几种: 1)bridge NetWork,使用--net=bridge指定,默认设置.2)Host ...

  8. Docker 网络基础介绍

    [编者按]本文作者为 Mesosphere 开发大使 Michael Hausenblas,主要介绍配置 Docker 单主机网络的基本知识.文章系国内 ITOM 管理平台 OneAPM 编译呈现. ...

  9. Docker网络一览

    转自:http://dockone.io/article/1143 [编者的话]本文是Nuage Networks公司Filip Verloy的一篇博文,简介了一下Docker网络情况,单主机的四种模 ...

随机推荐

  1. day 57 Bootstrap 第一天

    一 .bootstrap是什么  http://v3.bootcss.com/css/#grid-options(参考博客) 是一个前端开发的框架. HTML CSS JS 下载地址:https:// ...

  2. xgboost 和GBDT的区别

    作者:wepon链接:https://www.zhihu.com/question/41354392/answer/98658997来源:知乎 传统GBDT以CART作为基分类器,xgboost还支持 ...

  3. “全栈2019”Java多线程第二十一章:同步代码块产生死锁的例子

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. 三,PHP缓存机制实现页面静态化

    页面静态化思路: 因为新闻这种信息对实时性要求不高,并且比较稳定,所以可以这样做:当地一个用户访问某条新闻后,我们使用ob缓存机制,将内容缓存到html页面.当下一次访问时候,直接访问html页面.这 ...

  5. position:absolute元素 怎样居中

    <div style = 'height:20px;position:absolute;z-index:9999;top:0;left:0;right:0;margin:auto;'> & ...

  6. javascript 实用工具函数

    整理日常开发中我们常常会使用到的一些工具函数. var utils = (function(){ var fay = {}; // 返回当前时间的毫秒数 fay.getTime = Date.now( ...

  7. day67 crm(4) stark组件的增删改 以及 model_from使用和from组件回顾

        前情提要:Django  stark 组件开发的 增删改,  model_form组件的使用 form组件的回顾 一:list_display_link  创建 功能描述:   使包含的字段能 ...

  8. leetcode-162-寻找峰值

    题目描述: 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一 ...

  9. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  10. numpy 基本使用1

    Numpy是一个非常强大的库,具有大量线性代数以及大规模科学计算的方法. #-*- coding:utf-8 -*- import numpy as np #Numpy生成一维数组 a=np.arra ...