docker容器相互通信的实现

前言

docker容器处在宿主内部的局域网络之中, 一般来说, 我们直接使用局域网ip即可访问, 但考虑到容器重启后ip可能会发生变化, 所以这种直接使用容器的ip的方案并不稳妥

那如果使用公网ip, 映射访问的话, 似乎稳定一些, 但是也存在问题, 比如docker跨服迁移, 那么ip还得手动修改, 同时公网访问速度上肯定不如内网

所以还得另寻他法

事实上 Docker官方已经给我们提供了解决办法, 那就是使用Bridge桥接网络, 这样 我们可以直接使用容器名充当局域网ip进行容器间相互访问

img

操作步骤

  1. 创建bridge网络

    1
    docker network create -d bridge 自定义网络名称
  2. 创建容器时指定bridge网络

    1
    2
    3
    docker run -id --name=first --network 网络名 ubuntu:latest

    docker run -id --name=second --network 网络名 ubuntu:latest

    这样两个容器就处在了同一个桥接网络下, 容器间自动link, 彼此可以相互访问

  3. 访问测试

    1
    2
    3
    4
    # 进入第一个容器
    docker exec -it first bash
    # 使用容器名ping
    ping second

其他操作

  1. 如果要查看当前已经存在的桥接网络列表

    1
    docker network ls

优势

除了方便容器间通信外, 结合Nginx还可以减少服务器端口开放数量, 消除不必要的安全隐患

比如不使用桥接网络时, Nginx反向代理配置是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http{
upstream wordpress_sex{
server 服务器公网IP:7778;
}
server{
listen 80;
server_name sex.newban.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://wordpress_sex;
break;
}
}

}

使用桥接网络后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http{
upstream wordpress_sex{
server 容器名:80;
}
server{
listen 80;
server_name sex.newban.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://wordpress_sex;
break;
}
}

}

无论是移植性和安全性都得到了大大的提升

但是有一点需要注意, nginx配置文件在nginx启动成功之前会检测server节点下的host地址是否可通, 如果存在无法接通的host, 则nginx无法启动,

也就是说我们使用server 容器名:80这种配置 当我们的docker容器挂了或者停止运行时, 如果此时重启nginx则会启动失败, 这一点我们需要提前知晓, 避免到时重启时出了问题摸不着头脑

本文为作者原创 转载时请注明出处 谢谢

B站入口

打赏通道

微信公众号二维码如下:

img

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%