0
点赞
收藏
分享

微信扫一扫

11、Docker五种网络连接模式

Docker网络连接有几种模式

五种:
1、none
2、bridge               
3、host       
4、container
5、network-name(自定义网络)

Docker 网络连接模式

查看默认的网络模式

[root@ubuntu2004 ~]#docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
a6464c9a1e3a   bridge    bridge    local
65a8cdfd3a52   host      host      local
b2a0a8397430   none      null      local

网络模式指定

默认新建的容器使用Bridge模式,创建容器时,docker run 命令使用以下选项指定网络模式格式

docker run --network <mode> 
docker run --net=<mode> 
<mode>: 可是以下值
none 
bridge 
host 
container:<容器名或容器ID> 
<自定义网络名称>

1、bridge网络模式(默认的网络模式)

是docker的默认模式,即不指定任何模式就是bridge模式,也是使用比较多的模式,此模式创建的容器会为每一个容器分配自己的网络IP等信息,并将容器连接到一个虚拟网桥与外界通信

可以和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以让容器被外部主机访问,所以此模式也称为NAT模式 
此模式宿主机需要启动ip_forward功能(默认开启)
sysctl -a |grep ip_for

bridge网络模式的特点

网络资源隔离: 不同宿主机的容器无法直接通信,各自使用独立网络 
无需手动配置: 容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改 
可访问外网: 利用宿主机的物理网卡,SNAT连接外网 
外部主机无法直接访问容器: 可以通过配置DNAT接受外网的访问 
低性能较低: 因为可通过NAT,网络转换带来更的损耗 
端口管理繁琐: 每个容器必须手动指定唯一的端口,容器产生端口冲容

2、Host模式(和宿主机共享网络)

容器内除网络以外的其它资源,如: 文件系统,系统进程等仍然和宿主机保持隔离

Host 网络模式特点: 

使用参数 -network host 指定
共享宿主机网络 
网络性能无损耗 
网络故障排除相对简单 
各容器网络无隔离 
网络资源无法分别统计 
端口管理困难: 容易产生端口冲突 
不支持端口映射

创建Host模式的容器

清空容器
docker rm -f `docker ps -qa` 
创建容器,不需要端口映射,要防止端口冲突
[root@ubuntu2004 nginx]#docker run --network host -d --name nginx01 nginx:v1.22.0-1
b4304357c907916a657c9cc927e53f8a6ca117d0d4ed70f7fc2e977ec2dcd2cb
外部可以通过宿主机直接访问
[root@ubuntu2004 ~]#curl 10.0.0.101
docker website
优点:直接通讯,性能最好   缺点:容易造成冲突。

3、none模式

在使用none模式后,Docker 容器不会进行任何网络配置,没有网卡,没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用

none模式特点 
使用参数 --network none 指定 默
认无网络功能,无法和外部通信 无法实现端口映射 
适用于测试环境

启动none模式的容器

清空容器
docker rm -f `docker ps -qa` 
[root@ubuntu2004 nginx]#docker run --network none -d --name nginx01 nginx:v1.22.0-1
进入容器查看ID
[root@ubuntu2004 nginx]#docker exec -it nginx03 bash
root@a984c9225ffe:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
没有网卡,和外部和宿主机无法通讯

4、container模式

先创建一个容器,再创建第二个容器时和第一个容器共享一个网络。

清空容器
docker rm -f `docker ps -qa` 
先创建一个容器
[root@ubuntu2004 nginx]#docker run -d --name nginx01 -p 80:80 nginx:v1.22.0-1
再创建第二个容器时和第一个容器共享一个网络
[root@ubuntu2004 nginx]#docker run --name nginx02 --network container:nginx01 ubuntu:20.04-20221018-v2.0 sleep 1000

分别进入两个容器,查看ip信息
[root@ubuntu2004 nginx]#docker exec -it nginx01 bash
root@65cb8e30a982:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
76: eth0@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:64:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.100.2/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever
查看第二个容器IP
[root@ubuntu2004 nginx]#docker exec -it nginx02 bash
root@65cb8e30a982:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
76: eth0@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:64:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.100.2/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever

使用container容器共享网络实现wordpress持久化

先清空上面的数据
rm -rf /data/wordpess /data/mysql/
清空容器
docker rm -f `docker ps -qa` 

跑容器
[root@ubuntu2004 ~]#docker run -d -p 80:80 --name wordpress  -v /data/wordpess:/var/www/html --restart=always  wordpress:php7.4-apache

跑容器
[root@ubuntu2004 ~]#docker run --network container:wordpress  -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql -d  -v /data/mysql:/var/lib/mysql --restart=always mysql:8.0.29-oracle
访问宿主机IP10.0.0.101
数据库地址:127.0.0.1

通过容器模式实现LNP架构

清空容器
docker rm -f `docker ps -qa` 
#准备nginx连接php-fpm的配置文件
[root@ubuntu2004 ~]#mkdir /data/nginx/conf.d/ -p
[root@ubuntu2004 ~]#vim /data/nginx/conf.d/php.conf
server {
     listen 80;
     server_name www.meng.net;
     root /usr/share/nginx/html;
     index index.php;
      location ~ \.php$ {
          root          /usr/share/nginx/html;
          fastcgi_pass  127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include       fastcgi_params;
    }
}

#准备php的测试页文件
[root@ubuntu2004 nginx]#vim /data/nginx/html/index.php
<?php
phpinfo();
?>

#启动nginx容器:
[root@ubuntu2004 ~]#docker run -d -v /data/nginx/conf.d/:/apps/nginx/conf/conf.d/ -v /data/nginx/html/:/usr/share/nginx/html/ --name nginx01 -p 80:80 nginx:v1.22.0-1

#启动PHP-fpm,自动去官网拉取
[root@ubuntu2004 ~]#docker run -d --network container:nginx01 --name php-fpm -v /data/nginx/html/:/usr/share/nginx/html/ php:8.1-fpm
访问www.meng.net   可以访问到页面

5、自定义网络模式(不支持host和none,默认是bridge模式)用对方的容器名可以相访问,不需要--link
适合mysql主从复制,放在一个网络里面

docker network create -d <mode> --subnet <CIDR> --gateway<网关><自定义网络名称>
#注意mode不支持host和none,默认是bridge模式

案例:
[root@ubuntu2004 ~]#docker network create --subnet  192.178.0.0/16 --gateway 192.178.0.1 test-net
查看网络模式
[root@ubuntu2004 ~]#docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
741323e3d6fa   bridge     bridge    local
65a8cdfd3a52   host       host      local
b2a0a8397430   none       null      local
55dd2548b5f5   test-net   bridge    local
查看自定义网络详细信息
[root@ubuntu2004 ~]#docker inspect test-net

创建容器并且使用自定义网络
[root@ubuntu2004 ~]#docker run -d --name nginx01 --network test-net -p 80:80 nginx:v1.22.0-1
[root@ubuntu2004 ~]#docker run -d --name nginx02 --network test-net -p 81:80 nginx:v1.22.0-1
查看nginx01、02的IP使用情况
[root@ubuntu2004 ~]#docker exec nginx01 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:b2:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.178.0.2/16 brd 192.178.255.255 scope global eth0
       valid_lft forever preferred_lft forever
查看nginx01、02的路由
[root@ubuntu2004 ~]#docker exec nginx01 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.178.0.1     0.0.0.0         UG    0      0        0 eth0
192.178.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
看是可以和外网通讯
[root@ubuntu2004 ~]#docker exec nginx02 ping www.baidu.com
PING www.a.shifen.com (124.237.176.4) 56(84) bytes of data.
64 bytes from 124.237.176.4 (124.237.176.4): icmp_seq=1 ttl=127 time=14.0 ms


举报

相关推荐

0 条评论