docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker容器间互联

docker容器间的互联问题

作者:莱特昂

这篇文章主要介绍了docker容器间的互联问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

docker容器间互联

单机部署的时候考虑,能不能使docker各个容器间互通呢。比如我的web应用容器可以和db容器间互通,而不是现在这样再web应用调用本机ip去访问。

网上查了一下还真有这种方法。

还有两种方法:

1、links

在容器启动时,启动命令中加入links指定链接的容器:

docker run -itd --name nginx-web02 --link nginx-web:nginx01 -p 81:81 sunmmi/nginx nginx

run容器nginx-web02时,link容器nginx-web,其中nginx-web:nginx01前面是链接哪个容器名,后面是对这个容器别名.

进入nginx-web02容器,查看hosts文件,nginx-web,nginx01已经增加到hosts文件中.

[root@37e693a5f7a3 /]# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  nginx01 7d89f9196f78 nginx-web
172.17.0.3  37e693a5f7a3

此时在容器1中就能通过别名直接Ping通容器2了。

测试:

[root@37e693a5f7a3 /]# ping nginx01
PING nginx01 (172.17.0.2) 56(84) bytes of data.
64 bytes from nginx01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from nginx01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.170 ms

2、network

第二种也是在容器启动时,启动命令中加入network指定局域网络:

首先创建一个新的 Docker 网络:

$ docker network create -d bridge my-net

运行一个容器并连接到新建的 my-net 网络

$ docker run -it --rm --name busybox1 --network my-net busybox sh

打开新的终端,再运行一个容器并加入到 my-net 网络

$ docker run -it --rm --name busybox2 --network my-net busybox sh

下面通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系。在 busybox1 容器输入以下命令

/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms

用 ping 来测试连接 busybox2 容器,它会解析成 172.19.0.3。同理在 busybox2 容器执行 ping busybox1,

/ # ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms

这样,busybox1 容器和 busybox2 容器建立了互联关系。

network 官方 docker-compose.yml ,替换links的方法:

network固定子网络Ip

适用于链接redis等需要固定ip的场景,需要设置两点1、容器的networks:ipv4_address,再单独配置networks:config:subnet,gateway,参照下面实例:

version: "3.9"
networks:
  loki:
    ipam:
      driver: default
      config:
      # 子网络
        - subnet: "172.22.0.0/24"
          gateway: 172.22.0.1
services:
  resty:
    image: beyond147896/resty:latest
    ports:
      - "80:80"
      - "443:443"
    networks:
      loki:
      	# 固定子网ip,网段必须在子网络172.22.*.*
        ipv4_address: 172.22.0.2
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      loki:
        # 固定子网ip,网段必须在子网络172.22.*.*
        ipv4_address: 172.22.0.99

在web应用的配置中也可以直接写上面配置的ipv4_address固定Ip连通。

如果首次启动出现报错,可能是docker-compose的版本不够高,升级版本后可能可以解决。

如果第二次启动出现报错,可能是网络占用,使用docker-compose up之后,docker-compose会创建一个名称为: {项目名}_{网络名} 的网络,一旦创建了这个网络,docker-compose 将永远不会删除它。

所以当修改了docker-compose.yaml文件后,第二次运行docker-compose up时,使用的还是之前创建的loki_loki网络。

解决方法

将之前创建的网络手动删除:

$ docker network rm loki_loki
$ docker-compose up

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文