docker的网络模式:

1、桥接模式:创建docker时不需要指定网络类型,默认模式。
2、host模式: 容器将不会虚拟出自己的网卡,也没有自己的ip地址,全部使用宿主机的ip和端口。
3、container模式:容器和容器之间共用一个ip地址和端口。
4、nono模式:docker容器有自己的network-space,但是这个容器没有任何网络设置。这个容器没有网卡,没有ip,没有路由,只有lo回环网络。在none模式下,容器不可以联网。
5、自定义网络:我们可以给创建一个自己定义网段。

桥接模式(docker默认模式)

桥接模式:一种共享通信的方式,用于连接两个不同网络段的设备
桥接设备工作在osi模型的第二层,数据链路层,转发数据帧,根据mac地址。类似于交换机,只能转发同一网段,通过泛洪广播请求mac地址。

docker网络就是基于桥接模式实现的:

1.虚拟网络桥:安装开启docker之后, docker进程就会自动创建一个虚拟网络桥(docker0),
是一个虚拟的网络设备,类似于物理网络设备的交换机。 

2、分配唯一的ip地址, 每次运行一个容器, docker进程都会分配唯一的且未被其他容器占用的ip地址给容器。这个IP地址是桥接模式网络的子网中。

3、容器和主机通信:通过桥接模式,容器可以和主机直接通信,容器可以访问主机上的运行服务。主机也可以通过桥接网络docker:0,来访问容器的进程(iptables的nat地址转换,在主机上做了地址转换)

docker的网桥是宿主机虚拟出来的,并不是一个真正存在的网络设备,外部网络无法找到。外部网络无法直接访问docker:0分配给容器的ip地址。
可以给容器做一个端口映射。容器创建完成后,端口不能做映射。

实际上,docker是在宿主机和容器之间做了一个iptables的Nat地址转换。

随机端口映射

docker run -itd --name 容器名 -P 镜像:版本号 /bin/bash

-P 在创建容器时。在宿主机和容器之间做一个端口映射。不加端口,随机给。容器的端口是不变的。

例
docker run -itd --name testl -P nginx:1.22.0 /bin/bash

指定端口映射

docker run -itd --name 容器名 -p linux端口:容器端口 镜像:版本号 /bin/bash
-p:指定端口,人为设置固定的端口映射。指定端口进入容器开启服务。
例
docker run -itd --name testl -p 4300:80 nginx:1.22.0 /bin/bash

host模式

容器将不会虚拟出自己的网卡,也没有自己的ip地址,全部使用宿主机的ip和端口。
创建容器时可以指定网络模式 --network host

docker run -itd --name 容器名 --network host 镜像名:版本号 /bin/bash

例
docker run -itd --name test1 --network host nginx /bin/bash

公用模式,如果是单个容器运行,可以使用host模式。

container模式:

容器和容器之间共用一个ip和端口

docker run -itd --name 容器名 -- network=container:容器名 镜像名:版本号 /bin/bash

例
docker run -itd --name test2 -- network=container:test1 nginx:latest /bin/bash

nono模式:

docker容器有自己的network-space,但是这个容器没有任何网络设置。这个容器没有网卡,没有ip,没有路由,只有lo回环网络。在none模式下,容器不可以联网。用于容器功能测试。

docker run - itd --name 容器名 --network=none 镜像名:版本号 /bin/bash

docker run - itd --name test4 --network=none nginx:laster /bin/bash

自定义网络:

可以给docker创建一个自定义网段。虚拟机内可以访问,win不可以

查看docker的网络信息

docker network ls
-------------------------------------------------------------------------------------------

NETWORK ID     NAME      DRIVER    SCOPE

NETWORK ID这个是docker网络唯一的网络id
NAME	docker网络的名称
DRIVER	docker网络的动程序
SCOPE	表示网络的作用范围

-------------------------------------------------------------------------------------------
创建容器网络
docker network create --subnet=网段 --opt "com.docker.network.bridge.name" ="自定义网卡名称" 自定义网络的名称

例:
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name" ="docker1" mynetwork

docker network create创建一个docker虚拟网卡
--subnet=172.18.0.0/16:自定义一个网段和声明子网掩码
--opt "com.docker.network.bridge.name"="docker1":可以不加,但是网卡名称比较难以识别。
mynetwork:自定义网络的名称
创建容器并指定IP地址
docker run -itd --name 容器名 --network bridge --ip ip地址 镜像名:版本号 /bin/bash

例
docker run -itd --name nginx1 --network bridge --ip 172.18.0.10 nginx:latest /bin/bash