当前位置: 首页 > 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 改版最新进展:已有三个候选方案
  • $translatePartialLoader加载失败及解决方式
  • fetch 从初识到应用
  • JavaScript DOM 10 - 滚动
  • JavaScript标准库系列——Math对象和Date对象(二)
  • javascript从右向左截取指定位数字符的3种方法
  • Java比较器对数组,集合排序
  • Java基本数据类型之Number
  • Js基础知识(一) - 变量
  • LeetCode算法系列_0891_子序列宽度之和
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL主从复制读写分离及奇怪的问题
  • React的组件模式
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 服务器从安装到部署全过程(二)
  • 基于 Babel 的 npm 包最小化设置
  • 前端性能优化——回流与重绘
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 阿里云API、SDK和CLI应用实践方案
  • 扩展资源服务器解决oauth2 性能瓶颈
  • (26)4.7 字符函数和字符串函数
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)u-boot-nand.bin的下载
  • (已解决)什么是vue导航守卫
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)http-server应用
  • .chm格式文件如何阅读
  • .net core Swagger 过滤部分Api
  • .net 获取url的方法
  • .skip() 和 .only() 的使用
  • []我的函数库
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [CSS] 点击事件触发的动画
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [go] 策略模式
  • [Java算法分析与设计]--线性结构与顺序表(List)的实现应用