docker 网络
我们是用容器,不是运行单机程序,当然是需要运行网络服务在容器中,那么如何配置docker的容器网络,基础的网络配置,网桥配置,端口映射,还是很重要的。
[root@docker-200 ~]#docker inspect linux0224_registry
本地的机器的所有容器的ip
[root@docker-200 ~]#docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) | column -t
/sleepy_poincare -
/linux0224_registry - 172.17.0.2
/distracted_mendel -
/nginx -
/harbor-jobservice - 172.22.0.3
/harbor-core - 172.22.0.8
/redis - 172.22.0.7
/registry - 172.22.0.5
/harbor-db - 172.22.0.2
/harbor-portal - 172.22.0.6
/registryctl - 172.22.0.9
/harbor-log - 172.22.0.4
docker 网络功能
docker 的网络功能就是利用linux的network , namespace ,network bridge 虚拟的网络设备实现,默认情况下docker安装完毕后会生成网桥,docker0 ,可以理解为一个交换机,对两端的数据转发,docker的网络接口默认都是虚拟网络接口。
2个桥, =======DRIVE=====bridge==========
网络驱动类型====bridge
查看容器有几座桥(容器网络,创建网桥)?
docker network ls
[root@docker-200 ~]#docker network ls
NETWORK ID NAME DRIVER SCOPE
d759d6afc28e bridge bridge local
a22b66f2f0c0 dockergitlab_default bridge local
e94e1740135d harbor_harbor bridge local
7f0ac5ca9cd1 host host local
15fee521bd3c none null local
5f10a2922758 root_default bridge local
859d85bb6186 tmp_default bridge local
几个容器网桥? 5个
如何知道这5个网桥用的网段是?
docker查看资源信息的命令
docker inspect image xx
docker inspect container xx
docker inspect network xx
# 补充一点
第一个网桥是docker生成的docker0

在定制一个网桥去运行容器
网桥的作用就是容器和docker0进行连接,就是为了数据包的收发
关于docker网桥的学习
指定现有网桥运行新的容器
查看运行后的容器,虚拟网络接口和宿主机网桥的关系。
查看现有的网桥的信息
增
删
改
查
docker inspect 网络驱动的id
基于宿主机的brctl ,网络管理命令去查看网桥信息
yum install bridge-utils -y
[root@docker-200 ~]#docker network rm 859d85bb6186 5f10a2922758
859d85bb6186
5f10a2922758
[root@docker-200 ~]#
[root@docker-200 ~]#docker network rm 859d85bb6186 5f10a2922758
Error: No such network: 859d85bb6186
Error: No such network: 5f10a2922758
[root@docker-200 ~]#
[root@docker-200 ~]#docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
harbor_harbor
dockergitlab_default
# 查看剩下的默认的docker网络环境信息
[root@docker-200 ~]#ip addr
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:ad:e8:ba:38 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:adff:fee8:ba38/64 scope link
valid_lft forever preferred_lft forever
[root@docker-200 ~]#
#查看宿主机的网桥信息
[root@docker-200 ~]#brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242ade8ba38 no
删除无用的网桥、
docker network prune 清理没有容器在用的的网桥
容器之间访问
走同一个网桥下,链接同一个网桥,就可以实现容器的网络通信
这个虚拟网桥
172.16.0.0
172.16.2.2
172.16.2.3
container 模式
container 模式是容器使用另一个存在的容器,共享他的网络空间
container模式下的网络空间,和宿主机是完全隔离的

(面试题)docker网络模式4种
--net=bridge 这个是默认的模式,连接到默认的网桥docker0,这个模式给容器自动的分配ip,且通过iptables的net表和宿主机实现数据通信。
--net=host 告诉Docker不要将容器网络放到隔离的命名空间,即不要容器化容器内的网络,此时容器内使用本地主机的网络,它完全拥有本地主机接口访问权限
--net=container:NAME_or_ID 让DOCKER 将新建的进程放到一个已经存在的网络栈种,新容器进程拥有自己的文件系统,进程列表,和已经存在的容器共享ip地址,网络端口等资源,
--net=none 让Docker 将新的容器放到隔离的网络栈中,但是不进行网络配置,用户可以自行配置
2.1 创建容器,用自带的网桥,brdige,基于docker network 查看
[root@docker-110 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
fca76ebba6d5 bridge bridge local
0db7cc002f15 host host local
2038547e0c41 none null local
[root@docker-200 ~]#docker run --name docker --network=fca76ebba6d5 -it busybox sh
-----
[root@docker-200 ~]#docker run --name bride-net --network=bridge -it busybox sh
/ #
/ #
/ #
# br-linux0225 192.168.56.0/24
同理如上
# 创建自建网桥
docker network create --driver bridge --subnet 192.168.55.0/24 --gateway 192.168.55.1 linux0224-net1
[root@docker-200 ~]#docker network ls
NETWORK ID NAME DRIVER SCOPE
00dafdbf4726 bridge bridge local
7f0ac5ca9cd1 host host local
5ab8b0856f15 linux0224-net1 bridge local
15fee521bd3c none null local
[root@docker-200 ~]#brctl show
bridge name bridge id STP enabled interfaces
br-5ab8b0856f15 8000.024247e06d14 no
docker0 8000.0242ade8ba38 no
[root@docker-200 ~]#
[root@docker-200 ~]#ifconfig
br-5ab8b0856f15: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.55.1 netmask 255.255.255.0 broadcast 192.168.55.255
ether 02:42:47:e0:6d:14 txqueuelen 0 (Ethernet)
RX packets 18 bytes 1080 (1.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14 bytes 1008 (1008.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 使用该网桥,运行容器了
docker run -it --network=linux0224-net1 busybox sh

1.网桥 名字 linux0224-net2 子网是 172.14.0.0/16 网关是 172.14.0.1
docker network create --driver bridge --subnet 172.14.0.0/16 --gateway 172.14.0.1 linux0224-net2
如何查看有那些网桥
docker network ls
ifconfig
brctl show
ip addr
2. 使用该网桥,运行容器
运行一个nginx容器,且对外11155访问,使用自建网桥,日志挂到宿主机的/tmp/nginx_log/
docker run --network=linux0224-net2 -d -p 11155:80 -v /tmp/nginx_log/:/var/log/nginx/ nginx
3. 查看容器的详细信息
docker inspect 容器id

Destination 挂载点
source 挂载的设备
3. 查看容器的详细信息
数据卷信息 -v 的信息,显示到 docker inspect 的 mounts里面
端口信息
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "11155"
},
[root@docker-200 ~]#
[root@docker-110 ~]# docker exec c66 bash -c "echo hello haohao do i wish you > /usr/share/ng
# 命令修改页面

小结
1.为什么要学习docker网络管理,容器是要提供访问的,以及容器所处的网络环境,ip从哪里获取
2.docker network命令。brctl 命令
3.如何理解docker网桥,虚拟的网络接口veth
4.自建的docker 网桥,设置子网,网关。
```
加强说,ifconfig ,br-自己建网桥id
查出2个网桥接口
[root@docker-200 ~]#ifconfig |grep br-
br-5ab8b0856f15: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
br-a0412ee1f5e5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
# 基于过滤器参数,查找网桥相关的接口
[root@docker-200 ~]#docker network ls --filter driver=bridge
NETWORK ID NAME DRIVER SCOPE
00dafdbf4726 bridge bridge local # 是默认的docker0
5ab8b0856f15 linux0224-net1 bridge local
a0412ee1f5e5 linux0224-net2 bridge local
#brctl命令
[root@docker-200 ~]#brctl show | column -t
bridge name bridge id STP enabled interfaces
br-5ab8b0856f15 8000.024247e06d14 no
br-a0412ee1f5e5 8000.0242ed1d23c5 no vethffee987
docker0 8000.0242ade8ba38 no
[root@docker-200 ~]#
# 分析,为何 br-a04xxxx 这个网桥,只有它有一个 interfaces网络接口,vethffee987
1。查看当前容器进程
[root@docker-200 ~]#docker ps -q
26f8ce308859
2.查看该容器的网络信息
[root@docker-200 ~]#docker inspect 26f8ce308859 --format="{{.NetworkSettings.Networks}}"
map[linux0224-net2:0xc00065e000]
=========================================================
也就是如下信息
"Networks": {
"linux0224-net2": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"26f8ce308859"
],
"NetworkID": "a0412ee1f5e57a69262c1619625a4de1b04e1e212c016cead532260620913a32",
"EndpointID": "485d438d855e7bc7b1e5c719b27b1672819c10edec43b58e4c42d2336ce26b26",
"Gateway": "172.14.0.1",
"IPAddress": "172.14.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:0e:00:02",
"DriverOpts": null
================================================
当前运行中的容器,使用网络配置是 ,名字为 linux0224-net2 的网桥
a0412ee1f5e5 linux0224-net2 bridge local
[root@docker-200 ~]#docker network ls --filter name=linux0224-net2
NETWORK ID NAME DRIVER SCOPE
a0412ee1f5e5 linux0224-net2 bridge local
# 查看网桥和容器的关系
[root@docker-110 ~]# docker network ls --filter driver=bridge
NETWORK ID NAME DRIVER SCOPE
fca76ebba6d5 bridge bridge local
e5c6866dbfd1 linux0224-net1 bridge local
b3ca5dd162d9 linux0224-net2 bridge local
#brctl命令
[root@docker-200 ~]#brctl show | column -t
bridge name bridge id STP enabled interfaces
br-5ab8b0856f15 8000.024247e06d14 no
br-a0412ee1f5e5 8000.0242ed1d23c5 no vethffee987
docker0 8000.0242ade8ba38 no
[root@docker-200 ~]#
# 分析,为何 br-a04xxxx 这个网桥,只有它有一个 interfaces网络接口,vethffee987
1。查看当前容器进程
[root@docker-200 ~]#docker ps -q
26f8ce308859
2.查看该容器的网络信息
[root@docker-200 ~]#docker inspect 26f8ce308859 --format="{{.NetworkSettings.Networks}}"
map[linux0224-net2:0xc00065e000]
也就是如下信息
"Networks": {
"linux0224-net2": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"26f8ce308859"
],
"NetworkID": "a0412ee1f5e57a69262c1619625a4de1b04e1e212c016cead532260620913a32",
"EndpointID": "485d438d855e7bc7b1e5c719b27b1672819c10edec43b58e4c42d2336ce26b26",
"Gateway": "172.14.0.1",
"IPAddress": "172.14.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:0e:00:02",
"DriverOpts": null
当前运行中的容器,使用网络配置是 ,名字为 linux0224-net2 的网桥
a0412ee1f5e5 linux0224-net2 bridge local
[root@docker-200 ~]#docker network ls --filter name=linux0224-net2
NETWORK ID NAME DRIVER SCOPE
a0412ee1f5e5 linux0224-net2 bridge local
# 查看网桥和容器的关
总结
