欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker 网络

程序员文章站 2022-04-19 11:22:24
...

一、Docker自带的三个网络

Docker安装时会自动在host主机上创建三个网络,可以通过docker network ls命令查看当前默认的三个网络。

查看docker当前的网络:

[aaa@qq.com ~]# docker network ls

1、none网络

none网络就是什么都没有的网络。
挂在这个网络下的容器除了lo回环接口,没有其他任何网卡。
容器创建时,可以通过–network=none指定容器使用none网络。

通过busybox镜像启动一个指定none网络的容器:

[aaa@qq.com ~]# docker run -it --network none busybox

2、host网络

连接到host网络的容器共享Docker host的网路栈,容器的网络配置与host主机完全一样。
可以通过–network=host指定使用host网络。

通过busybox镜像启动一个指定host网络的容器:

[aaa@qq.com ~]# docker run -it --network host busybox

3、bridge网络

查看当前的网桥(虚拟交换机)都有哪些:

[aaa@qq.com ~]# brctl show

bridge name	bridge id		STP enabled	interfaces
docker0		8000.02423e804b5f	no		
virbr0		8000.5254006dbfe7	yes		virbr0-nic

通过busybox镜像启动一个指定bridge网络的容器,然后再次查看当前的网桥信息:

[aaa@qq.com ~]# docker run -dt --network bridge busybox
[aaa@qq.com ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02423e804b5f	no		veth1876355
virbr0		8000.5254006dbfe7	yes		virbr0-nic

容器的网络挂在docker0上了
这种网络可以访问外网,但是外网访问不到内网

二、自定义容器网络

除了none,host,bridge这三个自动创建的网络,用户也可以根据业务需要创建user-defined网络。

Docker提供三种user-defined网络驱动:bridge,overlay和macvlan。overlay和macvlan用于创建跨主机的网络。

创建一个指定bridge模式的网络(当然不指定的话,默认就是为bridge模式):

[aaa@qq.com ~]# docker network create --driver bridge my_net1
dfce9ff313a78d2eed1e861443a2168c5895008ade4827b226cd8a7bedac11ca
[aaa@qq.com ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9cb85ec8a7b9        bridge              bridge              local
694de36b4e58        host                host                local
dfce9ff313a7        my_net1             bridge              local
f1a1d1ca6111        none                null                local

查看当前的网桥信息:

[aaa@qq.com ~]# brctl show
bridge name	    bridge id	         	STP enabled	    interfaces
br-dfce9ff313a7	 	8000.024248124e5f	no		
docker0		8000.02423e804b5f     no		  veth1876355
						veth54a8b07
virbr0		8000.5254006dbfe7	yes		virbr0-nic

2.创建一个指定ip网段的容器网络

[aaa@qq.com ~]# docker network create --driver bridge --subnet   172.10.0.0/24  --gateway 172.10.0.1  my_net2
4558fc8e6850e57d3ef18794025be3bd2b94d0f3a98fbadf1b812812d27cf9f3

查看

[aaa@qq.com ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9cb85ec8a7b9        bridge              bridge              local
694de36b4e58        host                host                local
dfce9ff313a7        my_net1             bridge              local
4558fc8e6850        my_net2             bridge              local
f1a1d1ca6111        none                null                local

容器使用新的网络时要指定一下:

[aaa@qq.com ~]# docker  run   -it    --network   my_test2   centos:latest   bash
[aaa@qq.com /]# ip a

16: aaa@qq.com: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
link/ether 02:42:ac:0a:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.10.0.2/24 brd 172.10.0.255 scope global eth0
   valid_lft forever preferred_lft forever

指定静态ip:

[aaa@qq.com ~]# docker   run   -it   --network  my_test2 --ip 172.10.0.10 centos:latest    bash

18: aaa@qq.com: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
link/ether 02:42:ac:0a:00:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.10.0.10/24 brd 172.10.0.255 scope global eth0
   valid_lft forever preferred_lft forever

确保开启了路由转发

[aaa@qq.com ~]# sysctl    -a |grep  ip_forward
net.ipv4.ip_forward = 1

容器访问外部
通过busybox镜像启动一个容器,然后查看与外网的连通性:

[aaa@qq.com ~]# docker run -it busybox
/ # ping baidu.com
PING baidu.com (39.156.69.79): 56 data bytes
64 bytes from 39.156.69.79: seq=0 ttl=127 time=9.112 ms

外网访问容器:
启动一个未指定映射端口的容器在后台运行:

[aaa@qq.com ~]# docker run -d -p 80 httpd

查看docker容器映射的端口:

[aaa@qq.com ~]# docker port 9dcbc538935
80/tcp -> 0.0.0.0:32768

测试浏览器访问容器服务:

访问地址:192.168.2.100:32768

docker 网络