跳转至

Docker 三种网络模式

bridge模式

docker默认网络为桥接模式,创建的也是bridge模式

Bash
docker network COMMAND
Commands:
      connect     将容器连接到网络
      create      建立网络
      disconnect  断开容器与网络的连接
      inspect     显示一个或多个网络的详细信息
      ls          网络列表
      prune       删除所有未使用的网络
      rm          删除一个或多个网络

#创建网络network1
docker network create network1
#创建指定地址的网络
docker network create --subnet=10.100.1.0/24 anyesu_net
#测试
# 创建一个mongo,加入network1网络,不对外映射端口,起名my_mongodb
docker run -d \
--name my_mongodb \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=testmg \
--network network1 \
mongo
# 创建一个mongoweb管理,加入network1,通过name:my_mongodb 访问mongodb
docker run -d \
--name my_mongodb_express \
-p 8081:8081 \
-e ME_CONFIG_MONGODB_ENABLE_ADMIN=true \
-e ME_CONFIG_MONGODB_SERVER=my_mongodb \
-e ME_CONFIG_MONGODB_ADMINUSERNAME=admin \
-e ME_CONFIG_MONGODB_ADMINPASSWORD=testmg \
-e ME_CONFIG_BASICAUTH_USERNAME=adminweb \
-e ME_CONFIG_BASICAUTH_PASSWORD=passweb \
--network network1 \
mongo-express
# 等待一会儿,通过浏览器访问web,查看能否连接mongodb,web账户密码adminweb:passweb
# 同一个网络,容器可以通过名称互相访问而不需要知道具体IP地址

host模式

host为本地模式,容器不需要做端口映射

Bash
1
2
3
4
5
6
7
8
#创建host网络的容器
docker run -d --network host nginx
# 浏览器直接访问80端口即可。进入容器查看 IP
docker exec -it 809d96b91693 /bin/bash
#先在容器装一些查看IP工具
apt update
apt install iproute2
ip a # 可以看到完全与宿主机网络一样

none模式

完全不联网,做一些内部测试

Bash
1
2
3
4
5
6
# docker network list
NETWORK ID     NAME       DRIVER    SCOPE
7d5a1998fe9c   bridge     bridge    local
1068a1a991a4   host       host      local
fa3519ac1dd2   network1   bridge    local
f65e0768a4ee   none       null      local

注意

默认bridge host none 是不能被删除的

删除自建的子网

Bash
1
2
3
4
5
6
7
8
9
#查看网络下有哪个容器再使用,删除网络前应该先断开容器的使用
docker network inspect network1 

#断开网络,正常操作应该先删除或停止容器
docker network disconnect network1 my_mongodb
docker network disconnect network1 my_mongodb_express 

#删除网络
docker network rm network1

扩展,网桥工具

Bash
1
2
3
4
5
6
yum install bridge-utils  # 安装包
brctl show               # 查看网桥信息

root@pts/0 # brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.0242072be76f   no  

默认情况下,同一个网桥的容器可以互联,如果不希望容器互联,可以修改配置文件,拒绝互联

Bash
# 添加 "icc": false  禁止互联

root@pts/0 # vim /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io",
    "https://docker.1panel.live",
    "https://hub.rat.dev"
  ],
  "icc": false        # 添加这个参数
}

# 需要重启docker 服务
systemctl restart docker 

icc属于一刀切,一般不建议

可以添加iptables 管理,然后配置 --link 去指定链接哪个容器

Bash
root@pts/0 # cat /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io",
    "https://docker.1panel.live",
    "https://hub.rat.dev"
  ],
  "icc": false,
  "iptables": true        # 配合iptables参数
}
# 重启
systemctl restart docker 

当然,通过--link维护也比较麻烦,一般都自定义网络