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

Docker: 容器互访的三种方式

场景

三个容器

  • digger-app: 启动 API 服务,依赖 redismysql
  • digger-redis: redis 服务
  • digger-mysql: mysql 服务

我们需要让 digger-app 容器内运行的服务能够访问 digger-redisdigger-mysql 容器。

方法一:--link

--link 的格式为 --link name:aliasname 为需要连接到的容器的 namealias 是给这个连接取个别名。

首先启动 redis 服务和 mysql 服务:

# redis
docker run --name digger-redis -d redis:5.0.3-alpine
# mysql
docker run --name digger-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.25

如果不指定 name,docker 会随机生成一个 name,使用 docker ps 可以查看到运行容器的 name。

在启动 digger-app 时,指定 --link 参数:

docker run --name digger-api --link digger-redis:redis --link digger-mysql:mysql -d -p 3000:3000 your-image

这样在 digger-api 中就能通过 连接名 访问到对应的服务了,如与 digger-redislink 别名为 redis,那么在 digger-api 代码中,可以指定 redishostredis,以 node.js 举例:

// redis.js
const redis = require('redis');
const client = redis.createClient({
  host: 'redis',
  port: 6379
});

// mysql.js
const mysql      = require('mysql');
const connection = mysql.createConnection({
  host     : 'mysql',
  user     : 'root',
  password : 'root',
  database : 'my_db'
});

connection.connect();

使用 docker exec 命令进入容器,使用 ping 命令也可以查看容器是否互联成功:

clipboard.png

事实上,在 digger-api 容器内,如果查看 hosts 文件,可以发现 docker 已经将另外两个容器配置在了 hosts 中:

/app # cat /etc/hosts
127.0.0.1    localhost
...
172.17.0.6    redis 7a6409598773 cache-redis
172.17.0.5    mysql f08bf0e0bf18 digger-mysql
172.17.0.7    6eb8dab1e6db

方法二:--network

随着 Docker 网络的完善,更建议将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。

使用 --network 命令可以指定容器运行的网络,通过将多个容器指定到同一个网络可以让容器间相互访问。

创建网络

docker network create -d bridge my-net

指定网络

# redis
docker run --name digger-redis -d --network my-net redis:5.0.3-alpine
# mysql
docker run --name digger-mysql -e MYSQL_ROOT_PASSWORD=root -d --network my-net mysql:5.7.25
# api
docker run --name digger-api --network my-net -d -p 3000:3000 your-image

不过需要注意这时候就没有连接的别名了,在容器里面,host 直接使用对方容器的 name 访问即可。

方法三:docker compose

Docker ComposeDocker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。

新建 docker-compose.yml 文件,编写如下

version: "3"
services:

  digger-api:
    image: "express:v1"
    ports:
      - "3000:3000"

  digger-mysql:
    image: "mysql:5.7.25"
    environment:
      - MYSQL_ROOT_PASSWORD=root

  digger-redis:
    image: "redis:5.0.3-alpine"

docker compose 的官方文档查看 这里。

然后使用 docker-compose up -d 启动即可,容器会在后台运行。

相关文章:

  • D. Diverse Garland
  • 火箭主帅德安东尼赞哈登低位防守:他是控球中锋
  • Problem C: [noip2016十连测第五场]travel (构造+贪心)
  • 年终总结,程序员票选最喜欢的编程语言花落谁家?
  • js 基本数据类型
  • 自己写一个mvc框架吧(三)
  • IDEA 超级好用的插件
  • 微软是如何使用C#重写C#编译器并将其开源的
  • 前端小报 - 201901 月刊
  • DNS 故障导致微软 Azure 云服务的数据库被删除
  • 05-内联函数
  • CF每日一练(2.8)
  • 研究人员发现 macOS 可获取用户密码的 0day 漏洞
  • vue3.0 记录01
  • Fedora logo 改版最新进展:已有三个候选方案
  • [case10]使用RSQL实现端到端的动态查询
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【翻译】babel对TC39装饰器草案的实现
  • Fabric架构演变之路
  • Java 23种设计模式 之单例模式 7种实现方式
  • mac修复ab及siege安装
  • Node + FFmpeg 实现Canvas动画导出视频
  • React16时代,该用什么姿势写 React ?
  • vue-router的history模式发布配置
  • webpack入门学习手记(二)
  • 爱情 北京女病人
  • 小程序 setData 学问多
  • Mac 上flink的安装与启动
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #LLM入门|Prompt#3.3_存储_Memory
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #数学建模# 线性规划问题的Matlab求解
  • (论文阅读30/100)Convolutional Pose Machines
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)IOS中获取各种文件的目录路径的方法
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET值类型变量“活”在哪?
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @Async注解的坑,小心
  • @Transactional 详解
  • @我的前任是个极品 微博分析
  • []常用AT命令解释()
  • [04] Android逐帧动画(一)
  • [20140403]查询是否产生日志
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [Android] Android ActivityManager
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [C++] 统计程序耗时
  • [C++进阶篇]STL中vector的使用
  • [C++随笔录] 红黑树
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue
  • [COI2007] Sabor
  • [HCTF 2018]WarmUp (代码审计)