docker network容器网络通信

Docker 网络主要有以下两个作用:

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

只要是处于同一个Docker 网络下的容器就可以使用服务名直接访问,而无需担心重启。

docker容器网络模式

  • bridge网络模式:使得容器与容器之间可以相互互通

bridge网络模式是基于NAT模式下的网络通信方式。此驱动为Docker的默认设置驱动,使用这个驱动的时候,将创建出来的Docker容器连接到Docker网桥上。作为最常规的模式,bridge模式已经可以满足Docker容器最基本的使用需求了。然而其与外界通信使用NAT,增加了通信的复杂性,在复杂场景下使用会有诸多限制。

  • host网络模式:让容器程序可以使用主机网络

容器内的网络并不是希望永远跟主机是隔离的,有些基础业务需要创建或更新主机的网络配置,我们的程序必须以主机网络模式运行才能够修改主机网络,这时候就需要用到 Docker 的 host 主机网络模式。因此可以认为host驱动适用于对于容器集群规模不大的场景。

  • none网络模式:不得使用任务的网络

none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好"少即是多",在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

  • container网络模式:将两个容器放到统一网络空间中,可以直接通过localhost访问

container网络模式允许一个容器共享另一个容器的网络命名空间。当两个容器需要共享网络,但其他资源仍然需要隔离时就可以使用 container 网络模式,例如我们开发了一个 http 服务,但又想使用 nginx 的一些特性,让 nginx 代理外部的请求然后转发给自己的业务,这时我们使用 container 网络模式将自己开发的服务和 nginx 服务部署到同一个网络命名空间中。container 网络模式是 Docker 中一种较为特别的网络的模式,处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。

docker容器网络命令

  • 创建网络

参数说明:

--driver:驱动程序类型

--gateway:主子网的IPV4和IPV6的网关

--subnet:代表网段的CIDR格式的子网

mynet:自定义网络名称

不指定任何选项的时候默认的--driver(网络模式)也是bridge(桥接),但是gateway和subnet会自动生成。

bash 复制代码
docker network create 网络名称
docker network create -d bridge mynetwork
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 mynet
  • 查看查看网络列表
bash 复制代码
docker network ls
  • 查询网络的模型详细信息
bash 复制代码
docker network inspect 网络名称
  • 网络连接
bash 复制代码
docker network connect 网络名称 容器名称
  • 网络断开
bash 复制代码
docker network disconnect 网络名称 容器名称
  • 网络删除
bash 复制代码
docker network rm 网络名称
  • 删除所有不再使用的网络
bash 复制代码
docker network prune
  • 创建并运行容器时指定网络
bash 复制代码
docker run --name containerName -p 80:80 -d --network my_network nginx

Docker 安装时,自动在host上创建了如下3个网络:

docker network ls

NETWORK ID NAME DRIVER SCOPE

ff11ffdbd211 bridge bridge local

a80155c5275d host host local

b67166d3dfba none null local

使用示例

1、创建容器时挂载网络

bash 复制代码
#创建一个桥接类型的网络
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet1

#创建并运行容器时指定网络
docker run --name containerName -p 80:80 -d --network myNet1 myNginx

#不想用时可以断开网络
docker network disconnect myNet1 myNginx

2、把已存在的容器连接到新网络

bash 复制代码
#创建一个桥接类型的网络
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet2

#为容器连接新的网络
docker network connect myNet2 myNginx

#不想用时可以断开网络
docker network disconnect myNet2 myNginx

docker-compose给容器挂载网络

使用docker-compose up -d命令编排一组容器时会默认创建一个网络,并且这组容器全部都会加入到网络当中,容器之间可以直接使用服务名去通信。

如果想要指定网络,可以参考如下配置:

bash 复制代码
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

配置好网络后,在每个服务下可以指定使用的网络:

bash 复制代码
version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - mynet
      
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

这样容器编排时,所有容器都会加入到mynet这个自定义网络中。

相关推荐
梁萌3 小时前
Linux安装Docker
linux·运维·docker·helloworld·容器化部署
翱翔-蓝天3 小时前
在 CentOS 系统上安装 ClickHouse
运维·docker·容器
cdg==吃蛋糕6 小时前
docker代理配置
docker·容器·eureka
web135085886357 小时前
使用docker compose安装gitlab
docker·容器·gitlab
IT机器猫8 小时前
Docker完整技术汇总
运维·docker·容器
董健正8 小时前
Docker安装
docker·容器·docker-compose
gs801408 小时前
替换 Docker.io 的 Harbor 安全部署指南:域名与 IP 双支持的镜像管理解决方案
docker·harbor
coco_1998_28 小时前
nvidia docker, nvidia docker2, nvidia container toolkits区别
docker·容器
团儿.8 小时前
Docker服务发现新纪元:探索Consul的无限魅力
运维·docker·云计算·服务发现·consul
vvw&9 小时前
Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程
linux·运维·服务器·ubuntu·docker·容器·开源