Docker中Container的相互通信

最近在弄一些后端的一些东西,还算不上是专业人士,所以描述的内容可能有错。

听说Docker流行了几年了,好像最近已经不流行了,而我现在才开始具体的用……

在写ASP.NET Core的时候,发现如果是连接到另一个Container的数据库的话,连接字符串可以直接用Link到的Container的Name作为地址,于是突发奇想Container之间的相互通信原来就是这样吗?一查文档果然,于是开始动手测试。

首先dotnet new一个asp.net core webapi,加一个IndexController,路由设置为根路径,写个Get方法:

[HttpGet]
public async Task<string> Get()
{
    using (var client = new HttpClient())
    {
        var node = await client.GetStringAsync("http://nodejs");
        return node + " and asp.net core!";
    }
}

然后配置一下Dockerfile,能build然后run起来就行,具体参考其他文档

接着npm init一个nodejs project,install koa或者express都行,然后简单写写

import Koa from 'koa';
const app = new Koa();
app.use(ctx => {
    ctx.body = "Hello from node!";
})
app.listen(80);

然后也是要配置一下Dockerfile,npm start起来就行

最后写个docker-compose.yml,记得添加nodejs的link到asp.net core里面,然后asp.net core expose个port出来,比如8080

docker-compose up,可以加个-d让他后台跑

打开chrome,localhost:8080,然后你就可以看到

Hello from node! and asp.net core!

这里面绝对还有其他东西可以搞,比如说有个专门的container负责转发请求,例如我的/node想要给nodejs处理,/net想要给asp.net core处理,不太可能是再开个asp.net/nodejs工程来写这样处理的,这部分还需要再深入一下

One response on “Docker中Container的相互通信

  1. 对Docker-Compose而言,其实写在同一个文件里的services都是互相可见的(docker对容器提供了dns服务,可以通过service名/容器id来对其他容器进行访问)。没有特殊需求是不需要手动写link的(link的作用是给service一个别名,而不是定义容器之间的连接)。services之间的访问控制,主要是通过设定各个service加入的network来实现。

    Ref:https://docs.docker.com/compose/networking/#multi-host-networking

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据