我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

在使用Docker部署应用的时候,通常需要多个容器之间进行端口通信。常规的做法就是:设置容器的端口及目录映射,然后利用主机做媒介,把容器的各个功能有效的组织起来。然而,更好的解决方案是:把这些容器放置到同一个network里面来,这样就不用做端口映射了。值得说明的是:docker network解决的是端口通信问题,而不是目录共享的类似问题。

苏南大叔:不暴漏端口号,如何使用 Docker Network 实现容器间互联? - docker-network-互联
不暴漏端口号,如何使用 Docker Network 实现容器间互联?(图8-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10docker@28.0.4。本文将介绍如何使用docker network命令创建自定义网络,并配置容器间的通信。

传统方案:端口映射

默认情况下,Docker会为每个容器分配一个独立的网络命名空间。如果需要容器之间通信,通常会通过暴露端口的方式实现。然而,这种方式可能会带来以下问题:

  1. 安全性问题:暴露端口可能会让外部用户访问容器服务,增加攻击面。
  2. 复杂性:需要手动管理端口映射,容易造成宿主机的端口冲突。

苏南大叔:不暴漏端口号,如何使用 Docker Network 实现容器间互联? - 端口冲突风险
不暴漏端口号,如何使用 Docker Network 实现容器间互联?(图8-2)

新方案:docker network

通过Docker网络,我们可以将多个容器加入同一个自定义网络中,使它们能够通过容器名称直接通信,而无需暴露端口。

Docker提供了以下几种网络模式:

  1. bridge(默认模式):容器通过虚拟网桥通信,适合单机部署。
  2. host:容器共享主机网络,适合需要高性能的场景。
  3. none:容器没有网络,适合完全隔离的场景。
  4. overlay:用于跨主机的容器通信,适合SwarmKubernetes
  5. macvlan:容器直接获取主机网络的 MAC 地址,适合需要直接访问物理网络的场景。

最常用的就是bridge 模式了,自定义网络实现容器间通信。

创建自定义网络

可以通过下面的命令,要创建一个自定义的 bridge 网络sunan_network

docker network create sunan_network

此命令会创建一个名为 sunan_network 的网络,Docker 会自动为其分配一个子网和网关。

苏南大叔:不暴漏端口号,如何使用 Docker Network 实现容器间互联? - docker-network-list
不暴漏端口号,如何使用 Docker Network 实现容器间互联?(图8-3)

在没有容器

查看所有网络

可以通过下面的命令,查看所有可用的network

docker network list

启动容器,加入网络

在启动容器时,可以通过 --network 参数将容器加入自定义网络。例如:

docker run -d --name php-fpm --network sunan_network php:8.4.6-fpm
docker run -d --name nginx-1 --network sunan_network nginx:latest

此时,php-fpmnginx-1 都加入了 sunan_network,它们可以通过容器名称直接通信,并不需要配置端口了。

苏南大叔:不暴漏端口号,如何使用 Docker Network 实现容器间互联? - network参数
不暴漏端口号,如何使用 Docker Network 实现容器间互联?(图8-4)

容器间通信

nginx-1 中,可以通过容器名称访问 php-fpm 提供的服务php-fpm:9000了,例如:

location ~ \.php$ {
    fastcgi_pass   php-fpm:9000;
    #...
}

苏南大叔:不暴漏端口号,如何使用 Docker Network 实现容器间互联? - nginx-conf
不暴漏端口号,如何使用 Docker Network 实现容器间互联?(图8-5)

验证网络配置

可以使用以下命令查看网络中的容器:

docker network inspect sunan_network

此命令会显示网络的详细信息,包括已连接的容器列表和 IP 地址分配。

苏南大叔:不暴漏端口号,如何使用 Docker Network 实现容器间互联? - 查看network的ip
不暴漏端口号,如何使用 Docker Network 实现容器间互联?(图8-6)

已经添加到当前网络的容器,都有哪些。也可以使用这个命令。

苏南大叔:不暴漏端口号,如何使用 Docker Network 实现容器间互联? - docker-network-inspect
不暴漏端口号,如何使用 Docker Network 实现容器间互联?(图8-7)

动态添加容器到网络

例如,现在有个mysql:5.7的容器,已经启动,但是没有设置network

docker run --name mysql57 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

如果容器已经启动,但未加入网络,可以使用以下命令将其动态添加到网络中:

docker network connect sunan_network mysql57

同样,可以使用以下命令将容器从网络中移除:

docker network disconnect sunan_network mysql57

苏南大叔:不暴漏端口号,如何使用 Docker Network 实现容器间互联? - docker-network-connect
不暴漏端口号,如何使用 Docker Network 实现容器间互联?(图8-8)

Docker Compose 的网络配置

如果使用Docker Compose,也可以通过 networks 配置实现容器间通信。例如docker-compose.yaml

version: '3.8'
services:
  nginx-1:
    image: nginx:latest
    networks:
      - sunan_network
  php-fpm:
    image: php:8.4.6-fpm
    networks:
      - sunan_network
  mysql57:
    image: mysql:5.7
    networks:
      - sunan_network

networks:
  sunan_network:
    driver: bridge

运行 docker-compose up 后,nginx-1php-fpmmysql57 会自动加入 sunan_network,并可以通过服务名称互相访问。

总结

通过Docker网络功能,我们可以轻松实现容器间的安全互联,而无需暴露端口。这种方式不仅提高了安全性,还简化了端口管理。无论是通过命令行还是 Docker Compose,都可以快速配置自定义网络,满足不同场景的需求。

更多苏南大叔的docker经验文字,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   docker