Docker: 容器互访的三种方式

28次阅读

共计 1895 个字符,预计需要花费 5 分钟才能阅读完成。

场景
三个容器

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

digger-redis: redis 服务

digger-mysql: mysql 服务

我们需要让 digger-app 容器内运行的服务能够访问 digger-redis 和 digger-mysql 容器。
方法一:–link

–link 的格式为 –link name:alias,name 为需要连接到的容器的 name,alias 是给这个连接取个别名。
首先启动 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-redis 的 link 别名为 redis,那么在 digger-api 代码中,可以指定 redis 的 host 为 redis,以 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 命令也可以查看容器是否互联成功:

事实上,在 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 Compose 是 Docker 官方编排(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 启动即可,容器会在后台运行。

正文完
 0