網站首頁 編程語言 正文
Docker 的四種網絡模式
網絡模式 | 網絡配置 | 說明 |
---|---|---|
host(開放式網絡模式) | –network host | 容器和宿主機共享 Network namespace |
container(聯合掛載式網絡模式) | –network container | 多個容器共享一個 Network namespace |
none(封閉式網絡模式) | –network none | 將容器放置在它自己的網絡棧中,但是并不進行任何配置,該模式關閉了容器的網絡功能 |
bridge(橋接式網絡模式) | –network bridge | Docker默認的網絡設置,此模式會為每一個容器分配Network Namespace、設置IP等 |
docker network 查看 docker 網絡模式
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
15791bf83278 bridge bridge local
df75b40e39f6 host host local
f89ee64125bc none null local
docker run --network 命令可以指定使用的網絡模式
host 模式
如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace 。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口 。但是, 容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的 。
使用host模式的容器可以直接使用宿主機的IP地址與外界通信,容器內部的服務端口也可以使用宿主機的端口,不需要進行NAT,host最大的優勢就是網絡性能比較好,但是docker host上已經使用的端口就不能再用了,網絡的隔離性不好。
host 模式演示
以 host 網路模式運行容器centos
[root@docker ~]# docker run -itd --name centos --network host centos:latest
查看該容器的網絡模式
[root@docker ~]# docker inspect 40c4e28bd29c | grep -i network
"NetworkMode": "host",
"NetworkSettings": {
"Networks": {
"NetworkID": "df75b40e39f671cbc4d287fefce8b7b64819fcad453cfe7f34831f6490480760",
查看容器 IP
[root@docker ~]# docker exec -it $(docker ps -q) hostname -I
192.168.117.130 172.17.0.1
container 模式
這個模式指定 新創建的容器和已經存在的一個容器共享一個 Network Namespace ,而不是和宿主機共享。 新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍 等。同樣, 兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的 。兩個容器的進程可以通過 lo 網卡設備通信。
container 模式演示
使用 bridge 網絡模式啟動一個 centos_1 容器
[root@docker ~]# docker run -itd --name centos_1 --network bridge centos:latest
10ec9d1e3a6b7530cff797cdfc2c44702b62f9f29dcee679306a0262d1e41226
#查看該容器的網絡模式
[root@docker ~]# docker inspect 10ec9d1e3a6b | grep -i network
"NetworkMode": "bridge",
"NetworkSettings": {
"Networks": {
"NetworkID": "ae7c4bfdd3910f8a00cb962afd06cf296d7d04a99611a6ab154d496ca777183b",
#查看容器IP
[root@docker ~]# docker exec -it 10ec9d1e3a6b hostname -I
172.17.0.2
使用 container 網絡模式啟動一個 centos_2 容器
[root@docker ~]# docker run -itd --name centos_2 --network container:centos_1 centos:latest
1f7d976b3f80dd064fd87902dacefc72b617acc6f7917a2f0adb434cb5ff0d11
#查看該容器的網絡模式
[root@docker ~]# docker inspect 1f7d976b3f80 | grep -i network
"NetworkMode": "container:centos_1",
"NetworkSettings": {
"Networks": {}
#查看容器IP
[root@docker ~]# docker exec -it 1f7d976b3f80 hostname -I
172.17.0.2
測試 centos_2 與宿主機的連通性
#通信正常
[root@docker ~]# docker exec -it 1f7d976b3f80 ping 192.168.117.130
PING 192.168.117.130 (192.168.117.130) 56(84) bytes of data.
64 bytes from 192.168.117.130: icmp_seq=1 ttl=64 time=0.135 ms
64 bytes from 192.168.117.130: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 192.168.117.130: icmp_seq=3 ttl=64 time=0.057 ms
測試 centos_2 與外網的連通性
#通信正常
[root@docker ~]# docker exec -it 1f7d976b3f80 ping www.baidu.com
PING www.a.shifen.com (61.135.185.32) 56(84) bytes of data.
64 bytes from 61.135.185.32 (61.135.185.32): icmp_seq=1 ttl=127 time=4.45 ms
64 bytes from 61.135.185.32 (61.135.185.32): icmp_seq=2 ttl=127 time=4.27 ms
none 模式
使用none模式,Docker容器擁有自己的Network Namespace,但是, 并不為Docker容器進行任何網絡配置 。也就是說,這個Docker容器沒有網卡、IP、路由等信息,只有lo 網絡接口。需要我們自己為Docker容器添加網卡、配置IP等。
不參與網絡通信,運行于此類容器中的進程僅能訪問本地回環接口;僅適用于進程無須網絡通信的場景中,例如:備份進程診斷及各種離線任務等。
?none 模式演示
使用 none 網絡模式啟動一個 centos_1 容器
[root@docker ~]# docker run -itd --name centos_1 --network none centos:latest
b70dddea0a3a554c0c658442fcce8950a272148192b9622a1c5e6baa92be705c
#查看該容器的網絡模式
[root@docker ~]# docker inspect b70dddea0a3a | grep -i network
"NetworkMode": "none",
"NetworkSettings": {
"Networks": {
"NetworkID": "f89ee64125bc9606a0e30f5d6c52d21bbdd10b14cd32191c783967a41675497c",
#查看容器IP
[root@docker ~]# docker exec -it b70dddea0a3a hostname -I
#IP為空
測試 centos_1 與宿主機的連通性
#無法通信
[root@docker ~]# docker exec -it b70dddea0a3a ping 192.168.117.130
connect: Network is unreachable
bridge 模式
當Docker進程啟動時,會 在主機上創建一個名為docker0的虛擬網橋 ,此主機上啟動的 Docker容器會連接到這個虛擬網橋上, 所以有默認地址172.17.0.1/16的地址。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。
從 docker0子網中分配一個IP給容器使用 ,并設置 docker0的IP地址為容器的默認網關 。在主機上 創建一對虛擬網卡 veth pair設備,Docker將veth pair設備的 一端放在新創建的容器 中,并命名為eth0(容器的網卡), 另一端放在主機中 ,以vethxxx這樣類似的名字命名,并將這個網絡設備加入到docker0網橋中。可以通過brctl show命令查看。
#如果您的主機沒有 brctl 命令,請安裝網橋管理工具包
[root@docker ~]# yum install -y bridge-utils
#查看網橋
[root@docker ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02426f470008 no
bridge模式是docker的默認網絡模式,不寫–net參數,就是bridge模式。使用docker run -p時,docker實際是在iptables做了DNAT規則,實現端口轉發功能。可以使用iptables -t nat -vnL查看。
?bridge 模式演示
創建一個網橋 centos-net
[root@docker ~]# docker network create -d bridge centos-net
1d8d918c3488b0e5b3f15ecd5c35c1dc36a87c66dc39fa38fbefcdc6ef471218
#查看創建的網橋
[root@docker ~]# brctl show
bridge name bridge id STP enabled interfaces
#新創建的網橋
br-1d8d918c3488 8000.024297951600 no
#系統默認的網橋
docker0 8000.02426f470008 no
[root@docker ~]# ip a
8: br-1d8d918c3488: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:97:95:16:00 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 scope global br-1d8d918c3488
valid_lft forever preferred_lft forever
使用 bridge 網絡模式啟動一個 centos_1 容器
[root@docker ~]# docker run -itd --name centos_1 --network centos-net centos:latest
f5bdd3510cc84a6fdeef10f062589770daa663aa31855131cab3fa0627e98d3d
#查看該容器的網絡模式
[root@docker ~]# docker inspect f5bdd3510cc8 | grep -i network
"NetworkMode": "centos-net",
"NetworkSettings": {
"Networks": {
"NetworkID": "1d8d918c3488b0e5b3f15ecd5c35c1dc36a87c66dc39fa38fbefcdc6ef471218",
#查看容器IP
[root@docker ~]# docker exec -it f5bdd3510cc8 hostname -I
172.18.0.2
使用 bridge 網絡模式啟動一個 centos_2 容器
[root@docker ~]# docker run -itd --name centos_2 --network centos-net centos:latest
#查看該容器的網絡模式
[root@docker ~]# docker inspect $(docker ps -n 1 -q ) | grep -i network
"NetworkMode": "centos-net",
"NetworkSettings": {
"Networks": {
"NetworkID": "1d8d918c3488b0e5b3f15ecd5c35c1dc36a87c66dc39fa38fbefcdc6ef471218",
#查看容器IP
[root@docker ~]# docker exec -it $(docker ps -n 1 -q ) hostname -I
172.18.0.3
查看網橋連接狀況
[root@docker ~]# brctl show
bridge name bridge id STP enabled interfaces
br-1d8d918c3488 8000.024297951600 no veth44c8534
vethef015ff
docker0 8000.02426f470008 no
測試容器之間的連通性
[root@docker ~]# docker exec -it f5bdd3510cc8 ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.045 ms
測試容器與宿主機間的連通性
#容器 centos_1 與宿主機間的連通性
[root@docker ~]# docker exec -it f5bdd3510cc8 ping 192.168.117.130
PING 192.168.117.130 (192.168.117.130) 56(84) bytes of data.
64 bytes from 192.168.117.130: icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from 192.168.117.130: icmp_seq=2 ttl=64 time=0.042 ms
#容器 centos_2 與宿主機間的連通性
[root@docker ~]# docker exec -it 78854ab16473 ping 192.168.117.130
PING 192.168.117.130 (192.168.117.130) 56(84) bytes of data.
64 bytes from 192.168.117.130: icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from 192.168.117.130: icmp_seq=2 ttl=64 time=0.043 ms
原文鏈接:https://blog.csdn.net/tiamon_/article/details/109300045
相關推薦
- 2022-10-06 Python中requests庫的基本概念與具體使用方法_python
- 2022-07-14 Python實現印章代碼的算法解析_python
- 2022-06-01 C語言?超詳細梳理總結動態內存管理_C 語言
- 2023-02-12 一文帶你了解Golang中reflect反射的常見錯誤_Golang
- 2022-08-05 SpringBoot 2.X 整合Redis
- 2022-04-11 c#?理解csredis庫實現分布式鎖的詳細流程_C#教程
- 2024-04-03 linux系統配置nginx兩套以上的前端
- 2022-05-06 nginx?負載均衡輪詢方式配置詳解_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支