基于 Docker18.09.0


Docker 系列文章目录

安装Docker和容器管理

Docker镜像管理

Dockerfile详解

Docker数据卷管理

Docker网络之默认网络

Docker网络之Host和none

Docker网络之自定义网络

容器端口发布

Docker 官方镜像仓库 之 Docker Hub

单机容器编排工具之 dockercompose

目录

  • Docker 系列文章目录
  • 前言
  • 1. 创建网络
    • 1.1 创建一个 `bridge` 网络
    • 1.2 创建一个 `bridge` 网络并指定子网
  • 2. 把容器连接到网络
    • 2.1 简单容器网络的连接示例
      • 接下来我们就来实际操作一下,并观察各个容器网络的配置情况以及两个网桥的情况。
        • 1.首先,创建并运行两个容器,`container1` 和 `container2`:
        • 2.2 创建一个隔离的桥接网络 `my-net20`
      • 2.3 现在将 `container2 加入到 `my-net20` 网络中
      • 2.4 运行第三个容器并指定网络。
      • 2.5 查看容器三的源数据网络部分
      • 2.6 再来查看容器二的元数据网络部分
      • 2.7 进入容器 `container2` 中,查看网卡信息
      • 2.8 尝试利用容器名进行通信测试
  • 3. 从网络中断开一个容器的连接
  • 4. 删除一个自定义的网络

前言

本文将和大家分享关于 Docker 用户自定义网络的基本命令的使用,有如下命令:

  • docker network create
  • docker network ls
  • docker network inspect
  • docker network connect
  • docker network disconnect
  • docker network rm

1. 创建网络

除了默认的名为 docker0bridge 网络 , 还可以创建自己的 bridge 网络或 overlay 网络。

  • bridge 网络用于在本机内容器之间的互通

  • overlay 网络用于在不同主机内的容器之间的互通

本文主要针对 bridge 网络进行演示说明, overlay 网络会在以后单独进行讨论。

1.1 创建一个 bridge 网络

运行命令 docker network -d 指定要创建什么类型的网络。
假如不使用 -d 参数,会创建 bridge 网络

$ docker network create -d bridge   my-net
# 或者
$ docker network create  my-net

查看网络源数据

$ docker network inspect my-net
[{"Name": "my-net","Id": "67b19436a9e361c8b9da4034c5903c4903444cecd3ecdbde62bbaf70828d49d9","Created": "2018-12-10T07:22:53.2694852Z","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,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]

Doker 会为自定义的网络自动分配一个子网("Subnet": "172.18.0.0/16")。

1.2 创建一个 bridge 网络并指定子网

创建一个网络并指定子网为 172.20.0.0/16

$ docker network create  --subnet=172.20.0.0/16 my-net20
$ docker network inspect  my-net20
[{"Name": "my-net20","Scope": "local",...略..."Config": [{"Subnet": "172.20.0.0/16"}]},...略..."ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]

2. 把容器连接到网络

您可以将现有容器连接到一个或多个网络。
容器可以连接到使用不同网络驱动程序的网络,比如连接到 bridge 网络或者 overlay 网络。
连接后,容器可以使用其他容器的IP地址或名称进行通信。

2.1 简单容器网络的连接示例

说明:

  1. 上图中表明的意思是,在一台 Docker 主机 Dokcer Host 上有三个容器 。
  2. 三个容器分别连接到两个不同的网络中。
  • 容器 container1 连接到默认的桥接网络 bridge
  • 容器 container2 连接到默认的网络的 bridge,同时它还连接到自定义的桥接网络 my-net20 中。
  • 容器 container3 也连接到自定义的桥接网络 my-net20

接下来我们就来实际操作一下,并观察各个容器网络的配置情况以及两个网桥的情况。

1.首先,创建并运行两个容器,container1container2

$ docker run -itd --rm --name=container1 alpine
368a503800d4007627d0b63946ef495ae8d5cc225fb7dd265fac62e40268b5f2$ docker run -itd --rm --name=container2 alpine
8a83b0d89c2005f488d00e5dc4d46812a2aeb7f1bcec9f061d9762f6c901275e

2.2 创建一个隔离的桥接网络 my-net20

下面在创建网络的时候,使用了 --subnet 为此网络指定了一个子网 172.20.0.0/16

$ docker network create  -d bridge --subnet 172.20.0.0/16 my-net20
124cb50f08a8ec2a0af44365505e16b3f77b5671373639a1e23f8535a9054d0a

注意现在 container1container2 都被自动连接在默认的桥接网络 bridge

# 部分内容
"Containers": {"368a503800d4007627d0b63946ef495ae8d5cc225fb7dd265fac62e40268b5f2": {"Name": "container1","EndpointID": "d02b2ab691e5940a74de77ec6a68d35d52c8800014a96f830f04890971587ce2","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""},"8a83b0d89c2005f488d00e5dc4d46812a2aeb7f1bcec9f061d9762f6c901275e": {"Name": "container2","EndpointID": "2e330964b4cc2b5897eeb9fac15dbc03e4326cc47c087e0276de88509f64a0ac","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""}},

2.3 现在将 container2 加入到my-net20` 网络中

$ docker network connect my-net container2

查看 my-net 网络,以验证

$ docker network inspect my-net20
[{"Name": "my-net20","Id": "124cb50f08a8ec2a0af44365505e16b3f77b5671373639a1e23f8535a9054d0a","Created": "2018-12-11T13:02:03.0854486Z","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.20.0.0/16"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"8a83b0d89c2005f488d00e5dc4d46812a2aeb7f1bcec9f061d9762f6c901275e": {"Name": "container2","EndpointID": "2663b56686a331e68de1a0c5955d9f3b8ef102653547e43f5d9ef8891d84ffd2","MacAddress": "02:42:ac:14:00:02","IPv4Address": "172.20.0.2/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]

2.4 运行第三个容器并指定网络。

下面我们运行第三个容器 container3,并且同时使用 --network 指定其加入网络 my-net20, 还使用了 --ip 来指定分配给容器的具体 IP 地址。

$ docker run -itd --rm --name=container3 --network=my-net20 --ip=172.20.0.100 busybox
db4ef2529e81e20508e029ade69ffae08df6dcc538d426b49ca1d9b830d7f0c7

注意:
只有使用 --subnet 参数创建的网络,才能使用 --ip 参数指定一个具体的 IP 地址给一个容器

2.5 查看容器三的源数据网络部分

部分内容已截断

$ docker inspect container3
"Networks": {"my-net20": {"IPAMConfig": {"IPv4Address": "172.20.0.100"   # 指定分配的地址},"Links": null,"Aliases": ["db4ef2529e81"],"NetworkID": "124cb50f08a8ec2a0af44365505e16b3f77b5671373639a1e23f8535a9054d0a","EndpointID": "ec7774f1936d056ff4b39a862972e11c102d53c61669e5c230e47be35d65ca08","Gateway": "172.20.0.1","IPAddress": "172.20.0.100","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:14:00:64","DriverOpts": null}}

2.6 再来查看容器二的元数据网络部分

            "Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "8a5f470ffe774f4f96a712642ed361fbeb0d8e66018e1d629ab44cfdf3e42a05","EndpointID": "2e330964b4cc2b5897eeb9fac15dbc03e4326cc47c087e0276de88509f64a0ac","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:03","DriverOpts": null},"my-net20": {"IPAMConfig": {},"Links": null,"Aliases": ["8a83b0d89c20"],"NetworkID": "124cb50f08a8ec2a0af44365505e16b3f77b5671373639a1e23f8535a9054d0a","EndpointID": "2663b56686a331e68de1a0c5955d9f3b8ef102653547e43f5d9ef8891d84ffd2","Gateway": "172.20.0.1","IPAddress": "172.20.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:14:00:02","DriverOpts": null}}

可以发现 container2 同时加入了两个网络 bridgemy-net20 ,并且有两个地址 172.17.0.3172.20.0.2

2.7 进入容器 container2 中,查看网卡信息

$ docker exec -it container2 /bin/sh
/ # ip  -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
97: eth0@if98: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueueinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
100: eth1@if101: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueueinet 172.20.0.2/16 brd 172.20.255.255 scope global eth1valid_lft forever preferred_lft forever

container2 有两个网络接口卡,分别分配了 IP地址。
这是因为,我们一开始运行这个容器的时候,被连接到默认的网络上,后来我们又执行了 docker network connect 命令,把它连接到了 my-net20 网络上了,所以这使其有两个网络,并且有两个网卡。

2.8 尝试利用容器名进行通信测试

Docker嵌入式DNS服务器可以为连接到给定网络的容器启用名称解析。

也就是说目前在 container2 中可以使用容器名和 container3 进行通信。
但是由于默认的网络 bridge 只支持通过 IP 地址通信,所以当 container2container3 互相通信时,只能通过彼此的 IP 地址了。

$ docker exec -it container2 /bin/sh
/ # ping -w 2 container3
PING container3 (172.20.0.100): 56 data bytes
64 bytes from 172.20.0.100: seq=0 ttl=64 time=0.406 ms
64 bytes from 172.20.0.100: seq=1 ttl=64 time=0.176 ms--- container3 ping statistics ---
3 packets transmitted, 2 packets received, 33% packet loss
round-trip min/avg/max = 0.176/0.291/0.406 ms
/ # ping -w 2 container1
ping: bad address 'container1'
/ # ping -w 2 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.246 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.162 ms--- 172.17.0.2 ping statistics ---
3 packets transmitted, 2 packets received, 33% packet loss
round-trip min/avg/max = 0.162/0.204/0.246 ms
/ # exit       # 退出容器

注意:
container3container1 并没有任何共同的网络,所以他们是无法通信的。

$ docker exec -it container3 /bin/sh
/ # ping -w 2 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes--- 172.17.0.2 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
/ #

其实即使容器未运行,您也可以将容器连接到网络。但是,docker network inspect仅显示有关正在运行的容器的信息。

3. 从网络中断开一个容器的连接

docker  network  disconnect     网络名     容器名

4. 删除一个自定义的网络

docker  network  rm    网络名

容器技术-Docker 网络03-用户自定义网络-网络命令的使用相关推荐

  1. 企业级容器技术 Docker

    企业级容器技术 Docker docker隔离级别中包含两个核心组成: Namespace(名称空间):namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在内 ...

  2. 云漫圈 | 容器技术docker应用场景解析

    戳蓝字"CSDN云计算"关注我们哦! 作者:channingbreeze 文章转载自程序员乔戈里 话说小史已经接受了A厂的offer,这不,已经在公司附近租好了房子,准备搬家过去住 ...

  3. 漫画 | 从搬家到容器技术 Docker 应用场景解析

    作者 |  channingbreeze 责编 | 仲培艺 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 生活现场 话说小史已经接受了 A ...

  4. 容器技术-Docker 网络01-默认网络

    基于 Docker18.09.0 Docker 系列文章目录 安装Docker和容器管理 Docker镜像管理 Dockerfile详解 Docker数据卷管理 Docker网络之默认网络 Docke ...

  5. 容器技术 - docker

    文章目录 一.Docker简介 1.1 Docker诞生 1.2 Docker相关解释 1.3 Docker与传统虚拟化对比 1.4 Docker的构成 二.Docker安装 2.1 Docker的安 ...

  6. 【容器技术——docker管理】

    文章目录 容器是什么? Docker安装 Docker的安装方式 Docker容器管理 Docker镜像管理 镜像仓库构建 1)官方仓库构建 2)Harbor构建 Docker网络管理 1)Docke ...

  7. 企业级容器技术Docker

    1 Docker 介绍和基础操作 移植性比较好----拥有独自的仓库,但要内核新 可移植性,标准化,隔离性) 1.1.2 Docker 是什么 Docker 是基于 Linux 内核实现,最早采用 L ...

  8. 【云原生之企业级容器技术 Docker实战一】Docker 介绍

    目录 一.Docker 介绍 1.1 容器历史 1.2 Docker 是什么 1.3 Docker 和虚拟机,物理主机 1.4 Docker 的组成 1.5 Namespace 1.6 Control ...

  9. 容器技术Docker

    文章目录 一.引言 1.1 环境不一致 1.2 隔离性 1.3 弹性伸缩 1.4 学习成本 二.Docker介绍 2.1 Docker的由来 2.2 Docker的思想 三.Docker的安装 3.1 ...

最新文章

  1. 赠票 | 中国数据智能管理峰会(上海)
  2. mysql ibdata作用_mysql data文件夹下ibdata1 文件作用
  3. python下requests的安装、测试、入门资料、官方资料
  4. LuoguP3959 宝藏 题解
  5. freetextbox java_FreeTextBox3.2.2下载及使用详解(图)
  6. Command Magicks:如何使用控制台处理文件和字符串
  7. 陕西2021高考成绩在哪查询,2021陕西高考成绩查询入口
  8. 三星PM981(a)硬盘安装黑苹果(第五版)
  9. 哥做的不是网站 是寂寞
  10. “兴趣爱好”,蜜糖or砒霜?
  11. STM32项目 -- 选题分享(2)(部分)
  12. AAAI 2023 | 基于联合学习与用户传播行为的虚假新闻早期检测
  13. C++遍历文件夹下的所有文件
  14. splash启动速度优化
  15. 三星980处理器和骁龙855_骁龙855、麒麟980、Exynos9820谁最强?看完秒懂
  16. (paypal,stripe)轮询收款系统
  17. div html 下边加横线_CSS如何给文字添加下划线样式?
  18. Shader学习第六篇:Lambert (兰伯特)光照模型
  19. Cadence OrCAD Capture 原理图中预览元件封装技巧图文教程
  20. 视频教程-《AE视频教程——3小时从入门到精通》-After Effects(AE)

热门文章

  1. LINUX中EABI和ABI的理解
  2. LibreCAD windows 编译
  3. 欧拉函数定理及其性质
  4. 如何从一个完全自动化的交易系统获利
  5. Linux 定时任务shell脚本定时移动服务器日志文件到指定目录下
  6. 【QImage类常用函数】
  7. 财神来了 | 存量资金博弈下,是谁在吸血
  8. java什么是monitor和Monitor监视器锁、对象布局
  9. 适用于 Windows 和 macOS 的几款免费视频转换软件
  10. 计算机网络管理存在薄弱环节,计算机网络管理思考