docker 网络模式修改

docker 网络模式得修改以及调整或叫做一些参数的修改

我们会发现docker其实现在工作完了以后,它已经有了它固定的一些默认的值了,比如他的默认网桥叫做docker0,并且他的地址是默认的172.17.0.1

范例:

#查看docker0网桥
[11:26:57 root@docker ~]#ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:8aff:fec8:f42d  prefixlen 64  scopeid 0x20<link>
        ether 02:42:8a:c8:f4:2d  txqueuelen 0  (Ethernet)
        RX packets 17516  bytes 818657 (799.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27653  bytes 207788972 (198.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

那我们可以不可以对它做些一些修改呢?其实是可以的。那接下来我们就看一下到底有那些值可以让我们去修改。

7.3.1 docker进程网络修改

docker进程的修改相当于是docker主程序的修改,它只要修改以后后面的所有容器都会做出相同的修改。因为docker是主,容器是支线,等于说是主都改了相对来说支线也需要修改。

第一个:

-b 或者等同于 --bridge=""#指定docker使用的网桥设备,默认情况下docker 会自动创建和使用docker0网桥设备,通过此参数可以使用已经存在的设备

#如果我们自己通过一些其他的方案创建了一个叫做docker1,并且此时想把网桥改了成docker1的话,那可以在我们的主配置文件中添加--bridge的参数让他生效

第二个(用的不多):

--bip#指定 docker0 的IP和子网掩码,可以使用CIDR的标准表达方式,也就是/8 /16 /24的写法

--bip有什么目的或者有什么作用呢,如果我们想让运行在不同主机上的容器进行通讯,这时候就会带来一个问题,就是他们两个主机上的 docker0 地址都是一样的话,那它们之间分配给容器的IP可能也是一样的,这时候我们就没办法通过我们的三层网络或者是更高级的融合网络,来让他们之间进行通讯,因为IP冲突,那这个时候我们就可以通过 --bip指定一个新的网段即可。这个一般我们用的不太多,在后面的资源管理的时候他会默认的调取

第三个(用的不多):

--dns#指定我们配置容器的DNS服务,只要在我们的主进程里修改以后,后面的容器同时修改。

7.3.2 docker 容器网络修改

上面呢是进程网络修改,现在呢这里是容器网络修改。进程修改完成以后所有的容器全部生效,容器网络修改只在启动的容器生效

第一个:

 --dns#用于指定启动的容器的DNS

第二个:

--net :#用于指定容器的网络通讯方式,常见有以下四个值。
        bridge:     #docker默认方式,网桥模式,如果是默认情况的话它的值就等于--net=bridge,也就是通过网桥去进行所谓的数据通讯,并且是隔离化的。
        none:       #如果等于 --net=none的时候他就没有任何的ip地址了,也就是下面的范例。
        container:  #也就是使用别的网络容器栈,docker容器会假如其他容器的network namespace。也就是两个容器在同一个网络环境下,相当于本机的访问。
        host:       #这个等同于直接把我们本机的一些端口,或将它启动的一些服务暴露给本机用户,不需要加 -p的方式就能够访问到 

--net=none范例:

有些容器没必要有网络,比如有些容器是要做计算的,计算完的数据直接放到本地宿主机即可。如果有网络以后反而不安全。所有有些特殊容器我们可以通过--net=none的方式让他没有网络,只能自己和自己通讯。这样提升了网络的安全性。

#启动一个nginx容器,并且添加了--net=none参数
[14:32:56 root@docker ~]#docker run --name nginx --net=none -d nginx-1.19.1:alpine-3.12 
29690e74ba77df086dfb8343f7ae95fe2f921657b06a5e6ff3ae4c19d9f6ec25

#进入到该容器中
[14:33:22 root@docker ~]#docker exec -it nginx sh

#通过ifconfig命令查看已经没有了IP地址和eth0网卡因为我们在启动docker的时候添加了--net=none的参数,也就意味着当前容器只有一个回环网卡
/ # ifconfig 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

--net=host范例:

我们没有加 -p选项为什么hi暴露出来,因为现在这个容器的网络命名名称空间和我们现在的宿主机操作系统,它们两个是处于同一个网络命名名称空间中,也就是它两是处于同一个位置的,这样的话本机拥有了80端口的服务所以能够直接访问,这种方式呢更开放,但是安全性更低(谨慎使用)

#这里我通过在启动容器的时候加上 --net=host参数。
[14:56:16 root@docker ~]#docker run --name nginx1 --net=host -d nginx-1.19.1:alpine-3.12

#通过curl 访问本机的80端口
[14:56:20 root@docker ~]#curl localhost:80/webserver
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.19.1</center>
</body>
</html>

浏览器访问宿主机:

http://10.0.0.117/webserver/

7.3.3 暴露端口

暴露端口我们刚才已经讲过了上面哪几种暴露端口的方式,如果容器暴露给容器我们可以使用container、也可以使用bridge之间通过IP地址访问,或者可以使用host,直接把我们容器的端口暴露给主机。那外网用户就可以直接访问我们的主机,这都不是常用的方案,常用的方案就是加-P选项的bridge方案。

-p/P选项的使用格式
    -p :<containerport> 将制定的容器端口映射至主机所有地址的一个动态端口,也就意味着容器端口有了,但是要访问那个主机端口,不好意思这是随机的所以不知道。
    -p <hostport>:<containerport>:也就意味着把我们主机的固定端口配置给我们的容器内部端口,这才是我们最常用的一种方案
    -p <IP>::<containerport>:将本机的IP与我们宿主机的某一个动态端口进行绑定,绑定至我们的容器端口
    -p <IP>:<hostport>:<containerport>:也就是将我们的IP地址与我们的主机端口,加上我们的容器端口进行绑定
    -P(这里是大P):暴露所有需要端口,也就是只要是我们在dockerfile通过我们的port暴露的端口,也就意味着相当于在我们的docker ps 中能够查看,当然暴露完了之后也是一个随机端口
    
* docker port ContainerName 可以常看容器当前的映射关系
[15:45:42 root@docker ~]#docker port nginx1
80/tcp -> 0.0.0.0:80
#这是将容器的80端口映射到了宿主机上的80端口

7.3.4 自动逸docker0网桥的网络地址

除了我们前面的修改,还可以去修改我们docker0的相关配置。如果我们不想让docker0默认是172.17.0.0/24网段的话,我们可以在/etc/docker/daemon.json文件中去说明

以上就是对docker网络模式的修改

点赞