docker网络(3)
docker网络介绍
docker安装时,会自动在host上创建三个网络:
[root@localhost ~]# docker network list/ls
NETWORK ID NAME DRIVER SCOPE
979fbb278d03 bridge bridge local
e3852e4d242e host host local
70b78b4570c6 none null local
docker--none网络
none网络就是什么都没有的网络,挂在这个网络下的容器除了lo,没有其他任何网卡,容器创建时,可以通过 --network=none 指定使用 none 网络。
[root@localhost ~]# docker run -it --network=none busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
none网络的应用:封闭的网络意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用none 网络。比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。
docker--host网络
连接到host网络的容器,共享 docker host 的网络栈,容器的网络配置与host一样,可以通过 --network=host 指定使用host网络。
[root@localhost ~]# docker run -it --network=host busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast qlen
link/ether :0c::fa:cf: brd ff:ff:ff:ff:ff:ff
inet 192.168.42.30/ brd 192.168.42.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefa:cf23/ scope link
valid_lft forever preferred_lft forever
: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue
link/ether ::d4:ac:3b: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/ brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80:::d4ff:feac:3b55/ scope link
valid_lft forever preferred_lft forever
: veth80d568f@if62: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether :ed:::f2: brd ff:ff:ff:ff:ff:ff
inet6 fe80::30ed:4ff:fe82:f273/ scope link
valid_lft forever preferred_lft forever
: veth6a18c66@if66: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 1e::3b:4c:9b:a4 brd ff:ff:ff:ff:ff:ff
inet6 fe80::1c84:3bff:fe4c:9ba4/ scope link
valid_lft forever preferred_lft forever
: veth049b197@if68: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 1e:f1:4b:c1:f6:ff brd ff:ff:ff:ff:ff:ff
inet6 fe80::1cf1:4bff:fec1:f6ff/ scope link
valid_lft forever preferred_lft forever
: vethed43fa8@if70: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether c2:d3:b0::e4: brd ff:ff:ff:ff:ff:ff
inet6 fe80::c0d3:b0ff:fe25:e488/ scope link
valid_lft forever preferred_lft forever
: veth48839bd@if72: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 3e:5e::::7d brd ff:ff:ff:ff:ff:ff
inet6 fe80::3c5e:3ff:fe10:787d/ scope link
valid_lft forever preferred_lft forever
: vethb9e42c7@if74: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether ae::c9:bb:: brd ff:ff:ff:ff:ff:ff
inet6 fe80::ac11:c9ff:febb:/ scope link
valid_lft forever preferred_lft forever
: veth04ba522@if78: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 3e:1d::5c:: brd ff:ff:ff:ff:ff:ff
inet6 fe80::3c1d:14ff:fe5c:/ scope link
valid_lft forever preferred_lft forever
在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的。host网络的使用场景又是什么呢?
docker--bridge网络
docker在安装时会创建一个docker0的linux bridge网桥,不指定网络会默认挂到docker0上。
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242d4ac3b55 no veth049b197
veth04ba522 [root@localhost ~]# docker run -it --network=bridge busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if81: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.9/ brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever veth04ba522与eth0@if81是一对veth pair。
[root@localhost ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "979fbb278d03596b502fb8d02d22d1e8fc42f6a8beb7602ba6eecb08bdf512ec",
"Created": "2019-06-18T16:43:55.651454994+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
创建 user--defined网络
我们可以通过 bridge 创建类似前面默认的 bridge 网络。
(1)利用bridge驱动创建名为my-net2网桥(docker会自动分配网段)
[root@localhost ~]# docker network create --driver bridge my-net2
b326209167c6dbb7e867659bbfa266615bf9312632fbdbaa83e35a5d48825867
(2)查看当前网络结构变化
[root@localhost ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
979fbb278d03 bridge bridge local
e3852e4d242e host host local
b326209167c6 my-net2 bridge local
70b78b4570c6 none null local
(3)查看容器bridge网桥配置(bridge就是容器和网桥形成一对veth pair)
[root@localhost ~]# docker network inspect my-net2
[
{
"Name": "my-net2",
"Id": "b326209167c6dbb7e867659bbfa266615bf9312632fbdbaa83e35a5d48825867",
"Created": "2019-06-18T19:41:51.182792345+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
(4)利用bridge驱动创建名为my-net3网桥(user-defined网段及网关)
[root@localhost ~]# docker network create --driver bridge --subnet 172.18.2.0/ --gateway 172.18.2.1 my-net3
Error response from daemon: Pool overlaps with other one on this address space
这是因为新创建的网络自定义的子网ip与已有的网络子网ip冲突。只需要重新定义子网ip段就可以。
[root@localhost ~]# docker network create --driver bridge --subnet 172.20.2.0/ --gateway 172.20.2.1 my-net3
f021bec39166a23f449dd04e17977f77ce0c817ae7c0e21d97431a0679375351
(5)启动容器使用新建的my-net3网络
[root@localhost ~]# docker run -it --network=my-net3 busybox /bin/sh
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if91: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.20.2.2/ brd 172.20.2.255 scope global eth0
valid_lft forever preferred_lft forever
(6)启动容器使用my-net3网络并指定ip(只有使用 --subnet 创建的网络才能指定静态 IP,如果是docker自动分配的网段不可以指定ip)
[root@localhost ~]# docker run -it --network=my-net3 --ip 172.20.2.120 busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if93: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.20.2.120/24 brd 172.20.2.255 scope global eth0
valid_lft forever preferred_lft forever
(7)让已启动不同vlan的ningx容器,可以连接到my-net2(其实在nigx中新建了my-net2的网卡)
[root@localhost ~]# docker run -itd --network=my-net3 busybox /bin/sh
377f3157bfd48ef38997c0bf12fc86e0cf30a4fe42c50213ff1108854848df14
[root@localhost ~]# docker network connect my-net2 377f3157bfd4
[root@localhost ~]# docker exec -it 377f3157bfd4 /bin/sh
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if107: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.20.2.3/ brd 172.20.2.255 scope global eth0
valid_lft forever preferred_lft forever
: eth1@if109: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/ brd 172.18.255.255 scope global eth1
valid_lft forever preferred_lft forever
此容器同时拥有了net2和net3的子网ip。
(8)使用--name指定启动容器名字,可以使用docker自带DNS通信,但只能工作在user-defined 网络,默认的 bridge 网络是无法使用 DNS 的.
[root@localhost ~]# docker run -itd --network=my-net2 --name=b1 busybox
9b3be1daeca760f6cc5eb62fbd4142c72efc3c07be5b70c56059da7946751101
[root@localhost ~]# docker run -itd --network=my-net2 --name=b2 busybox
ba94b2359471d16b6a8e12025c99245d1ab6af123b346641128f081b031d71bc
[root@localhost ~]# docker exec -it b1 /bin/sh
/ # ping b2
PING b2 (172.18.0.5): data bytes
bytes from 172.18.0.5: seq= ttl= time=0.150 ms [root@localhost ~]# docker exec -it b2 /bin/sh
/ # ping b1
PING b1 (172.18.0.4): data bytes
bytes from 172.18.0.4: seq= ttl= time=0.059 ms
在创建容器时使用相同网络,并且给容器命名。意思是给两个容器之间做了域名解析和配置相同网段,所以能ping通。
(9)容器之间的网络互联
a). 首先创建一个 db 容器
[root@localhost ~]# docker run -itd --name db busybox
b). 创一个 web 容器,并使其连接到 db
[root@localhost ~]# docker run -itd --name web --link db:dblink busybox /bin/sh
-link db:dblink 实际是连接对端的名字和这个链接的名字,也就是和 db 容器 建立一个叫做 dblink 的链接
c).查看链接的情况
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
141e370eea76 busybox "/bin/sh" 8 seconds ago Up 7 seconds web
9f89a1945f6b busybox "sh" 54 seconds ago Up 53 seconds db
d)进入web容器,使用 ping 命令来测试网络链接的情况
[root@localhost ~]# docker exec -it 141e370eea76 /bin/sh/
# ping db
PING db (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.445 ms
发现可以ping通,连接有效
e)尝试进入db容易,使用ping命令测试
[root@localhost docker]# docker exec -it 9f89a1945f6b /bin/sh
/ # ping web
ping: bad address 'web'
发现无法ping通,因此可以推断出容器之间的网络连通是单向的,即哪个容器建立了连接,哪个容易才能连接到另一个容器,反之不行
(10)容器端口映射 在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容 器内部的网络应用和服务的
当容器需要通信时,我们可以使用 -P (大) &&-p (小)来指定端口映射
-P : Docker 会随机映射一个 49000 ~ 49900 的端口到容器内部开放的网络端口
p :则可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。
支持的格式有
iP : HostPort : ContainerPort
IP : : ContainerPort
IP : HostPort :
如果不指定就随机
查看映射
docker port 容器名
拓展:用脚本删除所有容器
[root@localhost docker]# for id in `docker ps -a | grep a | awk -F " +" '{print $1}'` ;do docker rm -f $id ;done
a)映射所有接口地址,此时绑定本地所有接口上的 5000 到容器的 5000 接口, 访问任何一个本地接口的 5000 ,都会直接访问到容器内部
docker run -dti -p 5000:5000 nginx /bin/bash
b)多次使用可以实现多个接口的映射
[root@localhost docker]# docker run -itd -p 5000:22 -p 5001:23 nginx /bin/bash
查看容器信息,发现新容器的的22,23端口都映射到了宿主机的5000和5001端口。
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea3b9412d96d nginx "/bin/bash" 5 seconds ago Up 5 seconds 80/tcp, 0.0.0.0:5000->22/tcp, 0.0.0.0:5001->23/tcp hardcore_darwin
c)映射到指定地址的指定接口 此时会绑定本地 192.168.4.169 接口上的 5000 到容器的80 接口
docker run -dti -p 192.168.253.9:5000:80 nginx /bin/bash
[root@localhost docker]# docker run -dti -p 192.168.253.9:5000:80 nginx /bin/bash
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
132746ef0996 nginx "/bin/bash" About a minute ago Up About a minute 192.168.253.9:5000->80/tcp practical_lichterman
d) 映射到指定地址的任意接口 此时会绑定本地 192.168.4.169 接口上的任意一个接口到容器的 5000 接口
docker run -dti -p 192.168.4.169::5000 nginx /bin/bash
e) 使用接口标记来指定接口的类型
docker run -dti -p 192.168.4.169::5000/UDP nginx /bin/bash
指定接口位udp类型
(11)实验:通过端口映射实现访问本地的 IP:PORT 可以访问到容器内的 web
a)将容器80端口映射到主机8080端口,注意末尾不要加环境变量
docker run -itd -p 80:80 --name nginx nginx:latest
b) 查看刚运行docker
docker ps -a
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0382dfbbd606 nginx:latest "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp nginx
c) 进入容器
docker exec -it nginx /bin/sh,并在 容器内部编辑网页文件 index.html
# cd /usr/share/nginx/
# ls
html
# cd html
# ls
50x.html index.html
# echo '123' > index.html
d)到宿主机上打开浏览器输入 IP:PORT 访问验证
一些报错:
1)[root@localhost /]# docker run -itd --name busy busybox:latest /bin/bash
e105747eb16e52da2637379d75e221f46812955c929696234abbf1321fd56da3
docker: Error stat /bin/bash: no such file or directory": unknown
这是因为环境变量不可用,换成/bin/sh或者不加环境变量
2)[root@localhost /]# docker run -itd --name busy busybox:latest /bin/sh
docker:
Error response from daemon: Conflict. The container name "/busy" is
already in use by container
"e105747eb16e52da2637379d75e221f46812955c929696234abbf1321fd56da3". You
have to remove (or rename) that container to be able to reuse that name.
这是因为容器名已经存在,需要删除已经存在的容器名
3)[root@localhost /]# docker network create --driver bridge my-net2
Error networks have overlapping IPv4
这是因为网桥冲突,删除冲突的网桥。
brctl delbr 网桥
systemctl restart docker
4)error:executable file not found in $PATH": unknown
这是因为命令的顺序错误
5)root@localhost /]# docker run -it --network=my-net3 --ip 192.168.253.13 busybox:latest /bin/sh
docker: Error response from daemon: Invalid address 192.168.253.13: It does not belong to any of this network's subnets.
这是因为自定义的ip不在可使用ip的范围内。
6)Error No chain/target/match by that name.
这是因为没有重启docker,或者关闭firewalld和iptables(不建议)
7)docker: Error response from daemon: driver failed programming
external connectivity on endpoint vibrant_kepler
(0838e9c00e2ffcec24bbd333000cc4de9bd0fa2420c1c330ddb77dfd9d1d534f): Bind for 192.168.253.9:5000 failed: port is already allocated.
这是因为宿主机的端口已经被别的服务占用。
8)宿主机映射到容器之后,使用宿主机ip:port来访问容器的httpd或者nginx服务
报错连接被拒绝
这是因为端口映射的时候加入了环境变量,去掉环境变量即可。
网络排查命令:
iptables -t nat -L
ip r
tcpdump -i docker0 -n icmp
tcpdump -i eth0 -n icmp
docker网络(3)的更多相关文章
- 理解Docker(5):Docker 网络
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- docker网络配置方法总结
docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...
- 【转】Docker网络详解及pipework源码解读与实践
好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...
- Docker网络模式
[编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...
- docker网络-如何让外部网络访问容器资源
docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...
- docker网络解析
Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容 ...
- docker网络访问(三)
docker网络访问 ifconfig查看网卡,启动docker的时候,docker会帮我们创建一个docker0的网桥. 1.随机映射 docker run -P 2.指定映射 -p hostPor ...
- [Docker网络]模拟一台交换机的拓扑
[Docker网络]模拟一台交换机的拓扑 本例主要对Docker网络进行实际运用. 背景介绍 一台虚拟机如何模拟成一台多端口交换机分别连接多台虚拟机? bridge网桥技术 实验准备 docker d ...
- Docker 网络之理解 bridge 驱动
笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ...
- Docker 网络之进阶篇
笔者在<Docker 基础 : 网络配置>一文中简单介绍了容器网络的基本用法,当时网络的基本使用方式还处于 --link 阶段.时过境迁,随着 docker 的快速发展,其网络架构也在不断 ...
随机推荐
- java_八大数据类型
一.整型 1.byte 1个字节(8位--一个字节占8位)-128~127 2.short 2个字节 -32768~32767 3.int 4个字节(常用) 4.long 8个字节 ...
- idea仿eclipse的export导出功能
自从开发工具从eclipse切换到idea来之后,才知道什么叫做'真香'.idea强大的扩展功能极大的拓展了他的可用性,最近有个功能就是通过idea的扩展插件搞定的. 事情是这样的,朋友使用eclip ...
- Ubuntu系统---安装Caffe (+OpenCV+Python+CPU-only)
安装配置Ubuntu14.04+Caffe (+OpenCV+Python+CPU-only) 记录 [作者:Wu Ping.时间:20180428.] 本人已经安装很多次的Caffe了:从开始的初探 ...
- spring 的自动定时任务
spring的自动定时任务有两种 第一种:通过xml配置来设置 需要在xml中引入新的约束,并且需要配置<task:scheduled-tasks> ,主要配置内容如下: <?xml ...
- Python 去除字符串中的空行
Python 去除字符串中的空行 mystr = 'adfa\n\n\ndsfsf' print("".join([s for s in mystr.splitlines(True ...
- [USACO19JAN]Train Tracking 2——神仙结论题+DP
原题链接 orz xzz巨佬 首先发现一个结论:两个相邻的\(c\)值如果不相同的话,就可以固定某个位置的值了 这启示我们把连续且相等的\(c\)给单独拿出来看,也就是对于一些\(c_i=c_{i+1 ...
- 2-删除IPC$的方式
一.使用命令临时删除IPC$的方式 1.查看IPC$是否启用 命令:net share 2.删除IPC$功能 命令:net share ipc$ /delete 注:使用命令删除后,重启服务器后,IP ...
- 【转】深入理解Spring的两大特征(IOC和AOP)
原文链接:https://blog.csdn.net/gloomy_114/article/details/68946881 众所周知,Spring的核心特性就是IOC和AOP,IOC(Inversi ...
- 包过滤防火墙iptables(网络层)
安装: yum -y install iptables-services 启动:systemctl start iptables.service 四表五链 过滤:filter - input forw ...
- detach([expr]) 从DOM中删除所有匹配的元素。
detach([expr]) 概述 从DOM中删除所有匹配的元素.大理石构件 这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素.与remove()不同的是,所有绑定 ...