【docker】网络使用和配置

发布时间:2023年12月19日

Docker 网络模式和功能

  • 默认网络模式(bridge):Docker 默认使用 bridge 网络模式,创建一个名为 docker0 的虚拟网桥,并为每个容器分配一个 IP 地址。容器间可以通过 IP 地址相互通信
  • 主机模式(host): 使用主机模式时,容器直接使用宿主机的网络,与宿主机共享网络接口。容器的网络配置与宿主机相同,可以通过宿主机的 IP 地址直接访问容器。
  • 容器间通信: Docker 提供了容器间通信的功能,可以通过容器名称或 IP 地址进行通信。例如,可以使用容器名称作为主机名,在容器间建立连接。
  • 端口映射(Port Mapping): Docker 允许将容器内的端口映射到宿主机的端口上,以便容器服务可以通过宿主机 IP 和端口访问。可以使用 -p 或 --publish 参数来指定映射规则。
  • 自定义网络(Custom Networks): Docker 允许创建自定义网络,以便在一个自定义的网络中连接多个容器。自定义网络可以提供更好的隔离和网络管理。可以使用 docker network create 命令创建自定义网络。
  • DNS 解析: Docker 提供了内置的 DNS 服务,容器可以使用容器名称作为主机名进行 DNS 解析。容器可以通过主机名访问其他容器或外部服务

docker启动容器时用--net选项指定容器的网络模式


Docker有以下4种网络模式:
  • bridge模式:使--net =bridge指定,默认设置;
  • host模式:使--net =host指定;
  • none模式:使--net =none指定;
  • container模式:使用--net =container:NAME orID指定。
    ?

bridge模式(Docker 默认网桥)

默认选择bridge的情况下,容器启动后会通过DHCP获取一个地址.

安装Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

docker network ls 

Docker 安装时会自动在 host 上创建三个网络:none,host,和bridge。
brctl show

查看bridge网络
docker network inspect bridge

启动一个容器
 docker run --name nginx-demo -p 8086:80 -d chengxuyuanshitang/nginx:v3

查看创建的创建桥接网络
ip addr

?多个容器通信

创建一个自定义网络,用于容器间的通信

docker network create testnetwork

启动 Nginx 服务器容器,并连接到自定义网络

 docker run --name nginx-demo --network=testnetwork -p 8086:80 -d chengxuyuanshitang/nginx:v3

启动mysql 服务器容器,并连接到自定义网络

docker run -itd --name mysql-demo --network=testnetwork  -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

Nginx 服务器容器和mysql 数据库容器都连接到同一个自定义网络?testnetwork,它们可以使用容器名称进行通信。

host网络模式

Host 网络模式是 Docker 中的一种网络模式,它与默认的 bridge 模式不同。在 Host 网络模式下,容器与宿主机共享网络命名空间,直接使用宿主机的网络接口进行通信,而不是创建一个单独的网络栈。

  • 网络共享: 容器直接使用宿主机的网络接口,与宿主机共享相同的 IP 地址和网络配置。这使得容器可以直接访问宿主机所连接的网络,并且无需进行端口映射。
  • 网络性能: 由于容器与宿主机共享网络栈,容器中的网络性能通常更高。容器与宿主机之间的通信不需要经过网络桥接层,减少了网络转发的开销
  • 要使用 Host 网络模式启动容器,可以在 docker run 命令中使用 --net=host 参数
  • 在 Host 网络模式下,容器将无法使用宿主机上已占用的端口。因此,在启动容器之前,请确保宿主机上的相应端口未被其他服务占用。
  • Host 网络模式会使容器与宿主机紧密耦合,容器将直接使用宿主机的网络资源。因此,需要谨慎使用 Host 网络模式,以确保安全性和隔离性。
  • 使用 Host 网络模式时,容器的网络配置(例如 IP 地址、子网掩码、网关等)将与宿主机完全相同,无需进行额外的网络配置。
  • Host 网络模式适用于一些特定的场景,如需要容器直接与宿主机网络进行交互、需要最大限度提高网络性能的情况等。

启动 Nginx 服务器容器,并连接到自定义网络

 docker run --name nginx-demo  --net=host --privileged=true  -p 8086:80 -d chengxuyuanshitang/nginx:v3

?查看网卡
ip addr

container模式

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

创建新容器的时候,通过--net container参数。

--network container:[容器名或容器ID]
# docker inspect 容器别名 | grep IPAddress

docker inspect nginx-demo | grep IPAddress
启动服务
docker run -it --name nginx-demo3  --net container:nginx-demo  -d nginx:test

如果加了参数 -p?8087:80。提示: docker: Error response from daemon: conflicting options: port publishing and the container type network mode.

docker run的时候,不能使用-p,因为-p是手动指定端口,而container模式的ip和端口是不受container模式的容器自身控制,它的IP和端口,相当于完全委托给第一个以桥接方式启动的容器了。

??查看网卡
ip addr

对比两个容器发现:

第一个以桥接方式启动的容器的网络信息是全套的,ip 端口 网关,都有。

第二个以container模式启动容器的网络信息,发现毛都没有,都是空的。

none模式(很少被使用)

Docker网络none模式是指创建的容器没有网络地址,只有lo网卡,在无网络模式下,容器没有网络接口,无法与外部网络通信。该模式主要用于一些特殊场景,如只需要运行一个进程的容器或与网络无关的容器。

启动服务
docker run --name nginx-demo4  --net=none  -d nginx:test
???查看网卡
ip addr

宿主机的网卡列表没有任何变化。

查看容器的端口启用情况

查看none网络模式下,容器的网络信息




文章来源:https://blog.csdn.net/wochunyang/article/details/135081222
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。