容器技术-Docker 网络03-用户自定义网络-网络命令的使用
基于 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. 创建网络
除了默认的名为 docker0
的 bridge
网络 , 还可以创建自己的 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 简单容器网络的连接示例
说明:
- 上图中表明的意思是,在一台 Docker 主机
Dokcer Host
上有三个容器 。- 三个容器分别连接到两个不同的网络中。
- 容器
container1
连接到默认的桥接网络bridge
- 容器
container2
连接到默认的网络的bridge
,同时它还连接到自定义的桥接网络my-net20
中。- 容器
container3
也连接到自定义的桥接网络my-net20
接下来我们就来实际操作一下,并观察各个容器网络的配置情况以及两个网桥的情况。
1.首先,创建并运行两个容器,container1
和 container2
:
$ 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
注意现在
container1
和container2
都被自动连接在默认的桥接网络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
同时加入了两个网络bridge
和my-net20
,并且有两个地址172.17.0.3
和172.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
地址通信,所以当 container2
和 container3
互相通信时,只能通过彼此的 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 # 退出容器
注意:
container3
和container1
并没有任何共同的网络,所以他们是无法通信的。
$ 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-用户自定义网络-网络命令的使用相关推荐
- 企业级容器技术 Docker
企业级容器技术 Docker docker隔离级别中包含两个核心组成: Namespace(名称空间):namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在内 ...
- 云漫圈 | 容器技术docker应用场景解析
戳蓝字"CSDN云计算"关注我们哦! 作者:channingbreeze 文章转载自程序员乔戈里 话说小史已经接受了A厂的offer,这不,已经在公司附近租好了房子,准备搬家过去住 ...
- 漫画 | 从搬家到容器技术 Docker 应用场景解析
作者 | channingbreeze 责编 | 仲培艺 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 生活现场 话说小史已经接受了 A ...
- 容器技术-Docker 网络01-默认网络
基于 Docker18.09.0 Docker 系列文章目录 安装Docker和容器管理 Docker镜像管理 Dockerfile详解 Docker数据卷管理 Docker网络之默认网络 Docke ...
- 容器技术 - docker
文章目录 一.Docker简介 1.1 Docker诞生 1.2 Docker相关解释 1.3 Docker与传统虚拟化对比 1.4 Docker的构成 二.Docker安装 2.1 Docker的安 ...
- 【容器技术——docker管理】
文章目录 容器是什么? Docker安装 Docker的安装方式 Docker容器管理 Docker镜像管理 镜像仓库构建 1)官方仓库构建 2)Harbor构建 Docker网络管理 1)Docke ...
- 企业级容器技术Docker
1 Docker 介绍和基础操作 移植性比较好----拥有独自的仓库,但要内核新 可移植性,标准化,隔离性) 1.1.2 Docker 是什么 Docker 是基于 Linux 内核实现,最早采用 L ...
- 【云原生之企业级容器技术 Docker实战一】Docker 介绍
目录 一.Docker 介绍 1.1 容器历史 1.2 Docker 是什么 1.3 Docker 和虚拟机,物理主机 1.4 Docker 的组成 1.5 Namespace 1.6 Control ...
- 容器技术Docker
文章目录 一.引言 1.1 环境不一致 1.2 隔离性 1.3 弹性伸缩 1.4 学习成本 二.Docker介绍 2.1 Docker的由来 2.2 Docker的思想 三.Docker的安装 3.1 ...
最新文章
- 赠票 | 中国数据智能管理峰会(上海)
- mysql ibdata作用_mysql data文件夹下ibdata1 文件作用
- python下requests的安装、测试、入门资料、官方资料
- LuoguP3959 宝藏 题解
- freetextbox java_FreeTextBox3.2.2下载及使用详解(图)
- Command Magicks:如何使用控制台处理文件和字符串
- 陕西2021高考成绩在哪查询,2021陕西高考成绩查询入口
- 三星PM981(a)硬盘安装黑苹果(第五版)
- 哥做的不是网站 是寂寞
- “兴趣爱好”,蜜糖or砒霜?
- STM32项目 -- 选题分享(2)(部分)
- AAAI 2023 | 基于联合学习与用户传播行为的虚假新闻早期检测
- C++遍历文件夹下的所有文件
- splash启动速度优化
- 三星980处理器和骁龙855_骁龙855、麒麟980、Exynos9820谁最强?看完秒懂
- (paypal,stripe)轮询收款系统
- div html 下边加横线_CSS如何给文字添加下划线样式?
- Shader学习第六篇:Lambert (兰伯特)光照模型
- Cadence OrCAD Capture 原理图中预览元件封装技巧图文教程
- 视频教程-《AE视频教程——3小时从入门到精通》-After Effects(AE)