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
docker run --net=
: 可是以下值
none
bridge
host
container:
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: 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: 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: 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: 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: 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
#启动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 --subnet --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: 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: 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
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com