Docker(四):网络管理

一:Docker网络介绍

Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络
docker安装后提供三种网络模式:

root@unode01:~/docker# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4f3c6b18b22b        bridge              bridge              local
7725e4fc9bf6        host                host                local
10d3b60156b1        none                null                local

bridge:表示桥接网络(不是物理桥,是NAT桥),如 docker0网卡,既扮演二层的交换设备,又扮演二层的网卡设备,如果不给该网卡IP地址,它就是交换机;给它IP地址既能当交换机,又能充当网卡。每创建一个容器会创建一对网卡,一半在容器里,一半在宿主机上(也就是使用ip addr命令出来的类似 veth550cec7@if40 的网卡)且该网卡还被关联到 docker0 网卡上

apt install -y bridge-utils
root@unode01:~/docker# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02425013153d       no              vethfeaf0ad  # 目前docker0网卡只关联了vethfeaf0ad,因为本机上只运行了一个容器
root@unode01:~/docker# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:70:0d:3c brd ff:ff:ff:ff:ff:ff
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
    link/ether 02:42:50:13:15:3d brd ff:ff:ff:ff:ff:ff
13: vethfeaf0ad@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
    link/ether 9a:24:fc:00:d0:3a brd ff:ff:ff:ff:ff:ff link-netnsid 0
# 其中vethfeaf0ad@if12中的 if12 就表示另外的一半网卡,没显示出来,是因为这一半在容器中

1.1 none 网络

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

root@unode01:~/docker# docker run -it --network=none busybox

我们不禁会问,这样一个封闭的网络有什么用呢?其实还真有应用场景。封闭意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。当然大部分容器是需要网络的,我们接着看 host 网络。

1.2 host 网络

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

docker run -it --network=host busybox

相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
例如,我们在10.10.0.186/24的机器上用host模式启动一个含有nginx应用的Docker容器,监听tcp80端口。

# 运行容器;
$ docker run --name=nginx_host --net=host -p 80:80 -d nginx
74c911272942841875f4faf2aca02e3814035c900840d11e3f141fbaa884ae5c
# 查看容器;
$ docker ps  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
74c911272942        nginx               "nginx -g 'daemon ..."   25 seconds ago      Up 25 seconds                           nginx_host

当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.0.186:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

$ netstat -nplt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      27340/nginx: master

1.3 Container

在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

1.4 Bridge

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.0.186/24。
Docker Bridge网络模式

二:端口映射

Docker 端口映射
随机端口映射:

[root@node01 ~]# docker run --name nginx01 -d -P nginx				# 端口随机映射
a0ca86041540075ae7e0af2c4cfc0d0e85b485b392baf70a42579d2d1105425e 
[root@node01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
9583a1aec364        nginx               "nginx -g 'daemon ..."   7 seconds ago       Up 6 seconds        0.0.0.0:32768->80/tcp   silly_einstein
# -P 随机映射;上面PORTS列意思为:宿主机的32768端口映射到容器中的80端口

指定端口映射:

[root@node01 ~]# docker run --name mynginx -d -p 81:80 nginx 			# 指定端口映射
aeae43372d87bd7b5fd42f86b8f9e65891fb35d34c3cfb7deb88eedc115e2f49
[root@node01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
aeae43372d87        nginx               "nginx -g 'daemon ..."   44 seconds ago      Up 44 seconds       0.0.0.0:81->80/tcp   mynginx

只查看docker的端口映射信息:

[root@node01 ~]# docker port mynginx
80/tcp -> 0.0.0.0:81

多端口映射:

[root@node01 ~]# docker run -d -p 443:443 -p 82:80 --name nginxv2 nginx
71de53fc39cc833119731c233c0b112439acc6d49b099c2344af42ed689f3370
[root@node01 ~]# docker port nginxv2
80/tcp -> 0.0.0.0:82
443/tcp -> 0.0.0.0:443
发布了45 篇原创文章 · 获赞 3 · 访问量 1534

猜你喜欢

转载自blog.csdn.net/pcn01/article/details/103006208