docker--网络和特权模式
前戏
使用 docker network --help 来看看都有哪些参数
[root@dce88 ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network # 将一个容器连接到一个网络上
create Create a network # 创建一个网络
disconnect Disconnect a container from a network # 从网络上断开一个容器的连接
inspect Display detailed information on one or more networks # 显示一个或多个网络的详细信息
ls List networks # 查看网络列表
prune Remove all unused networks # 删除所有未使用的网络
rm Remove one or more networks # 删除一个或者多个网络
Run 'docker network COMMAND --help' for more information on a command.
查看网络模式:
docker network ls
默认的三种网络模式:
- bridge:桥接模式
- host:主机模式
- none:无网络模式
bridge 桥接模式
桥接模式是 docker 的默认网络设置,当 Docker 服务启动时,会在主机上创建一个名为 docker0 的虚拟网桥,并选择一个和宿主机不同的 IP 地址和子网分配给 docker0 网桥
在 docker run 的时候使用参数 --net=bridge 指定,不指定默认就是 bridge 模式
当我们启动一个容器时,会桥接到docker0网卡上,在通过Nat技术就实现了外网访问docker容
docker0 是启动 docker 服务时分配的网桥,77和83是启动一个容器时分配的网桥(bridge模式时才会有)
host 模式
host 模式:该模式下容器是不会拥有自己的 ip 地址,而是使用宿主机的 ip 地址和端口
在 docker run 的时候使用参数 --net=host 指定,启动的容器如果指定了使用 host 模式,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和 ip 地址,因此在容器里面查看到的 ip 信息就是宿主机的信息,访问容器的时候直接使用宿主机 ip+容器端口即可,不过容器的其他资源。如文件系统、系统进程等还是和宿主机保持隔离
此模式的网络性能最高,但是各容器之间端口不能相同,适用于运行容器端口比较固定的业务
host 模式不支持端口映射,当指定端口映射的时候会提示如下警告信息
# 使用 --net=host 时,指定 -p 端口映射会被丢弃
[root@dce88 ~]# docker run -it --net=host -p 8888:80 nginx:latest bash
# 警告:使用主机网络模式时,发布的端口会被丢弃。
WARNING: Published ports are discarded when using host network mode
root@dce88:/#
host 模式是使用的宿主机的 ip 和端口,不会生成一个网卡桥接到 docker0 模式。
拉取nginx镜像
docker pull nginx
启动nginx容器,--net=host 指明网络模式为host,如果不指明,默认为bridge
docker run -d --net=host nginx
防火墙放开80端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
启动容器时没有指定端口号,我们直接访问宿主机的80端口是可以访问到nginx的
host的缺点就是只能启动一个相同的服务,比如nginx镜像的端口都是80,你在宿主机上启动一个就占用了宿主机的80端口,在启动一个nginx就会报错
none模式
none模式:关闭模式
无法连外网
比较少用,了解有这种网络模式即可
特权模式
也比较少用,了解即可
启动一个普通的容器
docker run -itd --name mycentos centos:7 /bin/bash
安装网络工具:
yum -y install net-tools
执行route -n 查看网关
删除网关
route del default gw 172.17.0.1
这样会提示权限
启动拥有特权模式的容器:只需要在启动容器的时候加上--privileged=true就可以了
docker run -itd --privileged=true --name mycentos1 centos:7 /bin/bash
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)