当前位置: 首页 > article >正文

Docker容器间通信

在 Docker 中,使用 YAML 文件(通常是 docker-compose.yml)来定义和管理多个容器及它们之间的网络链接。docker-compose 是一个工具,它允许你用一个 YAML 文件来配置应用程序的服务、网络和卷,简化容器的启动和管理。

使用 docker-compose.yml 控制 Docker 容器和容器间链接。

version: '3'  # 指定Compose文件的版本
services:     # 定义多个服务(容器)
  service1:   # 第一个服务(容器)
    image: my_image_1:latest  # 使用的镜像
    ports:
      - "8080:80"             # 暴露的端口:宿主机:容器内
    networks:
      - my_network            # 关联到的网络

  service2:   # 第二个服务(容器)
    image: my_image_2:latest
    ports:
      - "9090:90"
    networks:
      - my_network            # 与 service1 共享网络
    depends_on:
      - service1              # 定义依赖关系,service2 在 service1 启动后再启动

networks:      # 定义网络
  my_network:
    driver: bridge  # 使用 bridge 网络驱动
  • services:定义了多个容器(或服务),每个容器在 docker-compose.yml 文件中用不同的服务名表示,例如 service1service2。每个服务都可以有自己的配置,如镜像、端口等。

  • ports:用于将容器内的端口映射到宿主机的端口,格式为 "宿主机端口:容器端口"。例如,"8080:80" 表示将宿主机的 8080 端口映射到容器的 80 端口。

  • networks:指定容器之间的网络。在上面的例子中,my_network 是自定义网络,多个容器共享这个网络,这样它们可以通过服务名相互通信。例如,service1 可以通过 service2:9090 的地址访问 service2

  • depends_on:声明服务之间的启动顺序。depends_on 确保 service2service1 启动后才启动,但不保证服务启动完成后才开始启动下一个服务。

 

容器间通信

docker-compose 中,不需要明确地暴露内部网络使用的端口,因为容器在同一个网络内时,可以通过服务名互相通信。比如,service1 可以直接通过 http://service2:90 访问 service2 的服务,无需通过宿主机端口。

网络配置

你也可以对网络进行更详细的配置,例如指定子网和 IP 范围:

networks:
  my_network:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.1.0/24

 

启动和管理

启动容器:使用以下命令通过 docker-compose.yml 文件启动定义好的服务:

docker-compose up -d

停止容器

docker-compose down

 查看容器日志

docker-compose logs

前后端连接的Web应用

version: '3'
services:
  frontend:
    build: .
    ports:
      - 80:80
    links:
      - backend
  backend:
    image: backend-image
    ports:
      - 8080:8080

定义了两个服务(frontend和backend)。frontend服务将构建当前目录下的应用代码,并将容器的80端口映射到主机的80端口。backend服务使用预先构建的镜像,并将容器的8080端口映射到主机的8080端口。

通过links关键字,我们将frontend容器连接到了backend容器。这样,frontend容器就可以直接使用backend容器的主机名作为域名来访问后端服务。

在这个例子中,假设在同一个网络中运行了这两个服务,它们可以使用主机名进行通信。
 

在前端容器中使用Docker Links连接到后端容器。

from flask import Flask
import requests

app = Flask(__name__)

@app.route('/')
def hello():
    backend_url = 'http://backend:8080/api'
    response = requests.get(backend_url)
    return response.text

在Flask应用中使用requests库来发送HTTP请求。我们使用了http://backend:8080/api作为后端服务的URL,在容器内部,backend是一个有效的主机名。

 

前端容器发送了一个HTTP GET请求给后端容器的/api端点,并收到了响应。 

YAML文件中使用Docker Links的完整流程 

 

整个过程分为四个步骤:定义YAML文件、使用Docker Compose启动容器、容器建立链接、以及容器之间的通信。 


http://www.kler.cn/news/367479.html

相关文章:

  • 质量漫谈一
  • 编写一个简单的Iinput_dev框架
  • 新鲜出炉,ECCV2024.9.25 首次提出基于 YOLO 目标检测的无源域自适应
  • Mybatis-03.入门-配置SQL提示
  • 计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议
  • 蓝牙技术的多种模式详解
  • 深入了解 MySQL 中的 INSERT ... SELECT 语句
  • iOS弹出系统相册选择弹窗
  • VS/Qt Creator +QT生成带.ico图标的.exe 并打包
  • qt QLabel详解
  • 智能合约在Web3中的作用:区块链技术的创新实践
  • JAVA基础-树和Set集合
  • uiautomatorviewer中的两个错误
  • 在虚拟化环境中,虚拟机的资源分配是否真的能够完全等效于物理服务器?是否有某些特定的工作负载在虚拟化环境中始终无法达到理想表现?
  • 【ChatGPT插件漏洞三连发之一】未授权恶意插件安装
  • Chromium HTML5 新的 Input 类型search对应c++
  • 【C++ 真题】B2099 矩阵交换行
  • 5.Linux按键驱动-fasync异步通知
  • 微信支付Java+uniapp微信小程序
  • Netty简单应用
  • C语言教程——数组(2)
  • UML之用例图详解
  • Linux 常用命令总汇
  • 二、Spring的执行流程
  • 【webpack学习】
  • w003基于Springboot的图书个性化推荐系统的设计与实现