Docker-------网络模式

article/2025/5/19 5:29:10

目录

前言

一、Docker 网络实现原理 

二、Docker的网络模式

1、Host模式

2、Container模式 

3、none模式 

4、 bridge模式

三、自定义网络

1、查看网络模式列表 

2、查看容器信息(包含配置、环境、网关、挂载、cmd等等信息) 

3、指定分配容器IP地址 

4、自定义网络固定IP 

四、暴露端口 

五、为容器创建端口映射 

总结

1、Docker网络模式有哪些?分别提供哪些功能? 

2、如何把脚本传入一个已经运行的容器

3、docker中,假设运行一个业务容器,但是业务容器需要暴露三个端口,启动后发现自己少加了一个端口。如何动态添加端口(如何对已经运行的容器添加或者修改端口)? 


前言

一、Docker 网络实现原理 

  1. docker使用linux桥接,在宿主机虚拟一个docker容器网桥(docker0)
  2. docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP
  3. 同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP直接通信。

docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主机(端口映射),即docker run 创建容器的时候,通过-p或者-P参数来启用。访问容器的时候,就通过【宿主机IP】:【容器端口】访问容器。

二、Docker的网络模式

Host:容器不会虚拟出自己的网卡,配置主机的IP等,而是使用宿主机的IP和端口

Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口的范围。

None:该模式关闭了容器的网络功能。

Briidge:默认为该模式,桥接,此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0的虚拟网桥,通过docker0 网桥以及iptables nat表配置与宿主机通信

1、Host模式

  1. host模式:使用–net=host指定
  2. 相当于VMware中的桥接模式,与宿主机在同一个网络中,但是没有独立IP地址
  3. Docker 使用了Linux 的Namespace 技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace 隔离网络等。
  4. 一个Network Namespace 提供了一份独立的网络环境,包括网卡,路由,iptable 规则等都与其他Network Namespace 隔离。
  5. 一个Docker 容器一般会分配一个独立的Network Namespace

但是如果启动容器的时候使用host 模式,那么这个容器将不会获得一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace 。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口.此时容器不再拥有隔离的、独立的网络栈,不拥有所有端口资源。

#创建容器web 1,指定网络模式为 host
#因为是host模式,所有宿主机和容器共享ip和端口docker run -d --name web1 --net=host nginx#访问宿主机的ip和80端口,则可以访问到web3的nginx服务firefox  http://192.168.63.20:80

2、Container模式 

  1. container模式: 使用–net=contatiner:NAME_or_ID 指定
  2. 这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。**新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等。**可以在一定程度上节省网络资源,容器内部依然不会拥有所有端口。
  3. 同样,两个容器除了网络方面,其他的如文件系统,进程列表等还是隔离的。
  4. 两个容器的进程可以通过lo网卡设备通信

#基于镜像centos:7 创建一个名为test1的容器
[root@docker ~]#: docker run -itd --name test1 centos:7 /bin/bash
5cde2ff96b6d706fb159b31f3e023cadefbdbd6c2c203a31163f9359f8363e61#查看容器的pid号
[root@docker ~]#: docker inspect -f '{{.State.Pid}}' test1
22955#查看该容器的命名空间编号
[root@docker ~]#: ls -l /proc/22955/ns
总用量 0
lrwxrwxrwx. 1 root root 0 7月  18 11:19 ipc -> ipc:[4026532751]
lrwxrwxrwx. 1 root root 0 7月  18 11:19 mnt -> mnt:[4026532749]
lrwxrwxrwx. 1 root root 0 7月  18 11:18 net -> net:[4026532754]
lrwxrwxrwx. 1 root root 0 7月  18 11:19 pid -> pid:[4026532752]
lrwxrwxrwx. 1 root root 0 7月  18 11:19 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 7月  18 11:19 uts -> uts:[4026532750]#创建test2容器,使用container网络模式,和test1共享network Namespace
[root@docker ~]#: docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
bb4ac525abc96725a8b8ef80c67b1e018ac3cb2b247041d7048cea2e9868f216#查看test2容器的pid
[root@docker ~]#: docker inspect -f '{{.State.Pid}}' test2
23046#查看该容器的命名空间编号
[root@docker ~]#: ls -l /proc/23046/ns
总用量 0
lrwxrwxrwx. 1 root root 0 7月  18 11:20 ipc -> ipc:[4026532826]
lrwxrwxrwx. 1 root root 0 7月  18 11:20 mnt -> mnt:[4026532824]
lrwxrwxrwx. 1 root root 0 7月  18 11:20 net -> net:[4026532754]
lrwxrwxrwx. 1 root root 0 7月  18 11:20 pid -> pid:[4026532827]
lrwxrwxrwx. 1 root root 0 7月  18 11:20 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 7月  18 11:20 uts -> uts:[4026532825]

3、none模式 

  1. none模式:使用 --net=none指定
  2. 使用none 模式,docker 容器有自己的network Namespace ,但是并不为Docker 容器进行任何网络配置。也就是说,这个Docker 容器没有网卡,ip, 路由等信息。
  3. 这种网络模式下,容器只有lo 回环网络,没有其他网卡。
  4. 这种类型没有办法联网,但是封闭的网络能很好的保证容器的安全性
  5. 该容器将完全独立于网络,用户可以根据需要为容器添加网卡。此模式拥有所有端口。(none网络模式配置网络)
  6. 特殊情况下才会用到,一般不用

4、 bridge模式

bridge模式是docker的默认网络模式,不写 – net参数,就是bridge模式。

相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。

  1. 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
  2. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
  3. Docker将veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过 brctl show 命令查看。
  4. 容器之间通过veth pair进行访问
  5. 使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables
  6. -t nat -vnL 查看。

[root@docker ~]#: docker run -itd --name test3 centos:7 /bin/bash
dd8d1feca65356a36a834bab290228b4fa9b0a921db93c12eb20cfbb0036371c
[root@docker ~]#: docker inspect test3 | grep -i 'networkmode'"NetworkMode": "default",
[root@docker ~]#: 

三、自定义网络

1、查看网络模式列表 

docker network ls

2、查看容器信息(包含配置、环境、网关、挂载、cmd等等信息) 

docker inspect  容器ID

3、指定分配容器IP地址 

docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#以上会报错,因为用户使用的ip地址不被规则所允许,docker0定义的就是按照顺序来,所有需要创建一个docker network create --subnet=172.18.0.0/16 lcdb

 进入容器 

docker exec -it test2 bash
yum install -y net-tools

查看容器的网卡信息 

4、自定义网络固定IP 

docker network 【--network bridge】 create --subnet=172.18.0.0/16 lcdbdocker run -itd --name test4 --net lcdb --ip 172.18.0.8 centos:7 /bin/bashdocker inspect test4 | grep IPAdress

四、暴露端口 

两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要在docker0上做一个端口映射,通过ens33暴露出去端口不同就可以了

-p 自定义端口 ( 宿主机端口:容器内端口 )-P 随机端口 (-P 49153起始 49153到65535)
#自定义端口
docker run -itd -p 8081:80 nginx:latest /bin/bash
#需要在容器中开启nginx
docker exec -it f282a476b06c /bin/bash -c nginx
#在网页测试
http://192.168.59.112:8081/# 随机端口
docker run -itd -P nginx:latest /bin/bash

自定义端口

网页测试 

五、为容器创建端口映射 

随机映射端口(从32768开始)docker run -d --name  为容器指定名称 -P   镜像指定映射端口docker   run -d --name 为容器指定名称  -p  宿主机端口:容器内端口   镜像
#使用nginx镜像创建容器,名称为web1 ,随机映射端口
docker run -d --name xx1 -P nginx:lnmp
docker ps -a#使用nginx镜像创建容器,名称为web2,将容器内的80端口映射到宿主机的39999端口
docker run -d --name xx2 -p 39999:80 nginx:lnmp
docker ps -a#访问
curl http://192.168.109.11:49155
curl http://192.168.109.11:39999#主机查看端口号
netstat -natp|grep docker#实际上是通过nat表进行转发的
iptables -nL -t nat

访问nginx

总结

1、Docker网络模式有哪些?分别提供哪些功能? 

  1. Host :与宿主机共享网络名称空间/网络协议栈
  2. Container:多个容器之间共享一个network namespaces
  3. None :自闭空间
  4. bridge:默认模式通过Veth对连接容器与docker0网桥,网桥分配给容器IP,同时docker 0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯
  5. overlay:叠加网络模式

2、如何把脚本传入一个已经运行的容器

使用cp命令复制进去容器

#使用cp命令复制进去容器
docker cp start.sh cenos_v1:/opt
#使用cp命令从容器复制出来
docker cp cenos_v1:/opt/start.sh ./

使用cp命令从容器复制出来 

docker cp centos_v1:/opt/test.sh ./

3、docker中,假设运行一个业务容器,但是业务容器需要暴露三个端口,启动后发现自己少加了一个端口。如何动态添加端口(如何对已经运行的容器添加或者修改端口)? 

  1. 首先,我们可以修改/var/lib/docker/containers/containers_id中两个文件
  2. hostconfig.json 中的 portbinding:{}修改端口或添加端口
  3. 修改config.v2.json文件,修改对应的Ports{}来添加/修改端口
  4. 最后,重启守护进程。


http://chatgpt.dhexx.cn/article/YhMNLVIs.shtml

相关文章

【k8s】docker网络模式(必知)

docker网络部分的视频我看了很多,讲解最透彻的还是https://www.bilibili.com/video/BV123411y7TB?p8获取本文方式:见谷粒商城文尾,备注【docker网络】k8s思维导图:https://www.processon.com/view/link/615bc61e637689127946ea5d…

Docker容器如何连接网络+容器间网络互通+Docker网络模式+自定义网络+网络打通

Docker网络 问题:Docker容器如何连接网络Docker容器之间能否接通网络Docker容器之间可以通过名称ping通吗能否自定义一个网络 那么,我们带着几个问题来学习docker的网络 Docker容器是如何连接网络的 我们在安装了Docker以后,在 宿主机上 i…

docker网络模式

目录 一、Docker网络实现原理 二、Docker的网络模式 1、Host模式 2、Container模式 3、none模式 4、bridge模式 三、自定义网络 1、查看网络模式列表 2、查看容器信息(包含配置、环境、网关、挂载、cmd等等信息) 3、指定分配容器IP地址 4、自定义网络固定…

Docker的网络模式

目录 一、Docker网络 1、Docker网络工作原理 2、为容器创建端口映射 二、Docker的网络模式 1、Docker的网络模式 2、查看docker的网络列表 3、指定容器网络模式 三、Docker网络模式详解 1、host模式 2、container模式 3、none 模式 4、bridge 模式 5、自定义网络模…

Docker:(四)docker网络模式

目录 一:虚拟网关 二:docker常用的几种网络模式 2.1Host模式 2.2container模式 2.3bridge模式(默认) 2.4None模式(躺平) 扩展:overlay叠加网络模式 三:自定义网络 3.1查看网…

docker 网络五种模式

docker 网络五种模式 一:Host模式 host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口范围,如果启动容器的时候使用host模式,那么这个容器将不会获得独立的网卡名称空间,那是和宿主…

Docker 的4种网络模式

我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--nethost指定。container模式,使用--netcontainer:NAME_or_ID指定。none模式,使用--n…

Docker网络模式解析

目录 前言 一、常用基本命令 (一)查看网络 (二)创建网络 (三)查看网络源数据 (四)删除网络 二、网络模式 (一)总体介绍 (二&#xff09…

Docker容器之网络模式

目录 引言 一、Docker网络实现原理 二、Docker的网络模式 2.1、HOST模式 2.2、Container模式 2.3、None模式 2.4、bridge模式 三、自定义网络 3.1、查看网络模式列表 3.2、查看容器详细信息(包含配置、环境、网关、挂载、cmd等信息) 3.3、指定…

docker三种网络模式

1.docker默认的三种网络模式: bridge:桥接模式 host:主机模式 none:无网络模式 查看网络模式: docker network ls 2.桥接模式 简介:桥接模式是docker 的默认网络设置,当Docker服务启动时,…

docker的五种网络模式

目录 一、bridge网络(网桥的方式) 二、host网络 三、none网络 四、自定义网络 五、container模式 一、bridge网络(网桥的方式) 可以很清楚的看出容器和宿主机的关系,当我们docker程序运行时,我们会增加一…

Docker--网络模式

文章目录 一、Docker网络实现原理二、Docker的网络模式1.Host模式2.Container模式3.None模式4.Bridge模式 三、自定义网络1.查看网络模式列表2.查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)3.指定分配容器IP地址 四、暴露端口五、为容器创建端…

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明

网络模式 | Dockerfile Docker 原生网络Docker 网络图解Docker 四种网络模式Host 模式Container模式None模式Bridge模式 Docker 网络自定义查看网络列表自定义网络固定IP暴露端口在宿主机环境执行容器内命令systemctl 命令 Docker 镜像分层Dockerfile 操作指令例:do…

七、Docker网络模式详解

目录 一、docker网络概述1、docker网络实现的原理2.容器的端口映射1).端口映射2).四种端口映射3).端口映射演示(1).随机端口映射(-P)(2).指定端口映射(-p 宿主机端口:容器端口)(3).指定网卡随机端口映射(-p ::&#xf…

使用navicat远程连接mysql时报2059错误解决方法

navicat连接mysql时报2059错误解决方法 报错原因解决方案1、管理员权限打开cmd2、修改加密规则及密码3、退出,重启mysql 报错原因 这个错误出现的原因是在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_pa…

navicat2012连接MySQL时提示2059错误

出现2059这个错误的原因是在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_password。通过网络查找发现我们可以将mysql用户登录的加密规则修改为mysql_native_password。 解决方法: 1.打开cmd&#xff0…

MySQL8:关于进入navicat连接MySQL出现2059界面

一.进入navicat连接MySQL出现2059页面: 原因:MySQL8之前版本中加密规则为mysql_native_password,MySQL8以后的加密规则为caching_sha2_password. 解决:将mysql用户登录加密规则修改为mysql_native_password即可. 二.解决方案: …

2059-Authentication plugin‘caching_sha2_password‘cannot be loaded

2059-Authentication plugin’caching_sha2_password’cannot be loaded 原因 由于目前已有的客户端连接软件还不支持Mysql8新增加的加密方式:caching_sha2_password 老的加密验证方式:mysql_native_password 解决方式 1、打开MySQL 8.0 Command Lin…

sqlyog连接mysql报错2058或者Navicat连接报错2059

下载了mysql8.0版本&#xff0c;结果连接的时候报了一些错误&#xff0c;这里进行总结 下载了mysql8.0版本&#xff0c;结果连接的时候报了一些错误&#xff0c;这里进行总结1、sqlyog连接mysql报错2058或者Navicat连接报错20592、sqlyog连接mysql报错 :连接失败 localhost<…

MySql 8.0.11 客户端连接失败:2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: ....

近期,换了新笔记本,重新安装了MySql数据库和客户端工具Navicat Premium 12。我是从官网上下载的MySql数据库&#xff0c; 版本为8.0.11&#xff0c;链接&#xff1a;https://dev.mysql.com/downloads/mysql/ 当数据库和客户端安装成功后&#xff0c;我使用客户端连接接数据库时…