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会自动生成。

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
  • 查看查看网络列表
docker network ls
  • 查询网络的模型详细信息
docker network inspect 网络名称
  •  网络连接
docker network connect 网络名称 容器名称
  •  网络断开
docker network disconnect 网络名称 容器名称
  • 网络删除
docker network rm 网络名称
  • 删除所有不再使用的网络
docker network prune
  • 创建并运行容器时指定网络
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、创建容器时挂载网络

#创建一个桥接类型的网络
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、把已存在的容器连接到新网络

#创建一个桥接类型的网络
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命令编排一组容器时会默认创建一个网络,并且这组容器全部都会加入到网络当中,容器之间可以直接使用服务名去通信。

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

networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

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

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这个自定义网络中。

猜你喜欢

转载自blog.csdn.net/watson2017/article/details/134618407
今日推荐